TCP 数据包序列号和应答号计算方法 - 数据传输过程
序号 | 方向 | seq | ack | 数据长度 | 数据包长度 |
23 | A->B | 40000 | 70000 |
1460 | 1514 |
24 | A<-B | 70000 |
40000+1514-54=41460 |
0 | 54 |
25 | A->B | 41460 | 70000+54-54=70000 | 1460 | 1514 |
26 | A<-B | 70000 | 41460+1514-54=42920 |
0 | 54 |
解释:
23:B接收到A发来的seq=40000,ack=70000,size=1514的数据包
24:于是B向A也发一个数据包,告诉A,你的上个包我收到了。A的seq就以它收到的数据包的ack填充,ack是它收到的数据包的seq加上数据包的大小(不包括:以太网协议头=14字节,IP头=20字节,TCP头=20字节),以证实B发过来的数据全收到了。
25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。
26:B->A这个正在发送的数据包的seq也以它收到的数据包的ack填充,ack 就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。通过tcpdump发现确认包ack,确认传输过程中最后字节长度。
参考:TCP-IP详解卷-基础知识 IP TCP UPD 协议
减去54的原因 ,以太网封装格式(链路层使用的是Ethernet II 格式,这个格式有14字节以太网首部+4字节以太网尾部):
应用数据=size-14-20-20=size-54。(假设IP首部和TCP首部都没有可选选项)
为什么不减去以太网尾部的4字节呢?
因为在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处 理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据