Skip to content

也聊 UDP 协议

Published: at 08:40 AM

最近在看SIP协议(会话初始协议 RFC 3261),200多页令人头大。SIP作为应用层协议,支持在UDP/TCP传输层数据传输。看到UDP协议(用户数据报协议 RFC 768)比较简单,就3页。之前都是看别人写的二手信息,没看过RFC定义,今天简单过一遍,作为备忘。

用户数据报头格式非常简单,共4个值,各占16位,共8个字节。

源端口号(Source Port)和目标端口号(Destination Port)很好理解,UDP是传输层协议,面向的是进程间的通讯。

长度(Length)是数据报文长度,校验和(Checksum)做简单的数据差错校验。

              0      7 8     15 16    23 24    31
             +--------+--------+--------+--------+
             |     Source      |   Destination   |
             |      Port       |      Port       |
             +--------+--------+--------+--------+
             |                 |                 |
             |     Length      |    Checksum     |
             +--------+--------+--------+--------+
             |
             |          data octets ...
             +---------------- ...

                  User Datagram Header Format

下面我们通过抓包看下是不是和RFC定义的一致。

UDP抓包

通过左边的图可以看到

源端口:60570 目标端口:5060 长度:711 校验和:0xdd30

右边为二进制表示,方便我们做计算。

源端口号占16位,也就是 1110110010011010 转为十进制正好为60570,目标端口 0001001111000100 转为十进制为5060。

看到这里相比大家都弄明白了,以抓包为例,应用层协议SIP封装好自己的数据,打上自己的标签(有点像寄邮件)交给传输层UDP,UDP加上自己8个字节头,交由网络层协议IP,网络层再交给数据链路层,最后由物理层实际传输。接收方正好反过来,从数据链路层逐步解包。

至此本文就结束了,其实还有一部分没说,那就是校验和的计算,留给各位去思考🤔吧。

参考: