tcp/ip中的伪头部pseudo header

目录

      • 目录
  • tcpip中的伪头部pseudo header
    • pseudo header的定义
    • pseudo header的作用
    • pseudo header的一些其它野史

tcp/ip中的伪头部pseudo header

pseudo header的定义

 在RFC中对pseudo header的定义如下:

This pseudo header contains the Source Address, the Destination Address, the Protocol, and TCP length.
This gives the TCP protection against misrouted segments. This information is carried in the Internet Protocol and is transferred across the TCP/Network interface in the arguments or results of calls by the TCP on the IP.
+——–+——–+——–+——–+
|     Source Address   |
+——–+——–+——–+——–+
|    Destination Address   |
+——–+——–+——–+——–+
| zero   |   PTCL |   TCP Length |
+——–+——–+——–+——–+
The TCP Length is the TCP header length plus the data length in octets (this is not an explicitly transmitted quantity, but is computed), and it does not count the 12 octets of the pseudo header.

 注意一点的是pseudo header中的长度字段不要包含pseudo header本身的长度

pseudo header的作用

 上文的定义中提到了pseudo header的作用: protection against misrouted segments,翻译一下就是避免协议栈接收到不“真正“属于自己的错误数据报。
 首先我们得了解一下pseudo header在协议栈中是如何使用的,在发送每一个TCP/UDP数据报的时候会填充pseudo header结构体,然后再和TCP头一起参与到检验码的计算中,在接收端会对收到的数据报进行校验码的验证,具体的参考:伪头部。
 乍一看这个解释觉得挺好理解的,但是稍微费点脑细胞一想,好像这个解释不太对啊!按照协议栈的处理数据报流程肯定是要先经过IP层的处理过滤掉不属于自己的IP数据报后才接着往上层处理的,怎么到了上层(TCP、UDP)还需要校验数据报是否属于自己呢?
 Internet中的数据报会在传输过程中经过多跳(hop)才会到达最终的目的地址,在中间的任何一跳都可能会存在软件/硬件的错误,导致本来应该到达X的数据报到达了Y(修改了数据报中的dst address和IP层的checksum),这样的数据报可以顺利的逃过IP层的校验到达上层TCP/UDP。这个时候pseudo header就发挥它的作用了,通过计算数据报的校验码就能发现这是一个错误的数据报,它并是“真正“的属于我。
 我能说我这个人比较喜欢瞎想吗?我怎么觉得上面的这个解释好像还是有点不太好理解了,既然我能修改IP层的数据那么我同样可以修改TCP/UDP层的数据啊,这样我把TCP/UDP中的校验码checksum重新计算修改成“正确“的值,这样这个数据报不就可以逃过IP层、TCP层的校验了吗?
 是的,这样修改过的数据报是完全“正确“的,目的协议栈会认为这个数据报是合法的。也就是说pseudo header只能防“君子“不能防“小人“,pseudo header主要是为了修正中间网络设备的错误路由,因为中间路由设备一般都只会操作IP层不会操作TCP/UDP层,所以也就不会错误的修改TCP/UDP的checksum了。

pseudo header的一些其它“野史“

 上文已经说过了pseudo header的官方作用,那么下面我说说我所知道的pseudo header的一些其它的非官方的作用。
 话说当年TCP/IP协议有一个比较“宏伟“的想法,就是端到端的加密,通过加密算法把TCP/IP协议中重要的一些数据选项进行加密,这样可以保证数据的完整性,把源IP、目的IP等重要的数据选项组合到一起(也就是pseudo header)计算出来一个校验码,然后对这个校验码加密传输,这样就避免中间的“破坏者“来干扰、修改我们的数据报(也就是上文中我提到的“小人“做法)。
 后来因为一些其它的原因这个宏伟的想法没有实现,但是pseudo header还是保留了下来。感兴趣的可以参考:purpose of pseudo header in TCP checksum、What is the Significance of Pseudo Header used in UDP/TCP。

你可能感兴趣的:(伪头部)