UDP协议

1 UDP协议

1.1 UDP认识

UDP是一种简单的面向数据报、无连接、传输层协议,并且保留了信息边界。UDP不提供错误校正,不保证有序,无法去重复,没有流量控制和拥塞控制,不能保证数据一定到达目的地,但是可以通过校验和提供错误侦测。UDP提供的的是不可靠传输,因此要有应用层来提供这些功能。

使用UDP的应用程序:DNS,NFS(Network File System),TFTP,BOOTP,SNMP

1.2 UDP数据报封装成IP数据报

一般应用程序要求每一个UDP输出操作刚好产生一个UDP数据报,并组装成一份IP数据报去发送,UDP数据报封装成IP数据报的格式如下图:
UDP协议_第1张图片

2 UDP数据报首部

2.1 UDP数据报首部格式图

UDP协议_第2张图片

2.2 UDP数据报首部各字段

(1)16位源端口号:发送端应用程序使用的端口号,用于区分数据报来自哪个进程,多路复用。
(2)16位目的端口号:数据送往接收端哪个应用程序,多路分用。
(3)16位UDP长度:UDP数据报首部和UDP数据报数据部分总字节数,最小长度为8字节(仅有首部)。
(4)16位UDP检验和:UDP的校验和是可选的,TCP是必需的。UDP的校验和覆盖首部及数据部分。2.3节中说明如何计算UDP校验和。
(5)数据:要发送的数据,可以为空(0字节)。

2.3 UDP检验和

UDP数据报的长度可以为奇数字节,但校验和算法是把若干16bit的字相加,因此需要在最后填充一些值为0的bit(填充的数据仅仅是为了计算校验和,并不会被发送),其次为了让UDP层可以验证数据正确到达了目的地,需要12字节的伪首部(同样不需要被传送,仅仅是为了校验和的计算)。UDP校验和计算使用的各字段如下图所示:
UDP协议_第3张图片
《TCP/IP 详解》卷一 第一版中如下计算检验和字段的值
发送方计算UDP检验和:
首先把检验和字段置为0,把上图中,各部分数据(包括UDP伪首部及填充字段)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),所求结果就是16bitUDP检验和字段的值。
接收方计算UDP检验和:
对收到的UDP数据报(加上了UDP首部和填充字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),若结果为全1,则UDP数据报在传输过程中没有出现差错,否则数据报有差错。
《TCP/IP 详解》卷一 第二版中如下计算检验和字段的值
发送方计算UDP检验和:
首先把检验和字段置为0,把上图中,各部分数据(包括UDP伪首部及填充字段)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),最后结果再按位取反,所得结果就是16bitUDP检验和字段的值。
接收方计算UDP检验和:
对收到的UDP数据报(加上了UDP首部和填充字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),再按位取反,若结果为全0,则UDP数据报在传输过程中没有出现差错,否则数据报有差错。
注:检验和的值从不为0xFFFF

需要伪首部的原因:伪首部包含了部分IP首部的信息,能让UDP层验证数据是否正确到达目的地。(在《TCP/IP 详解》卷一第二版中这样说:Its purpos is to let the UDP layer verify that data has arrived at the correct destination(i.e, that IP has not accepted a misaddressed datagram, and that IP has not given UDP a datagram that is for anther transport protocol))。对此尚有点疑问,这为什么不能通过IP数据报首部的字段保证呢?

3 UDP服务器三类地址绑定

UDP服务器可以创建的三类地址绑定如下图:
UDP协议_第4张图片
(1)第一行中服务器限定了只从本地localIP这个IP地址的lport端口接收数据报,而且只接收来自IP为foreign且端口为fport发来的数据。
(2)第二行中服务器限定了只从本地localIP这个IP地址的lport端口接收数据报,但可以接收任何主机发送的数据。
可以在同一个端口上启动不同的服务,比如:
192.168.18.11 8888 对于以太网
127.0.0.1 8888 本地环回接口
8888 其他(IP统配,像第三行)
(3)第三行中服务器只限定了接收数据的端口号,因此任何一个本地接口IP都可以接受它,而且数据可以来自任何主机发送的数据。

注:表中三行的顺序是UDP模块判断使用哪个端点接收数据采用的匹配顺序。

你可能感兴趣的:(TCP/IP协议族)