Networking UDP/TCP中使用伪头的意义是什么

Networking UDP/TCP中使用伪头的意义是什么,networking,tcp,udp,Networking,Tcp,Udp,为什么在UDP数据报前面加上前缀以计算UDP校验和?这背后的原因是什么?从TCP或UDP的角度来看,数据包不包含IP地址。(IP是它们下面的层。) 因此,为了进行正确的校验和,需要包含一个“伪头”。它是“伪的”,因为它实际上不是UDP数据报的一部分。它包含IP报头最重要的部分,即源地址和目标地址、协议号和数据长度 这是为了确保UDP校验和考虑到这些字段。在设计这些协议时,他们的一个严重问题是主机接收到的数据包认为它是他们的,而不是他们的。如果在传输过程中IP报头中翻转了一些位,并且数据包改变了路

为什么在UDP数据报前面加上前缀以计算UDP校验和?这背后的原因是什么?

从TCP或UDP的角度来看,数据包不包含IP地址。(IP是它们下面的层。)

因此,为了进行正确的校验和,需要包含一个“伪头”。它是“伪的”,因为它实际上不是UDP数据报的一部分。它包含IP报头最重要的部分,即源地址和目标地址、协议号和数据长度


这是为了确保UDP校验和考虑到这些字段。

在设计这些协议时,他们的一个严重问题是主机接收到的数据包认为它是他们的,而不是他们的。如果在传输过程中IP报头中翻转了一些位,并且数据包改变了路线(但IP校验和仍然正确),重定向接收器的TCP/UDP堆栈仍然可以知道拒绝数据包


虽然伪标题打破了“分层”的习惯用法,但由于可靠性的提高,它被认为是可以接受的。

最接近“直接从马嘴里”的答案是David p.Reed在下面的链接中给出的

答案的简短版本是,“伪头的存在是出于历史原因”

最初,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设计者选择将这种耦合永久化,而不是抓住机会废除它

“使用伪标头的目的是验证UDP 数据报已到达正确的目的地 理解伪标头在于认识到 目标由特定的机器和特定的协议组成 该机器内的端口。UDP标头本身仅指定 协议端口号。因此,要验证目标,请在 发送计算机计算覆盖目标IP的校验和 地址以及UDP数据报。伪标头不是 使用UDP数据报传输,也不包括在长度中。”


E.Comer-与TCP/IP第四版互联。

伪IP头包含源IP、目标IP、协议和总长度字段。现在,通过将这些字段包括在TCP校验和中,我们将在网络层和传输层验证这些字段的校验和,从而进行双重检查,以确保数据传送到正确的主机

非常感谢您在发布了很长时间的问题后给出的答案。我很高兴在发帖很久之后,你回答了这个问题,而不是仅仅阅读和跳转到下一个问题。所以伙计们真的很厉害。IP头的校验和中没有考虑到这一点吗?@0xab3d让机器X向机器Z发送一个数据包。假设在途中,数据包被破坏了。由于损坏,数据包的目的地更改为机器Y,校验和的更改方式使生成的校验和值与损坏的数据完全匹配。现在这个数据包将被传送到机器Y而不是Z。Y的网络层也将全心全意地接受这个数据包。现在,如果Y的传输层的校验和字段在校验和计算中使用“伪头”,那么就没有问题了。否则,Y将接受一个不适用于它的数据包。我只是想:在IPv6中保存这一传统的原因可能是IPv6允许逃避NAT,因此加密TCP报头的想法再次出现。IPv6设计者为什么选择永久保持这种耦合,而不是抓住机会取消它,我无法理解@UweKeim作为初学者,我希望IP地址的概念出现在网络层,而传输层在网络层之上,那么传输层如何知道发送端的IP地址呢,首先,传输层报头首先封装在来自应用层的数据周围,然后连接IP报头。我的意思是,当这个设施位于底层(网络层)时,传输层如何知道IP地址?