TCP与UDP 电脑版发表于:2022/6/5 14:35 ![](https://img.tnblog.net/arcimg/hb/ceb9623e11bd4b1abddb6c49af42bcca.jpeg) >#TCP与UDP [TOC] 简介 ------------ tn2>TCP和UDP协议是TCP/IP协议的核心。 TCP 传输协议:TCP 协议是一TCP (Transmission Control Protocol)和 UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数 据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它 是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复 功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。 <br/> 在TCP/IP网络体系结构中,TCP(传输控制协议,Transport Control Protocol、UDP(用户数据报协议,User Data Protocol)是传输层最重要的两种协议,为上层用户提供级别的通信可靠性。 >### TCP简介 tn2>传输控制协议(TCP):TCP(传输控制协议)定义了两台计算机之间进行可靠的传输而交换的数据和确认信息 的格式,以及计算机为了确保数据的正确到达而采取的措施。协议规定了TCP软件怎样识别给定计算机上的多个 目的进程如何对分组重复这类差错进行恢复。协议还规定了两台计算机如何初始化一个TCP数据流传输以及如何 结束这一传输。TCP最大的特点就是提供的是面向连接、可靠的字节流服务。 >### UDP简介 tn2>用户数据报协议(UDP):UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向 连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是 把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱 序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速 度很快。 >### 二者区别 tn2>TCP/IP 和UDP最大的区别就是:TCP/IP是面向连接的,UDP是无连接的。<br/> 在实际的使用中,TCP主要应用于文件传输精确性相对要求较高且不是很紧急的情景,比如电子邮件、远程登录 等。有时在这些应用场景下即使丢失一两个字节也会造成不可挽回的错误,所以这些场景中一般都使用TCP传输 协议。由于UDP可以提高传输效率,所以UDP被广泛应用于数据量大且精确性要求不高的数据传输 TCP格式 ------------ tn2>关于TCP的包格式如下图所示。 ![](https://img.tnblog.net/arcimg/hb/8c3e67a814a44e0480818e4011803ef8.png) tn2>TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为 端口号拼接到IP地址即构成了套接字。例如,若IP地址为192.168.1.16 而端口号为80,那么得到的套接字为 192.168.1.16:80。 ![](https://img.tnblog.net/arcimg/hb/59d3b0f486084717bcc37502f763e7dd.png) 三握四挥 ------------ >### 三次握手 tn2>当一个客户端要与服务器建立TCP通信时,它们的过程如下图所示: ![](https://img.tnblog.net/arcimg/hb/bffc2f7b4398477f98de3118a5cb73a3.png) tn2>客户端发送`Seq=0`请求服务器连接,服务器返回`Ack=1 Seq=0`表示对客户端说同意与你的连接,客户端向服务器发起`Ack=1 Seq=1`的包表示我也准备好了。大致的过程如下图抓的包所示。(`ping`与`tcpdump`便可以抓取) ![](https://img.tnblog.net/arcimg/hb/a0934188218847aa9ac0ae4b01a7d042.png) >### 四次挥手 tn2>当一个客户端要与服务器断开链接时,过程如下图所示: ![](https://img.tnblog.net/arcimg/hb/0202fbdedd1c4f92b313be3b473584f0.png) tn2>客户端发送`FIN ACK`断开与服务器的连接,服务器发送`ack=X+1`和`FIN ack=X+1`表示同意客户端端口连接的请求,最后客户端发送`ack=Y+1 Seq=X+1`到服务器端表示真正意义上的断开。 ![](https://img.tnblog.net/arcimg/hb/5f117b2e1986473fa4e91715bca4207a.png) TCP流控 ------------ >### 简介 tn2>接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区打满。这个时候如果继续发送数据,就会 导致丢包等一系列连锁反应。 所以 TCP 支持根据接收端能力来决定发送端的发送速度。这个机制叫做流控制。<br/> 具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。 该大小限度就被称作窗口大小。窗口大小的值就是由接收端主机决定的。 在 TCP 报文头部,有一个 16 比特的窗口字段,用来表示接受方的缓冲区大小,接收主机将自己可以接收的缓冲区 大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。不过,接收端的这个缓冲区一旦 面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说, 发送端主机会根据接收端主机的指示,对发送数据的量进行控制。 TCP 的流量控制由连接的每一端通过声明的窗口 大小来提供 。窗口大小为字节数 ,起始于确认序号字段指明的值,这个值是接收端期望接收的字节。窗口大小是一 个 16 bit 字段,因而窗口大小最大为 65535 字节。 TCP 基于通告窗口大小的机制,运行发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个 分组就停下来等待确认,因此该协议可以加速数据的传输。TCP 传输速率和窗口大小成正相关,在某些情况下,提 高窗口大小能够提高传输速率。 但 TCP 窗口大小只有 16bit,最大表示 65535 字节,对当前千兆接口已经是标配, 在数据中心对服务器上开始部署 10G 接口的现实情况下,65535 字节的窗口显然是不够的。 选项的第一个字段kind说明选项的类型。有的TCP选项没有后面两个字段,仅包含1字节的kind字段。第二个字段 length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段info(如果 有的话)是选项的具体信息。常见的TCP选项有7种。 kind=3是窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。在TCP的头 部中,接收通告窗口大小是用16位表示的,故最大为65?535字节,但实际上TCP模块允许的接收通告窗口大小远不 止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。假设TCP头部中的接收通告窗口大小是N, 窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N乘2M,或者说N左移M位。注意,M的 取值范围是0~14。我们可通过修改/proc/sys/net/ipv4/tcp_window_scaling内核变量来启用或关闭窗口扩大因子选项。 ![](https://img.tnblog.net/arcimg/hb/ff2e5148497444ac8678bcf9d0325ad0.png) UDP包格式 ------------ ![](https://img.tnblog.net/arcimg/hb/0f567ed450a94c6eb17a6b29b803073d.png) tn2>UDP传输协议是一种不可靠的、面向无连接、可以实现多对一、一对多和一对一连接的通信协议。UDP在传输数据前既不要建立通道,在数据传输完毕后也不需要将通道关闭。只要客户端给服务端发送一个请求,服务端就会一次性地把所有数据发送完毕。UDP在传输数据时不会对数据的完整性进行验证,在数据丢失或数据出错时也不会要求重新传输,因此也节省了很多用于验证数据包的时间,所以以UDP建立的连接的延迟会比以TCP建立的连接的延迟更低。UDP不会根据当前的网络情况来控制数据的发送速度,因此无论网络情况是好是坏,服务端都会以恒定的速率发送数据。虽然这样有时会造成数据的丢失与损坏,但是这一点对于一些实时应用来说是十分重要的。基于以上三点,UDP在数据传输方面速度更快,延迟更低,实时性更好,因此被广泛地用于通信领域和视频网站当中。