UDP报文传输的差错控制

     了解TCP/IP协议的人都知道TCP协议是可靠传输的,而UDP协议是不可靠传输。“可靠传输”大家基本上可以达成共识,就是协议确保数据正确到达目标机器;但是“不可靠传输”可能就存在争议了,到底是不保证数据到达?还是不保证数据正确?又或者是两者都不保证?关于这个问题,我想”不保证数据到达“这点是无容置疑的,至于是否保证数据正确,通过对UDP协议的cheksum研究,可以帮助我们得到答案。

     UDP检验和覆盖UDP首部和UDP数据,而IP首部的检验和只覆盖IP的首部—并不覆盖IP数据报中的任何数据。UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。尽管UDP检验和的基本计算方法与IP首部检验和计算方法相类似(16 bit字的二进制反码和),但是它们之间存在不同的地方。

     首先,UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。
     其次,UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地(例如, IP没有接受地址不是本主机的数据报,以及IP没有把应传给另一高层的数据报传给UDP)。注意,UDP数据报的长度在检验和计算过程中出现两次。如果检验和的计算结果为0,则存入的值为全1(6 5 5 3 5),这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。
1. 32位源IP地址
2. 32位目的IP地址
3. 0 8位协议(17) 16位UDP长度
4. 16位目的端口号
5. 16位UDP检验和
6. UDP首部
7. UDP伪首部
8. 16位源端口号
9. 16位UDP长度
10.数据
11.填充字节(0)


     如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做)。UDP检验和是一个端到端的检验和,它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。尽管UDP检验和是可选的,但是它们应该总是在用。在80年代,一些计算机产商在默认条件下关闭UDP检验和的功能,以提高使用UDP协议的NFS(Network File System)的速度。在单个局域网中这可能是可以接受的,但是在数据报通过路由器时,通过对链路层数据帧进行循环冗余检验(如以太网或令牌环数据帧)可以检测到大多数的差错,导致传输失败。不管相信与否,路由器中也存在软件和硬件差错,以致于修改数据报中的数据。如果关闭端到端的UDP检验和功能,那么这些差错在UDP数据报中就不能被检测出来。另外,一些数据链路层协议(如SLIP)没有任何形式的数据链路检验和。Host Requirements RFC声明,UDP检验和选项在默认条件下是打开的。它还声明,如果发送端已经计算了检验和,那么接收端必须检验接收到的检验和(如接收到检验和不为0)。但是,许多系统没有遵守这一点,只是在出口检验和选项被打开时才验证接收到的检验和。

     那么到这里,我们基本上已经可以下这么一个结论了:UDP协议”不保证数据到达“是肯定的,至于是否保证数据正确则是可选的(从协议角度讲,是具备差错控制机制的,只是没有要求必须使用)!根据我个人的开发经历来看,UDP协议是确保数据正确传输的,欢迎大家批评指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值