目录
UDP协议
UDP协议段格式

16位UDP长度:UDP数据报的总长度,包括头部和数据部分。最小值为8字节(仅头部)
16位UDP校验和:用于检测UDP数据报在传输过程中是否发生错误。如果校验和计算结果为0,则表示数据正确
如果校验和出错,就会直接丢弃
UDP的特点
- 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接
- 不可靠:没有确认机制,也没有重传机制,若是出错无法发到对方UDP协议层也不会给应用层返回任何错误信息
- 面向数据报:不能够灵活的控制读写数据的次数和数量
UDP缓冲区
UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作
UDP具有接受缓冲区,但是这个缓冲区不能保证UDP报的顺序和发送UDP报的顺序一致。如果缓冲区满再到达的UDP数据就会被丢弃
TCP协议
TCP协议段格式

序列号:用于标识TCP数据段的顺序。发送方为每个字节分配一个序列号,接收方通过序列号来重组数据。
确认序列号:接收方期望收到的下一个数据段的序列号。只有在ACK标志位为1时,确认号才有效。(若接收方收到1000-1999所有字节,那么会发送确认号为2000,代表期望收到序列号为2000的下一个字节)
首部长度:表示TCP头部的长度,以32位字为单位。最小值为5(20字节),最大值为15(60字节)。
保留:保留字段,必须为0。
标志位:
-
URG(紧急指针有效):如果为1,表示紧急指针字段有效。
-
ACK(确认号有效):如果为1,表示确认号字段有效。
-
PSH(推送):如果为1,表示接收方应尽快将数据推送给上层应用。
-
RST(重置连接):如果为1,表示连接出现严重错误,需要重置。
-
SYN(同步序列号):用于建立连接,表示请求建立连接。
-
FIN(结束连接):用于关闭连接,表示请求关闭连接。
窗口大小:接收方的接收窗口大小,用于流量控制。表示接收方能够接收的最大字节数。(为了防止对方发送超过接收方能够接受的数据大小)
校验和:用于检测TCP头部和数据部分在传输过程中是否发生错误。
紧急指针:指向紧急数据的指针,只有在URG标志位为1时才有效。
选项:用于扩展TCP的功能,提供额外的控制信息。选项字段的长度是可变的,通常用于协商连接参数、优化性能或实现其他高级功能。
确认应答机制
TCP的确认应答机制是TCP实现可靠传输的核心机制之一,通过确认号和序列号来确保数据的完整性和顺序性。
具体步骤:
(1)发送方发送数据
-
发送方将数据封装成TCP数据段,并为每个字节分配一个序列号。
-
发送方将数据段发送到网络中。
(2)接收方接收数据
-
接收方收到数据段后,检查数据段的序列号是否连续。
-
如果数据段的序列号是连续的,接收方将数据段中的数据存储到接收缓冲区中。
-
如果数据段的序列号不连续,接收方会发送一个确认号,告诉发送方它期望收到的下一个数据段的序列号。
(3)接收方发送确认应答
-
接收方发送一个确认应答报文,其中包含确认号。
-
确认号是接收方期望收到的下一个字节的序列号。
(4)发送方接收确认应答
-
发送方收到确认应答后,根据确认号判断数据是否被成功接收。
-
如果确认号表明数据已被成功接收,发送方可以继续发送后续的数据段。
-
如果发送方在超时时间内没有收到确认应答,或者确认号表明某些数据段丢失,发送方会重新发送丢失的数据段。
超时重传机制
当发送方发送一个数据段后,如果在规定的时间内没有收到接收方的确认应答,发送方会认为该数据段可能丢失或在网络中延迟过久,从而重新发送该数据段。
具体步骤:
(1)发送数据段
- 发送方发送一个数据段,并启动一个定时器,等待接收方的确认应答。
超时时间的设定:
Linux中(Unix和Windows),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍
如果重发一次后仍然得不到应答,等待2*500ms后再进行重传,如果仍然得不到应答,则 等待4*500ms,以指数形式递增
累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接
(2)等待确认应答
-
发送方等待接收方的确认应答。
-
如果在超时时间内没有收到确认应答,发送方认为数据段可能丢失或延迟过久,进入下一步。
(3)重传数据段
-
发送方重新发送丢失的数据段,并重新启动定时器。
-
每次重传时,超时时间会根据一定的策略增加,以避免频繁重传对网络造成过大压力。
连接管理机制
在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接

