关于TCP的序列号和确认号

关于TCP的序列号和确认号

TCP的序列号和确认号都是32位的正整数,其代表了数据在TCP数据流中的偏移字节位置。注意,这里序列号和确认号代表的是字节位置,在TCP概念中在TCP连接中传输的数据是字节流。数据在TCP层称为流(Stream),数据分组称为分段(Segment)。作为比较,数据在IP层称为Datagram,数据分组称为分片(Fragment),UDP 中分组称为Message。所以每个独立发送的TCP分组称为TCP Segment。
现代网卡一般支持TSO和MRO,TSO把来自操作系统内核的小的TCP Segments合并为大的TCP Segments发送出去,MRO把从线路接收到的小的TCP Segments合并为大的TCP Segments提交给操系统内核,在网卡上执行合并和分片工作,减轻CPU的工作量。

  • 客户端发出的第一个Segment(SYN Segment),seq为client_isn,ack为0

client_isn为初始化序列号(ISN),是随机生成的

  • 服务端发出的第一个Segment(SYN, ACK Segment),seq为server_isn,ack为client_isn+1

server_isn为初始化序列号(ISN),是随机生成的,ack为client_isn+1

对于后续的报文:
客户端和服务器seq和ack是各自独立的,seq和ack的计算规则为:
seq=last_send_seq+last_send_len
ack=last_receive_seq+last_receive_len,这里没有考虑报文乱序和延迟确认的问题
last_send_seq为上一次发送的TCP Segment序列号
last_send_len为上一次发送的TCP载荷长度
last_recive_seq为最后接收TCP Segment的seq
last_receive_len为最后接收TCP Segment的载荷长度
如果为ACK或FIN Segment载荷长度强制指定为1,其它情况按实际TCP载荷长度计算
TCP载荷长度 = IP报文总长度 – IP头部长度 – TCP头部长度
TCP Segment的Header Length字段是4个bit长度,每个单位代表4个字节,比如Header Length的值是5,则TCP Segment头长度就是20字节。

Views: 0