TCP

TCP/IP是一种网络通讯协议,而socket则是TCP/IP网络最为通用的API,即一种应用程序接口,称为套接字。TCP是面向连接的协议,在进行数据收发前必须连接,且在收发时必须保持该连接。在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。其中SYN(synchronous)表示要求建立连接,ACK(acknowledgement)表示应答,FIN(finish)表示要求关闭连接,PSH(push)表示有数据传输,RST(reset)表示连接重置,URG(urgent)表示紧急。

1. TCP的三次握手连接:

第一次握手:客户端发送SYN包(SYN = 1)到服务器,随机生成Sequence number = X,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包,必须确认客户的SYN(SYN = 1),同时自己也发送一个ACK包(ACK = X+1),即SYN+ACK包,同时随机生成一个Sequence number = Y,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN + ACK包,向服务器发送确认包ACK(ACK = Y+1),同时随机生成一个Sequence number = Z,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

其中握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

2. TCP的四次挥手断开连接

第一次挥手:主动方发送FIN + ACK包到被动方,随机生成Sequence number = X,并进入FIN_WAIT_1状态,等待被动方确认;

第二次挥手:被动方接收到主动方的FIN + ACK包后,并返回ACK(ACK = X + 1)包,并随机生成Sequence number = Z发送给主动方,并进入CLOSE_WAIT状态,此时主动方接收到信息后随即进入FIN_WAIT_2状态;

第三次挥手:被动方发送FIN+ACK(ack = X + 1)包给主动方,并随机生成Sequence number = Y,并进入LAST_ACK状态;

第四次挥手:主动方接收到被动方的FIN+ACK包以后,向被动方发送ACK(ack = Y+1)包,随即自身进入TIME_WAIT状态,被动方接收到ACK包后进入CLOSED状态,紧接着主动方等待2MSL后也进入CLOSED状态,至此连接断开。

UDP

UDP(User Datagram Protocol)用户数据报协议,它在OSI模型的传输层,OSI模型的传输层有UDP协议,TCP协议和刚开发出来的一种新的协议SCTP。如果网络中两个主机上的应用程序要相互通信,其一要知道彼此主机的IP,其二要知道主机中运行程序可监听的端口。因为同一主机上的程序使用网络是通过端口号来区分的。因此为了使用UDP,我们需要一对套接字地址:客户端套接字地址和服务器套接字地址。

UDP提供无连接服务。客户端向服务端发送数据时不必先建立连接。客户端创建一个套接字并向服务器发送一个数据报,然后客户端可以立即用这个套接字向另外一个服务器发送其它数据。不能确保UDP数据报最终到达目的地。UDP对接收的数据报不发生确认,发送端不知道数据是否被正确接收,也不会重发数据。UDP传输数据较TCP快,占用系统资源少。

TCP和UDP的区别

1. TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性。而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

2. 也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

3. 人们通常用电话连线来说明TCP协议,而UDP协议,则常常用邮递来做比喻。

TCP

UDP

是否连接

面向连接

面向非连接

传输可靠性

可靠

不可靠

应用场合

传输大量数据

少量数据

速度

TCP&UDP基础的更多相关文章

  1. 异常处理与网络基础中的tcp,udp协议

    # 异常处理: # 什么是异常?异常和错误的区别 # Error 语法错误 比较明显的错误 在编译代码阶段就能检测出来 # Iteration 异常 在执行代码的过程中引发的异常 # 异常发生之后的效 ...

  2. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  3. 网络基础--简单理解什么是DNS? TCP? UDP? Http? Socket?

    什么是IP 协议?  协议就是为了实现网络通信而创建的一系列规范.  通常我们的网络模型从上到下共分为4层: 应用层, 传输层, 网络层 和数据链路层. IP协议属于网络层协议,它精确定义了网络通信中 ...

  4. HP-SOCKET TCP/UDP通信框架库解析

    项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...

  5. 初入网络系列笔记(1)TCP/IP基础

    一.借鉴说明,本博文借鉴以下博文 1.BlueTzar,TCP/IP四层模型, http://www.cnblogs.com/BlueTzar/articles/811160.html 2.叶剑峰,漫 ...

  6. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  7. tcp/udp高并发和高吐吞性能测试工具

    在编写一个网络服务的时候都比较关心这个服务能达到多少并发连接,而在这连接的基础上又能达到一个怎样的交互能力.编写服务已经是一件很花力气的事情,而还要去编写一个能够体现结果的测试工具就更加消耗工作时间. ...

  8. TCP/IP基础知识

    TCP/IP基础知识 网络 TCP/IP 引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP ...

  9. Java 网络编程(二) 两类传输协议:TCP UDP

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951841.html 两类传输协议:TCP,UDP TCP TCP是Transfer C ...

随机推荐

  1. Mac下 Windows 7 虚拟机搭建SVN服务器的详细步骤(此方法同样适用于单纯的Windows系统搭建SVN)

    内容中包含 base64string 图片造成字符过多,拒绝显示

  2. 洛咕 P4131 [WC2005]友好的生物

    洛咕 P4131 [WC2005]友好的生物 首先可以发现\(C\)是没有用的,可以乘进所有的权值里面做 考虑没有最后一维的限制,那么两个生物的友好值就是 \(\sum_{i=1}^k|a_i-b_i ...

  3. JetBrains全家桶使用攻略

    JetBrains全家桶使用攻略 今天狠狠心某宝买了一个key,可以使用15款开发软件,在此进行记录. 全家桶链接:https://www.jetbrains.com/products.html?fr ...

  4. Jenkins部署资料

    http://www.cnblogs.com/gaohongchen01/p/5058928.html https://www.javacodegeeks.com/2015/04/jenkins-ho ...

  5. [转载]在Windows下为PHP5.6安装redis扩展和memcached扩展

    一.php安装redis扩展   1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本       2.根据PHP版本号,编译器版本号和CPU架构, 选择php_redis-2.2 ...

  6. 大数据中Hadoop集群搭建与配置

    前提环境是之前搭建的4台Linux虚拟机,详情参见 Linux集群搭建 该环境对应4台服务器,192.168.1.60.61.62.63,其中60为主机,其余为从机 软件版本选择: Java:JDK1 ...

  7. Python科学计算库-Numpy

    NumPy 是 Python 语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,也是学习 python 必学的一个库. 1. 读取文件 numpy.gen ...

  8. Linux(centos7)之更换安装python3(二)

    Linux不比window好安装python,折腾了好久,终于成功安装上了python,window上一个安装包完事,可惜Linux上python版本太低不好使,还要更换为3版本,百度了好久,教程上总 ...

  9. 软件RAID

    软件RAID也必须在多磁盘系统中才能实现.实现RAID1最少要拥有两块硬盘,而实现RAID5则最少要拥有三块硬盘.通常情况下,操作系统所在磁盘采用RAID1,而数据所在磁盘采用RAID5.   卷的类 ...

  10. 小刘的深度学习---Faster RCNN

    前言: 对于目标检测Faster RCNN有着广泛的应用,其性能更是远超传统的方法. 正文: R-CNN(第一个成功在目标检测上应用的深度学习的算法) 从名字上可以看出R-CNN是 Faster RC ...