连接建立(三次握手)
- 第一次握手:SYN(同步序列号)
客户端:客户端向服务器发送一个带有SYN标志的数据段,表示请求建立。数据段中的序列号字段设置为一个随机值,称为初始序列号,连接确认号字段为0。
- 第二次握手:SYN-ACK(同步序列号 + 确认号)
服务器:服务器收到客户端的SYN请求后,会发送一个带有SYN和ACK标志的数据段作为响应,服务器在响应中设置自己的初始序列号,并确认客户端的序列号,确认号字段设置为客户端的初始序列号加1。
- 第三次握手:ACK(确认号)
客户端:客户端收到服务器的SYN-ACK响应后,发送一个带有ACK标志的数据段,确认服务器的序列号,确认号字段设置为服务器的初始序列号加1。
此时,连接建立完成,双方可以开始数据传输
连接关闭(四次挥手)
- 第一次挥手:FIN(结束连接)
客户端:客户端完成数据发送后,发送一个带有FIN标志的数据段,表示请求关闭连接。客户端进入FIN_WAIT_1状态,等待服务器的确认。
- 第二次挥手:ACK(确认号)
服务器:服务器收到客户端的FIN请求后,发送一个带有ACK标志的数据段作为响应,确认号字段设置为客户端的序列号加1。服务器进入CLOSE_WAIT 状态,等待应用程序关闭连接,客户端则进入FIN_WAIT_2状态。
- 第三次挥手:FIN(结束连接)
服务器:服务器完成数据发送后,发送一个带有FIN标志的数据段,表示请求关闭连接。随后进入LAST_ACK状态,等待客户端的确认。
- 第四次挥手:ACK(确认号)
客户端:客户端收到服务器的FIN请求后,发送一个带有ACK标志的数据段作为响应,确认号字段设置为服务器的序列号加1。客户端进入TIME_WAIT状态,等待2倍的报文段最大生存时间(2MSL),以确保最后一个ACK被服务器接收
MSL在RFC1122中规定为两分钟,但是各操作系统的实现不同,在Centos7上默认配置的值是60s
之后,客户端关闭连接
滑动窗口
滑动窗口是一种用于控制数据传输量的机制。它通过一个"窗口"来表示接收方能够接收但尚未确认的数据量。
发送窗口:
发送方维护一个窗口,表示它可以发送但尚未收到确认的数据量,发送窗口的大小决定了发送方可以连续发送多少数据而无需等待确认。
接收窗口:
接收方维护一个窗口,表示它可以接收但尚未处理的数据量,接收窗口的大小由接收方根据其缓冲区的可用空间动态调整,并通过确认应答报文中的窗口字段通知发送方。
工作原理:
-
接收方:接收方在收到数据后,会发送一个确认应答,其中包含确认号和窗口大小,窗口大小表示接收方当前能够接收的数据量。
-
发送方:发送方根据接收方的ACK中的窗口大小调整自己的发送窗口,如果接收方的窗口大小增加,发送方可以发送更多的数据,如果窗口大小减少,发送方需要减少未确认数据的量。
-
动态调整:滑动窗口是动态的,随着数据的发送和确认,窗口会向前滑动,每当发送方收到一个ACK,它会根据ACK中的窗口大小调整自己的发送窗口,并继续发送数据。

流量控制
流量控制用于确保发送方不会发送超过接收方处理能力的数据量。主要目的是防止接收方缓冲区溢出,从而避免数据丢失。
工作原理:
-
接收方:接收方将自己可以接收的缓冲区大小放入TCP首部的"窗口大小"字段,通过ACK端通知发送端,窗口大小字段越大, 说明网络的吞吐量越高。一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端。
-
发送方:发送方接受到这个窗口之后, 就会减慢自己的发送速度
如果接收端缓冲区满了, 就会将窗口置为0,这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端
拥塞控制
拥塞控制是用于避免网络拥塞并提高数据传输效率的关键机制。通过动态调整发送方的发送速率,确保网络不会因为过多的数据流量而过载。
工作原理:
拥塞控制的核心是通过拥塞窗口来控制发送方可以发送的数据量。拥塞窗口的大小会根据网络的拥塞情况动态调整。
(1)慢启动(快速增加发送速率,直到检测到网络拥塞)
-
在连接建立初期,拥塞窗口以指数速度增长。
-
当拥塞窗口达到一个阈值(ssthresh)时,进入拥塞避免阶段
(2)拥塞避免(缓慢增加发送速率,避免网络拥塞)
-
拥塞窗口以线性速度增长。
-
每经过一个往返时间(RTT),拥塞窗口增加1个MSS。
(3)快速重传(快速检测丢包并重传丢失的数据段)
-
如果发送方收到三个重复的ACK(即三个相同的确认号),它会认为某个数据段可能丢失。
-
发送方立即重传丢失的数据段。
(4)快速恢复(在重传后调整拥塞窗口,恢复发送速率)
-
当发送方触发快速重传后,进入快速恢复阶段。
-
设置阈值(ssthresh)为当前拥塞窗口的一半。
-
将拥塞窗口设置为阈值大小,并进入拥塞避免阶段。

延迟应答
延迟应答是一种优化机制,用于减少确认应答报文的数量,从而提高网络效率。
延迟应答允许接收方在一定时间内延迟发送ACK,而不是立即对每个接收到的数据段发送确认。这种机制在某些情况下可以显著减少网络流量,尤其是在接收方频繁接收数据时。
具体实现:
(1)等待时间
-
接收方在收到数据段后,会等待一个固定的时间(通常为200毫秒)再发送ACK。
-
如果在这段时间内接收到更多的数据段,接收方可以将多个ACK合并为一个。
(2)数据量阈值
- 如果接收方在等待时间内接收到足够多的数据,它会立即发送ACK,而不是等待固定时间。(这种机制确保了即使在高流量情况下,ACK也不会延迟过久)
(3)最大延迟时间
-
为了防止ACK延迟过久,TCP协议规定了最大延迟时间(通常为500毫秒)。
-
如果接收方在最大延迟时间内没有发送ACK,它必须发送一个ACK,即使没有收到更多的数据段。
捎带应答
捎带应答是一种优化机制,用于减少网络中的报文数量,提高通信效率。
捎带应答的核心思想是将确认应答与数据段一起发送,而不是单独发送一个ACK报文。这样可以减少网络流量,同时提高协议的效率。
工作原理:
-
接收方:接收方收到发送方发送的数据段,检查数据段的序列号,确认数据的完整性和顺序。并准备好发送自己的数据段,在发送数据段时在TCP头部中包含一个ACK字段,确认之前接收到的数据。
-
发送方:发送方收到接收方发送的数据段,检查TCP头部中的ACK字段,确认接收方已经收到的数据,根据ACK字段更新自己的发送窗口,继续发送后续数据。
完