为什么UDP和TCP要有伪首部

UDP和TCP的伪首部只用于计算校验和,在UDP和TCP的报文中是不存在的,为什么要引入伪首部呢?为什么伪首部的要有这些字段?


下面讲讲我的理解,一下解释均认为IP和链路层校验未发现错误


先来看UDP

在《TCP/IP协议详解——卷一》中是这么解释的——其目的是让UDP两次检查数据是否已经正确到达目的地。

解释的比较粗略,为什么是两遍?

假设UDP的校验和正确,则可以确定目的IP地址是本机的(一次),操作系统将报文正确交付给了UDP(两次)。


为什么伪首部要有目的IP地址

学习过通信系统原理后,我们知道数据传输过程中会产生误码,0可能变为1,1可能变为0,因此,在传输过程中出现误码,可能使IP报文的目的地址出现错误,接收主机的UDP计算校验和时,目的IP地址来自IP层,由于目的IP地址出现错误,导致发送主机计算检验和时使用的目的IP地址与接收主机计算检验和时使用的目的IP地址不同,UDP发现错误,丢弃报文


为什么伪首部要有源IP地址

为了让接收主机确认源IP地址没有出现错误。

假设我们想要开发一款基于UDP的程序,A发送UDP报文给B,B要发送回应报文给A,假设传输过程出现误码,源IP地址出现错误,则A计算检验和时使用的源IP地址与B计算校验和时使用的源IP地址不同,B就可以发现错误,从而丢弃报文,定时重传等可靠性由应用程序自己保证


为什么伪首部要有协议字段

为了确认操作系统交付给UDP的报文是UDP报文


为什么伪首部要有UDP的长度

这点还在考虑,先挖个坑


再来看TCP

TCP的伪首部字段的作用和UDP完全类似,虽然操作系统会存储已经建立的TCP连接,假设伪首部没有源IP地址和目的IP地址,此时出现误码,导致接收的TCP报文刚好有对应的已建立的TCP连接,此时便会出现错误。


关于伪首部,还有一个解释是历史遗留,当初是为了加密才这么做,结果加密效果不理想,但却依然保留了伪首部,stackoverflow上有相应解释,附上链接:What is the Significance of Pseudo Header used in UDP/TCP


如有错误,欢迎指出,不胜感激

猜你喜欢

转载自blog.csdn.net/dhaiuda/article/details/80623150