TCP数据报丢失原因(介绍校验和的计算)

数据报丢失的原因

  • 交换机或路由器过载使TCP包或确认包丢失;
  • 接收端对TCP包的确认速度慢,致使发送端超时重发;
  • 接收端缓存溢出;
  • TCP数据包在传输过程中丢失或损坏;
  • 发送端与接收端之间的距离太远或传输速度太慢

如何检验TCP报文段是否损坏

TCP报文结构中有一个校验和字段,我们在生成一个TCP报文的时候,需要通过一定的方法计算出该报文校验和字段的值,它的方法如下:

  • 首先,我们要加入12字节的伪报文到TCP报文段的头部
  • 把校验和字段置为0;
  • 把整个TCP数据报(包括伪报头+TCP报文首部+数据)所有位划分为16位(2字节)的字
  • 把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C
  • 将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和。并且把加入的伪报头删除。

什么是伪报头

伪报头包含IP首部一些字段。其目的是让TCP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。计算完校验和后,要把伪报头删除
image

如何使用校验和,判断报文是否损坏

在接收端,同样是为TCP报文段加入伪报头。然后,把整个TCP数据报(包括伪报头+TCP报文首部+数据)所有位划分为16位(2字节)的字。把所有16位的字相加,如果得到的16位二进制数为全1,说明没有出错。只要这中间出现一个0,就说明TCP报文段被损坏了,则它会被丢弃。

总结

这篇博客主要介绍TCP报文丢失的原因以及报文是否被损坏的检测方法。如果还是不明白如何计算校验和,可以查看《计算机网络-自顶向下》的135页的UDP校验和的计算。UDP的校验和和TCP的校验和计算是一模一样的,原理也是一模一样的。