站点图标 Linux-技术共享

如何计算TCP的payload数据大小

TCP/IP协议簇每一层协议的PDU有不同的叫法,应用层例如HTTP的PDU叫message、传输层例如TCP的PDU叫segment、网络层例如IP的PDU叫datagram、链路层的PDU叫frame。其中,segment的header结构,从wikipedia截图,如下:

从上图可以看出,header中没有标识TCP的payload数据大小的字段,只有一个用来存储header大小的Data offset。

再来看下IPv4的header结构,从wikipedia截图,如下:

其中IHL字段的全称是Internet Header Length,存储的是IPv4的header大小,其单位与TCP header的Data offset相同,都是32位的word即4个字节。

根据上面各层协议封装关系的简略图可知,只要知道IPv4 datagram的大小,减去两个header,便能得出TCP的payload数据大小。

IPv4 datagram的总字节数保存在Total Length字段中,所以可得最后的计算公式:

TCP payload = IP header Total Length - (IP header IHL + TCP header Data of
退出移动版