写完了TCP,运输层的UDP协议最好也总结一下,本篇博客资料来自谢希仁《计算机网络》,真的很推荐看一遍。
1.UDP协议
UDP协议是运输层协议,有以下的特点。
- UDP是无连接的
- UDP尽最大努力交付,但不保证可靠性
- UDP是面向报文
- UDP没有拥塞控制
- UDP支持一对一,一对多和多对多的交互通信。
- UDP的首部较短只有8个字节
UDP是无连接
发送数据前不需要建立连接,发送完后同样不需要释放连接。
UDP尽最大努力交付,但不保证可靠性
UDP对于下一层的IP协议报头只添加了了源端口、目标端口、长度、校验和4个字段,甚至源端口跟校验和都可以不要,因此UDP是不可靠的。
UDP是面向报文
发送方的UDP对应用程序发出的报文,在添加首部后就交付给IP层,既不合并也不拆分,不像TCP协议一样对字节进行编号,保留报文的边界。
UDP没有拥塞控制
网络上的拥塞不会影响发送方的发送速率,适合实时应用,例如直播,电话等要求发送方以恒定的速率发送数据,能接受一定的丢包率,但不允许数据有太大的时延。
2.UDP首部
用户数据报UDP有两部分构成:数据和首部
首部一共8个字节,每个字段两个字节意义如下:
- 源端口
源端口号,在需要对方回信时选用,不需要时用0. - 目的端口
目的端口号,在终点交付报文时必须使用到。 - 长度
UDP用户数据报的长度,包括首部和数据字段,最小值为8 - 校验和
检测UDP用户的数据报在传输的过程中是不是有错,如果有就丢弃。
3.发送情况
当接受方从ip层收到UDP报文后,就根据目的端口,把UDP数据报通过相应的端口,上交给应用程序。
如果UDP的目的端口号不正确,就丢弃该报文,并用ICMP发送“端口不可达”差错报文给发送方。
UDP用户数据报中校验和的计算方式为,在UDP报文前增加12个字节的伪首部,得到一个临时的UDP报文,用于计算校验和。
有同学会问IP也有一个校验过程,和UDP的校验过程有什么区别?
区别在于,IP数据报的校验和只校验IP数据报的首部,UDP的校验和把首部和数据部分都校验。
具体发方法如下
对于发送方,首先把全零放入校验和字段,在把伪首部和UDP数据报看成许多16位的字拼接而成,以二进制反码求这些字的和,将此二进制反码的和写入校验和字段后,发给接受方,在接受方,把收到的UDP用户数据报和伪首部一起,按二进制反码求这么16位字的和,如果正确,其二进制数位应该全为1.下图为计算过程。
UDP协议比起TCP协议来说,简单的不止一点点,但是更因如此,我们才要把UDP协议理解,毕竟尽信书不如无书。在下一篇博客中,尝试实现UDP的简单服务器。
面试题:用UDP实现可靠传输
由于UDP本身的特性在传输层属于不可靠传输,所以要想让UDP变可靠必须在应用层对其进行改造,实现方法可以参考TCP协议。
具体操作如下
- 增加seq/ack 应答机制 ,确认端到端的数据输入。
- 添加发送和接收缓冲区
- 加入超时重传机制。
目前实现了UDP的可靠传输的开源程序有Rudp,RTP,UDT。