为什么在UDP校验和的计算中,Pseudo标头被添加到UDP数据报之前?这背后的理性是什么?
最近的你会得到一个"直接从马的嘴里"的答案,来自David P. Reed的以下链接.
http://www.postel.org/pipermail/end2end-interest/2005-February/004616.html
答案的简短版本是"伪标题因历史原因而存在".
最初,TCP/IP是单个单片协议(简称为TCP).当他们决定将其拆分为TCP和IP(以及其他)时,他们并没有将这两者完全分开:IP地址仍然被认为是TCP的一部分,但它们只是从IP层"继承"了而不是在TCP标头中重复.TCP校验和操作部分IP头(包括IP地址)的原因是因为他们打算使用加密技术来加密和验证TCP有效载荷,并且他们希望伪头中的IP地址和其他TCP参数是受身份验证代码保护.这将使中间人篡改IP源和目标地址变得不可行:中间路由器不会注意到篡改,但TCP端点会在尝试验证签名时发生.
由于各种原因,没有一个大的加密计划能够通过,但取而代之的TCP校验和仍然在伪标题上运行,好像它是一个有用的事情.是的,它为您提供了针对随机错误的额外保护,但这不是它存在的原因.坦率地说,没有它我们会更好:TCP和IP之间的耦合意味着您在更改IP时必须重新定义TCP.因此,IPv6的定义包括TCP和UDP伪报头的新定义(参见RFC 2460,s8.1).为什么IPv6设计者选择使这种耦合永久化,而不是抓住机会废除它,这超出了我的想象.
从TCP或UDP的角度来看,数据包不包含IP地址.(IP是它们下面的层.)
因此,为了进行适当的校验和,包括"伪标题".它是"伪"的,因为它不是UDP数据报的一部分.它包含IP头的最重要部分,即源和目标地址,协议号和数据长度.
这是为了确保UDP校验和考虑这些字段.
当设计这些协议时,他们的一个严重问题是主机收到一个数据包,认为它不属于他们.如果在传输期间在IP报头中翻转了几个比特并且数据包改变了路线(但IP校验和仍然是正确的),则重定向接收器的TCP/UDP堆栈仍然可以知道拒绝该分组.
尽管伪标题破坏了层的成语分离,但认为可靠性提高是可以接受的.
"使用伪标头的目的是验证UDP数据报是否已到达正确的目的地.理解伪标头的关键在于意识到正确的目的地由特定机器和该机器内的特定协议端口组成. UDP报头本身仅指定协议端口号.因此,为了验证目的地,发送机器上的UDP计算覆盖目标IP地址和UDP数据报的校验和.伪报头不与UDP一起传输.数据报,也不包括在长度中."
E. Comer - 使用TCP/IP第4版进行网络互连.