一.TCP数据报格式
- 源端口号(Source Port):16位,表示发送方的端口号。
- 目标端口号(Destination Port):16位,表示接收方的端口号。
- 序列号(Sequence Number):32位,表示发送的第一个字节的序列号。
- 确认号(Acknowledgment Number):32位,表示接收方期望接收到的下一个字节的序列号。
- 数据偏移(Data Offset):4位,表示TCP头部的长度,以4字节为单位。
- 保留(Reserved):6位,保留字段,暂未使用。
- 控制位(Control Bits):6位,包括URG、ACK、PSH、RST、SYN、FIN等控制标志。
- 窗口大小(Window Size):16位,表示发送方的接收窗口大小,用于流量控制。
- 校验和(Checksum):16位,用于检验TCP头部和数据的完整性。
- 紧急指针(Urgent Pointer):16位,表示紧急数据的末尾字节的偏移量。
- 选项(Options):可选字段,用于提供额外的功能和控制。
- 填充(Padding):用于填充TCP头部使其对齐到32位。
二.TCP通信时序
三次握手
-
第一次握手:客户端发送一个带有SYN=1(同步)标志位、序列号Seq=X的数据包给服务器端,客户端进入SYN_SENT状态。
- SYN=1
- ACK=0
- Seq=X
- Ack=0
-
第二次握手:服务器端收到客户端的请求后,会发送一个带有SYN=1、ACK=1(确认)标志位、序列号Seq=Y、确认号Ack=X+1的数据包给客户端,服务器端进入SYN_RECEIVED状态。
- SYN=1
- ACK=1
- Seq=Y
- Ack=X+1
-
第三次握手:客户端收到服务器端的确认后,会发送一个带有SYN=0、ACK=1的数据包给服务器端,序列号Seq=X+1、确认号Ack=Y+1。
- SYN=0
- ACK=1
- Seq=X+1
- Ack=Y+1
三次握手完成后,TCP连接建立成功,双方可以开始进行数据传输。每次握手中的SYN和ACK标志位所代表的值如上所示。请注意,初始的序列号是随机选择的,并非写死的数值。
通信
此时,连接已经建立,双方可以通过该连接进行通信。发送方将数据封装在TCP报文段中,并通过已建立的连接发送给接收方。报文段的标志位和字段如下:
- SYN=0
- ACK=1
- 序列号(Seq):发送方当前的序列号
- 确认号(Ack):接收方期望接收到的下一个序列号
接收方收到数据后,发送一个带有确认标志的ACK报文段给发送方,确认已接收到的数据。报文段的标志位和字段如下:
- SYN=0
- ACK=1
- 序列号(Seq):接收方期望接收的下一个序列号
- 确认号(Ack):发送方已经成功接收的最后一个序列号加1
通过以上步骤,发送方和接收方可以进行可靠的数据传输和通信。
四次挥手 四次挥手是指在TCP连接断开时的通信过程,涉及到以下步骤:
-
发送方发送一个带有FIN标志的报文段给接收方,表示发送方没有数据需要发送了,希望关闭连接。报文段的标志位和字段如下:
- FIN=1(表示不再发送数据)
- ACK=1(表示确认字段有效)
- 序列号(Seq):发送方当前的序列号
- 确认号(Ack):接收方期望接收的下一个序列号
-
接收方收到FIN报文段后,发送一个带有确认标志的ACK报文段给发送方,表示接收到发送方的关闭请求。报文段的标志位和字段如下:
- FIN=0(表示没有数据要发送)
- ACK=1(表示确认字段有效)
- 序列号(Seq):接收方当前的序列号
- 确认号(Ack):发送方的序列号加1
-
当接收方确认完所有已接收到的数据后(可能还有未接收到的数据),发送一个带有FIN标志的报文段给发送方,表示接收方也准备关闭连接。报文段的标志位和字段如下:
- FIN=1(表示不再发送数据)
- ACK=1(表示确认字段有效)
- 序列号(Seq):接收方当前的序列号
- 确认号(Ack):发送方的序列号加1
-
发送方收到接收方的FIN报文段后,发送一个带有确认标志的ACK报文段给接收方,表示已经收到接收方的关闭请求。报文段的标志位和字段如下:
- FIN=0(表示没有数据要发送)
- ACK=1(表示确认字段有效)
- 序列号(Seq):发送方当前的序列号
- 确认号(Ack):接收方的序列号加1
随后,连接就会完全关闭,双方都无法再发送数据。四次挥手的过程是为了确保双方都关闭了连接,并且在关闭之前,已经完成了全部的数据传输和确认。
滑动窗口
TCP由于存在确认应答机制,在一方发出一条消息以后,另一方要发送ACK表明自己收到消息。如果按照下面这种形式,每次收到ACK才发出下一条消息,这种一发一收的效率太低。但是如果客户端不急着接收ACK,可以利用等待ACK的空挡直接发送下一批数据,这样就可以做到短时间内发送多批数据。这就是滑动窗口的基本思想。
三.特殊机制
TCP(传输控制协议)作为一种可靠的传输协议,具有以下一些特殊的机制:
-
三次握手和四次挥手:TCP建立和终止连接时使用的握手和挥手过程。三次握手用于建立连接,四次挥手用于终止连接,以确保通信的可靠性和完整性。
-
滑动窗口:TCP使用滑动窗口机制进行流量控制。发送方和接收方通过动态调整窗口大小来控制数据的发送速率,以避免拥塞和数据的丢失。
-
快速重传:当接收方接收到重复的确认信息时,发送方会快速重传丢失的数据段,而不等待超时定时器触发。这可以加快丢失数据的恢复速度,提高传输效率。
-
拥塞控制:TCP使用拥塞控制机制来适应网络的拥塞情况。通过动态调整发送速率和窗口大小,TCP可以根据网络拥塞程度来控制数据的发送,以避免拥塞崩溃和网络资源的浪费。
-
选择确认(Selective Acknowledgment, SACK):TCP可以使用SACK选项来指示接收方成功接收到的非连续数据段,从而使发送方知道哪些数据需要被重传,提高了数据传输的效率。
-
超时重传:TCP可以使用延迟确认机制来减少确认信息的发送次数。接收方可以等待一段时间,将多个确认信息一起发送,从而降低网络传输开销。
快速重传
快速重传(Fast Retransmit)是TCP协议中一种用于快速检测和修复丢失数据的机制。当接收方收到一个已失序的数据段时,它会发送重复确认(Duplicate Acknowledgment)给发送方,表示接收方已经收到了连续的数据段中的最后一个。如果发送方连续收到接收方的三个重复确认,它就会判断到达该数据段之前的数据段已经丢失,紧接着会立即重传这个数据段,而不必等待超时定时器触发。
快速重传机制的过程如下:
- 发送方发送一系列的数据段给接收方,并等待接收方发送确认信息。
- 接收方收到数据段后,按序存储并发送确认信息。
- 如果接收方收到一个已失序的数据段,它会发送一个重复确认信息给发送方,表示连续接收到的最后一个数据段的序号。
- 发送方收到重复确认信息后,判断之前的数据段已经丢失。
- 发送方会立即重传丢失的数据段,而不必等待超时定时器的触发。
- 重传的数据段到达接收方后,正常处理。
快速重传机制通过监听连续的重复确认信息来尽早发现丢失的数据段,并快速进行重传,避免等待超时定时器的延迟。这样可以更快地修复丢失的数据段,减少数据传输时延,并提高整体的传输效率和数据可靠性。