20240603 -
引言
分析SIP协议的时候,发现了几个问题。虽然说,从整体上来看这个SIP的通话流程也没麻烦,实际上从RFC的概述部分就已经基本上就已经了解了全貌。但在实际的场景中,很多字段起到的作用就不太一样了。
虽然一开始的时候,在RFC中看到了一些字段比较重要,但实际上因为并没有完整的去捋清楚这些内容,所以额也是在碰壁之后才理解这些字段的意义。
通话过程
文章[1]中阐述了主机流程 ;但实际场景中可能也稍微有所不同。该文章的示例中,提到了prack这个包,这部分我在普通的sip通信软件中并没有发现。另外,update也没有发现。
实际上,这些数据包比较重要的就是影响数据包路由的字段。因为实际的环境中,可能设计很多中间的设备,特别是SIP代理服务器这种(因为并没有深入去理解SIP的内部,所以并不是非常理解各种设备)。
关键字段
via
这个字段比较奇葩的地方,就是他的branch部分:
SIP实体在插入branch ID时,必须以“ z9hG4bK”开头[2]
这一点,如果没仔细看过文档,可能还真会以为是随机数。
route和record-route
这个字段也是非常关键的,问答[3]中提到了via和route字段:
Route headers are for requests and Via headers are for responses.[3]
如果想让数据包能够正确路由,那么必须保证via和route这些字段有据可查 。
路由正确
想要路由正确[4],那么就必须保证很多字段他都是匹配的。特别是当一个数据包他带有某些字段中的随机数,那么返回他的时候也必须带上,用以正确匹配。
比如说,via字段他经过一跳之后就进行了新增,所以需要按照逐跳的形式来处理。
参考
[1]VoLTE SIP Call Flow – Mobile Originating (MO) & Terminating (MT)
[2]SIP消息的一般格式(二)
[3]How do I ensure that BYE messages bypass a SIP proxy?
[4]sip 消息路由