[网络]——UDP协议分析

写完了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个字节,每个字段两个字节意义如下:

  1. 源端口
    源端口号,在需要对方回信时选用,不需要时用0.
  2. 目的端口
    目的端口号,在终点交付报文时必须使用到。
  3. 长度
    UDP用户数据报的长度,包括首部和数据字段,最小值为8
  4. 校验和
    检测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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章