为什么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的长度

这点还在考虑,先挖个坑

更新:现在想想,可能是为了防止UDP头部的长度字段出现错误,导致解析UDP报文时出现差错

 

再来看TCP

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

 

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

 

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

  • 0
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值