图6-5 UDP校验和的计算过程
2. 在接收端的校验和计算
接收端按以下6个步骤计算校验和是否正确:
(1)把伪首部加到UDP用户数据报上。 (2)若需要,就增加填充。 (3)把数据报按16位长度分段。
(4)把所有16位的分段使用反码算术运算相加。 (5)把得到的结果取反码。
(6)若得到的结果是全零,则丢弃首部和填充,并接受这个用户数据报。若结果是非零,就丢弃这个用户数据报。
校验和是可选使用的,若不计算校验和,则校验和字段就填入0。
七. UDP应用
下面列出了UDP协议的一些用途:
● UDP适用于这样的进程,它需要简单的请求——响应通信,而较少考虑流量控制和差
错控制。对于需要传送成块数据的进程,如FTP,则通常不使用UDP; ● UDP适用于具有内部流量控制和差错控制机制的进程; ● 对多播和广播来说,UDP是个比较合适的传输层协议; ● UDP可用于管理进程,如SNMP协议;
● UDP可用于某些路由选择更新协议,如路由信息协议(RIP协议,参考实验17)。
八. 协议栈实现代码解析
本实验将通过对netproto_udp_student.h、netproto_udp_shudent.c、netproto_udpif_student.h、
netproto_udpif_student.c四个文件进行编码,完成协议栈中UDP协议的实现。
netproto_udp_student.h和netproto_udp_shudent.c文件用于实现UDP数据包发送和接收。其中,netproto_udp_student.h文件中定义了UDP协议实现相关数值以及UDP的负载内容、负载长度,关键代码如下所示:
这段代码定义了5个宏,他们代表的含义如下表所示:
表6-2 netproto_udp_student.h中定义的宏
在实验的编码过程中,应该使用这些宏对相应的变量进行赋值。
netproto_udp_shudent.c文件是协议栈中UDP数据包发送和接收的实现部分,其中定义了2个函数。下面介绍这些协议栈的实现部分。
函数netp_udp_output_student的功能是构造并发送一个UDP数据包,其高层协议为自定义协议类型,负载内容为自定义负载。这个函数的编码工作需要由学生完成。
当有数据到达本机网络接口时,函数netp_udp_input_student将被调用,并传递给这个函数原始数据。在该函数中,需要判断一些条件值来确定接收到的数据包为自定义UDP数据,如果是自定义UDP数据包,则输出负载内容,如果不是,则返回NETP_PUSH_TO_LWIP交给协议栈继续处理。
netproto_udpif_student.h和netproto_udpif_shudent.c文件用于实现UDP上层投递的功能,即为高层使用UDP协议提供了接口。其中,netproto_udpif_student.h文件中并没有定义太多内容。netproto_udpif_shudent.c文件是协议栈中UDP上层投递的功能的实现部分,其中定义了一个全局变量recv_port和2个函数。
全局变量recv_port的作用很简单,它记录了发送UDP数据报时的源端口号作为接收UDP数据报的过滤条件。
函数netp_send_udp通过IP层接口发送UDP数据报,该函数功能需要学生完成。 函数netp_udp_input_student处理输入数据包,如果输入的数据报满足过滤条件,则投递给上层协议使用。该函数功能需要学生完成。
在编码过程中可能会设计到一些结构体、宏和函数,下表是对他们进行和介绍:
表6-3 实验涉及的结构体、宏和函数
相关推荐: