UDP

  1. 1. 计网学习——UDP
    1. 1.1. 多路复用与多路分解
    2. 1.2. UDP
      1. 1.2.1. UDP报文段

计网学习——UDP

UDP是一个传输层协议(Transport Layer),其下的有一个名为IP的协议,而IP是一个尽力而为交付服务(best-effort delivery service)——即IP不提供任何数据确保、丢包确保。他仅将数据做最大努力发送到目的地。因此IP称不可靠服务(unreliable service)。且一台主机仅有一个IP地址。IP以后做讨论,此处仅知,IP对数据不做任何确保,以及IP提供的为主机到主机的逻辑通信——即一台主机发送信息到另外一台主机。

但现实生活中是,一台主机中运行着许多服务,可能开着QQ,同时放着网易云,一边还在贴吧高强度对线。时不时谷歌一下,等等,不一而足。但IP仅提供主机间的逻辑通信——这意味着这些应用的数据会一股脑的塞进IP数据段中然后发出去。

发送固然没有问题,但接受呢?IP会将所有接受到的数据一股脑向上塞。此时就必须拥有某种机制,用以区分这些数据要发送至哪个应用。

此即为传输层的一个作用——将端到端的通信扩展到应用进程间的逻辑通信。称之为运输层的多路复用(multiplexing)与多路分解(demultiplexing)。

注意:多路复用与多路分解的思想与应用存在与计网协议栈的每一层。如HTTP对不同URI的不同方法(Method)即为一种多路复用与多路分解.

多路复用与多路分解

多路复用与多路分解的基本,也是最重要的条件有二:

  • 每个进程具有唯一的标识符,且在同一段时间内不重复冲突。
  • 每个报文段中具有特殊字段用以保存该标识符。

在传输层中,这个唯一的标识符即端口号(port number)。在报文段中,该端口号有两个,分别用以标识源进程目的进程。分别称源端口字段(source port number field)与目的端口字段(destination port number field)。

端口号是一个16比特的数,大小在0-65535之间。而0-1023之间的端口号一般称为周知端口号(well-known port number),一般不使用这些端口号,因为他们是保留给一些周知应用层协议使用的。如HTTP的80,FTP的21,SSH的22。周知端口号在RFC 1700RFC 3232中给出。

一个UDP套接字(socket)由一个二元组全面标识,其中包含一个目的IP地址与目的端口号。指哪怕拥有不同的源IP、源端口,但只要目的IP、目的端口相同,他们就由目的主机上的同一个进程处理。(此为与TCP不用的 一个部分,具体区别在TCP中讨论)。

注意要与报文段信息作出区分,此二者不是用一个东西。

UDP

UDP,全称用户数据报协议(User Datagram Protocol),其具体定义可在RFC 768中查询。

此处简要表述为提供运输层协议能做的最少的工作。即除了提供多路复用与多路分解外,他几乎没有对IP做进一步封装。

而且UDP在发送报文段前,并无与目的主机的握手(相较于TCP)。因此UDP被称为无连接的

故,UDP可视为接受到数据便立马封装发送到目的主机的目的进程。无论中间是否有丢包、目的主机是否开机、是否监听相关端口。

UDP报文段

UDP header

由此可见,UDP首部仅有4个字段,其中每个字段两个字节。

  • Source Port & Destination Port

    用于多路复用与多路分解

  • Length

    UDP报文段中的字节数,包含首部和数据两个部分

  • Checksum

    用于提供差错检验。检验在数据发送过程中,是否存在比特的改变。具体原理可参考RFC 1624及后续博客,此处仅给出如何进行Checksum的计算及其如何判断是否有误。

    发送方

    1. Checksum为0

    2. 对整个UDP报文段中的数据,以16bit为单位进行划分,若最后位不足16bit则补0

    3. 对划分出的所有16bit的数据块进行求和,若溢出则回卷——即将溢出位与低16位进行加法运算。如10+10=01

      回卷的意义仅在于对不让数据超过16bit这个范围

    4. 对最后的结果取反码,即为Checksum,置于报文段中的Checksum

    接受方

    将包括Checksum在内的所有UDP报文段数据按16bit划分并求和,最后得到的为0xFFFF。如果不是,则有差错。

给出检验和的一个例子:

若有三个16bit的数:

0110 0110 0110 0000
0101 0101 0101 0101
1000 1111 0000 1100

将这三数字相加,得到:

1 0100 1010 1100 0001

有溢出,则回卷,得到:

0100 1010 1100 0010

而后取反,得到最后的检验和Checksum

1011 0101 0011 1101

以下为由Wireshark抓取的DHCP协议中的UDP报文段。

UDP

根据多次抓包分析,可知在博主当前网段,UDP协议数据段中传输错误情况非常普遍,Checksum只有少数情况为0xffff。