TCP报文结构
TCP报文由**首部(Header)和数据(Data)**两部分组成。首部包括固定部分(20字节)和可选选项(最多40字节),总长度最大为60字节。
1. 首部固定部分
-
源端口(16位)和目的端口(16位)
-
标识发送和接收的应用程序(如HTTP默认端口80)。
-
-
序列号(32位)
-
表示当前报文段数据部分的第一个字节的序号,确保数据按序传输。
-
-
确认号(32位)
-
期望收到的下一个字节的序号,表示接收方已正确接收之前的所有数据。
-
-
数据偏移(4位)
-
指示首部长度(以4字节为单位)。例如,值为
5
表示首部长度20字节。
-
-
保留字段(6位)
-
未使用,必须置0。
-
-
控制位(6位)
-
URG:紧急指针有效,优先处理紧急数据。
-
ACK:确认号有效(连接建立后通常为1)。
-
PSH:接收方应立即将数据推送给应用层。
-
RST:强制重置异常连接。
-
SYN:建立连接时同步序列号。
-
FIN:正常关闭连接。
-
-
窗口大小(16位)
-
接收方的可用缓冲区大小,用于流量控制(滑动窗口机制)。
-
-
校验和(16位)
-
计算包括伪首部(源/目的IP、协议类型、TCP长度)、TCP首部和数据,确保数据完整性。
-
-
紧急指针(16位)
-
当URG=1时有效,指向紧急数据的结束位置。
-
2. 选项部分(可变长度,最多40字节)
-
MSS(最大报文段长度):在三次握手时协商,避免IP分片。
-
窗口扩大因子:扩展窗口大小(原16位窗口最大为65535)。
-
时间戳:计算往返时间(RTT)和防止序列号回绕(PAWS机制)。
-
SACK(选择性确认):允许接收方报告非连续接收的数据块,提升重传效率。
3. 填充字段
-
确保首部长度是4字节的倍数。
4. 数据部分
-
上层协议(如HTTP、FTP)传递的数据,长度由MSS和窗口大小共同决定。
TCP的特点
- 面向连接:TCP发送数据前需要通过三次握手建立全双工通信,结束数据发送后通过四次挥手关闭连接
- 可靠性:TCP通过确认和重传、快速重传、拥塞控制、流量控制、有序性、超时重传等机制确保数据可靠传输
- 确认和重传:接收方收到数据后会发送确认ACK给发送方,若发送方经过超时时间未收到ACK,则会重传
- 流量控制:接收方会通过滑动窗口(循环数组,用三个指针给他分区)的机制告诉发送方可接收数据的大小,避免发送方发送大量数据拥塞在接收方的缓冲区
- 拥塞控制:发送方根据网络的拥塞情况动态调整发送速率,避免造成网络拥塞
- 有序性:接收方根据TCP头部的序列号重新对数据进行排序
- 头部开销大:TCP报文头部(源/目的端口+**序列号/确认号**+首部长度+**标志位(SYN/ACK/FIN/RST)**+**窗口大小(RWND)**+校验和),增加传输开销
- 源/目的端口 标识了应用进程;序列号和确认号可以进行确认和重传,同时保证数据有序;
- 标志位(指示TCP会话期间的特定状态):**SYN-同步,ACK-确认数据包接收,FIN-结束**,RST-重置TCP连接,URG-紧急数据,PSH-立即推送数据,
- 全双工通信:TCP协议允许通信双方同时进行数据的发送和接收
TCP超时重传
- RTT(Round-Trip Time)往返时延:数据包在网络中的往返时延(网络波动造成RTT**动态变化**)
- RTO(Retransmission Timeout)超时重传时间:RTO应略大于RTT。太大会降低网络的传输效率;小于RTT则会造成不必要的超时重传,增大网络负荷
- 发送方在RTO内未收到ACK,说明网络严重拥塞,发送方重置CWND(拥塞窗口)进行**慢启动**,逐步增加发送量,降低网络过载风险
- 拥塞窗口CWND :发送方维护的变量,初始值默认为1 MSS(1460 Byte)
- 慢启动阈值_ssthresh:窗口增长模式的切换点;初始值较高(如接收方通告窗口大小)发生拥塞时动态调整
- 慢启动算法流程:
- 初始化阶段:TCP连接建立后/超时重传后,set CWND= 1 MSS,ssthresh初始为较大值
- 指数增长阶段:每收到一个和ack,cwnd增加1MSS(每个RTT内,CWND翻倍):
- 假设RTT固定100ms,初始CWND= 1 MSS
- 第0ms,发送一个报文 cwnd =1
- 第100ms:收到ack,cwnd=2(第100-200ms 发送2个报文)
- 第200ms:收到2个ack,每个ack触发cwnd+1, cwnd=4(第200-300ms 发送四个报文)
- 第300ms:收到4个ack,cwnd=8;
- 切换至**拥塞避免**:<u>*cwnd >= ssthresh*</u> 时,结束慢启动进入**线性增长**的拥塞避免阶段(每RTT,CWND增长1 MSS)
- 拥塞处理**:
- 超时丢包:严重拥塞,重置ssthresh=MAX(CWND/2,2 MSS),CWND = 1 MSS,重新***慢启动***
- 快速重传/恢复:(重复ACK触发)调整ssthresh= CWND/2 ,CWND=ssthresh+3(3个重复的ACK),直接进入***拥塞避免***
TCP快速重传
发送方连续收到**三个重复ACK**(RFC经验)时,说明网络单包丢失,发送方CWND减半,进行快速重传