TCP段结构
- 来源连接端口(16位长): 源端口号16 bit
- 目的连接端口(16位长): 目的端口号
- 序列号(seq,32位长): 指segment中地一个字节的编码。建立连接时,双方随机选择序列号。
- 确认号(ack,32位长): 希望接收的下一个字节的序列号。累计确认机制,该确认字节号前的数据均一正确接收。
- 数据偏移(4位长): 以4字节为单位计算出的数据段开始地址的偏移值,由于有内存对齐,单位为32 bit。最大15 * 32 / 8 = 60 byte。
- 保留(3比特长): 保留位,留待以后使用,全部为0。
- 标志符(9比特长):
- NS: 拥塞控制随机和(ECN Nonce Sum),用于防止TCP发送者的数据包标记被意外或恶意改动。
- CWR(Congestion Window Reduced): 减少拥塞窗口,接受方标志位ECE设置后,设置CWR标志位,以告知对方,已接受到拥塞通知。
- ECE(Explicit Congestion Notification): 显式拥塞通知, 接受方检测到网络拥塞后,设置ECN-Echo标志位来指示拥塞。
- URG: 为1表示高优先级数据包,紧急指针字段有效。
- ACK: 为1表示确认号字段有效。
- PSH: 为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
- RST: 为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
- SYN: 为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步。
- FIN: 为1表示发送方没有数据要传输了,要求释放连接。
- 窗口(WIN,16位长): 表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制。
- 校验和(Checksum,16位长): 对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
- 紧急指针(16位长): 本报文段中的紧急数据的最后一个字节的序号。
- 选项字段(最多40字节): 每个选项的开始是1字节的kind字段,说明选项的类型
- 0:选项表结束(1字节)
- 1:无操作(1字节)用于选项字段之间的字边界对齐。
- 2:最大报文段长度(4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU(MTU最大长度为1518字节,最短为64字节),从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
- 3:窗口扩大因子(4字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
- 4:sackOK—发送端支持并同意使用SACK选项。
- 5:SACK实际工作的选项。
- 8:时间戳(10字节,TCP Timestamps Option,TSopt)
- 发送端的时间戳(Timestamp Value field,TSval,4字节)
- 时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)