最近在看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定义的一致。
通过左边的图可以看到
源端口:60570 目标端口:5060 长度:711 校验和:0xdd30
右边为二进制表示,方便我们做计算。
源端口号占16位,也就是 1110110010011010 转为十进制正好为60570,目标端口 0001001111000100 转为十进制为5060。
看到这里相比大家都弄明白了,以抓包为例,应用层协议SIP封装好自己的数据,打上自己的标签(有点像寄邮件)交给传输层UDP,UDP加上自己8个字节头,交由网络层协议IP,网络层再交给数据链路层,最后由物理层实际传输。接收方正好反过来,从数据链路层逐步解包。
至此本文就结束了,其实还有一部分没说,那就是校验和的计算,留给各位去思考🤔吧。
参考: