5.7.2 UDP协议格式(一)——UDP差错控制
前面我们学习了UDP数据报格式(5.7.1 UDP概述)我们知道UDP只是在IP数据报服务基础上增加了端口的复用和分用功能,以及差错控制的功能,这里我们就一起来学习一下UDP的差错控制方法。在学习前我们先要明白传输层和网络层差错控制的区别,因为有人觉得,既然网络层已有差错控制,为什么传输层还要进行差错控制。
一、传输层与网络层差错控制的区别
如图
在网络层中的差错控制是在IP数据报首部中有一个首部校验和字段,它使用的是仿码二进制相加法,它只校验IP数据报的首部,对于IP数据报中的数据部分是不进行数据差错控制的,这样做的目的是因为IP数据报每经过一个路由器都需要重新计算校验和,相对比较繁琐。所以为了提高传输效率,IP数据报首部中校验和字段仅仅校验了IP数据报的首部是否出现差错。而不检查它的数据部分,这样做的优点在于他大大解约了路由器处理每一个报文的时间,因为他非常符合IP数据报中的尽力而为的思想。当然这种方法也有一个非常明显的缺点就是给上一层留下了一个数据是否可靠的问题,在这样的情况下IP数据报的首部与数据部分校验分开允许在上一层选择自己的校验方法。
于是在计算机网路中采用的补充的方法就是在传输层中使用一个对报文段进行差错校验和检测的方法。为了保证将应用层的数据正确的交付给应用进程。
如图
传输层的TCP和UDP的校验和既要校验TCP/UDP报文段的首部也要校验数据部分,并且只在发送方进行一次校验和的计算,在接收端进行一次检验即可。因为报文段在转发过程中中间的路由器对TCP报文段和UDP的用户数据报而言是透明的,它不会重复计算TCP/UDP报文段首部的校验和。校验和的计算过程我们后面再说。
二、UDP校验和计算
这里我们应该知道UDP校验包含了三个部分
-
UDP首部
-
UDP报文内的数据
-
伪首部:在计算UDP或者TCP校验和之前还要增加12个字节的伪首部
如图
所谓的伪首部是因为这样的首部它仅仅是在计算校验和时所使用,它既不向下层传送,也不递交给上层,
UDP校验和的计算过程如下:
- 首先把校验和字段清零
- 把所有需要校验的数据划分为16比特的序列也就是两个字节划分成一段
- 对序列进行仿码二进制求和
- 求和后的结果再取反,结果得到我们需要的校验和。
三、采用计算方法的原因
为什么要使用增加伪首部的方法来计算UDP或者TCP的校验和呢?
主要是考虑要对完整通信双方五元组(5.6.3 套接字)的信息进行校验,五元组包括<源IP地址,源端口,目的IP地址,目的端口,传输协议>,对于这样的特点就要求处理尽可能的简单,处理要快,便于实现高速的数据传输,当然这里我们应该知道端口的信息是在UDP上的。而IP地址和传输协议则是取自于IP数据报的首部。