SIP协议拾遗补缺

门派战报

1. sip协议由request-uri路由,而不是to字段2. 主叫生成callId和from tag, 响应to tag由另一方生成3. sip消息有哪些头字段是必须的?4. 被叫在向主叫发消……

1. sip协议由request-uri路由,而不是to字段2. 主叫生成callId和from tag, 响应to tag由另一方生成3. sip消息有哪些头字段是必须的?4. 被叫在向主叫发消息时,from和to字段为什么没变?5. 为什么所有via头中的branch都以z9hG4bK开头6. sip有两种url, 是什么?有什么区别7. sip注册实际上绑定用户url和设备ip地址8. 呼叫结束了,为什么呼叫的状态信息还需要维持一段时间?9. SBC实际上是一种B2BUA10. sip 网关是干什么的?11. sip结构组件12. 代理服务器和UA与网关的区别?13. 什么是Forking Proxy?14. SIP url有哪些形式?15. ACK请求的要点知识16. 可靠性的机制 重传 T1 T217. ACK 消息 Cseq method会怎样改变?18. 端到端的ACK和逐跳的ACK有什么区别19. 非INVITE请求的重传20. INVITE请求的重传21. 端到端与逐跳的区别22. cancel消息的特点23. Via的特点24 CSeq最后,小测试补充完整的时序图补充完整 CSeq的序号和 method补充完整的时序图1. sip协议由request-uri路由,而不是to字段sip消息再经过ua发送出去时,request-uri可能会被重写,而to字段,一般是不变的

2. 主叫生成callId和from tag, 响应to tag由另一方生成totag的作用可以用来区分初始化请求和序列化请求

3. sip消息有哪些头字段是必须的?

ViaMax-Forwards (请求消息必须有这个头,响应消息一般没有这个头) 感谢 @genmzy(jinzhaoyang-pjnzx) 提示。FromToCall-IDCSeq

4. 被叫在向主叫发消息时,from和to字段为什么没变?from和to字段用来表名sip 请求的方向,而不是sip消息的方向。主叫发起的请求,那么在这个dialog中,所有的sip消息,主叫和被叫字段都不会变。

5. 为什么所有via头中的branch都以z9hG4bK开头这个头是rfc3261中规定的,表示她是经过严格规则生成的,可以用来标记事务。

6. sip有两种url, 是什么?有什么区别

用户uri: AOR address of record, 例如from和to字段中的url设备uri: 例如 contact头

用户uri用来唯一认证用户,设备uri用来唯一认证设备。用户uri往往需要查询数据库,而设备uri来自设备自己的网络地址,不需要查询数据库。一个用户可能有多个设备

7. sip注册实际上绑定用户url和设备ip地址我并不能直接联系你,我只能用我的手机拨打你的手机。

8. 呼叫结束了,为什么呼叫的状态信息还需要维持一段时间?重传的invite消息,可能包含相同的callI和cseq, 为了影响到之后的呼叫,需要耗尽网络中重传的包。

9. SBC实际上是一种B2BUA

10. sip 网关是干什么的?网关的两侧通信协议是不同的,网关负责将协议翻译成彼此可以理解的协议。sip网关也是如此。电话网络的通信协议不仅仅只有sip, 还有其他的各种信令,如七号信令,ISDN, ISUP, CAS等。

11. sip结构组件

SIP User AgentsPresence AgentsB2B User AgentsSIp GatewaysSIP Server

代理服务器注册服务器重定向服务器

12. 代理服务器和UA与网关的区别?

代理服务器没有媒体处理能力代理服务器不解析消息体,只解析消息头代理服务器并不分发消息

13. 什么是Forking Proxy?Forking Proxy收到一个INVITE请求,却发出去多个INVITE来呼叫多个UA, 适用于多人会议。

14. SIP url有哪些形式?sip:alice@abc.org #不带参数的sip:alice@abc.org;transport=tcp #带参数的sip:192.168.3.5:1245 # 直接IP加端口

下图是 sip url 参数列表:比较重要的有

lrobtransport

15. ACK请求的要点知识

只有INVITE需要ACK确认2xx响应的ACK由主叫方产生3xx, 4xx,5xx,6xx的ACK是逐跳的,并且一般是代理服务器产生

16. 可靠性的机制 重传 T1 T2

sip如果使用tcp, 那么tcp是自带重传的,不需要sip再做重传机制。如果使用udp, udp本身是没有可靠性的保证的。那么这就需要应用层去自己实现可靠性。

请求在发送出去时,会启动定时器重传在达到64T1, 呼叫宣布失败

17. ACK 消息 Cseq method会怎样改变?Cseq不变 method变为ACK

主叫方发送ack, 其中ack的CSeq序号和invite保持一致

18. 端到端的ACK和逐跳的ACK有什么区别

对200响应的ACK是端到端的,对非200的ACK是逐跳的端到端的ACK是一个新的事务,有新的branchId逐跳的ACK和上一个INVITE请求的branchId一致当你收到ACK请求时,你要判断这个ACK是应当立即传递到下一跳,还是自己处理

19. 非INVITE请求的重传

消息发送出去时,启动定时器,周期为T1如果定时器过期,则再启动定时器,周期为2T1, 周期2倍递增,如果周期到达T2, 则以后的重传周期都是T2如果中间收到了1xx的消息,则计时器立即将周期设置为T2, 并在T2过期时再次重发

20. INVITE请求的重传

请求以2倍之前的周期执行重传如果收到1xx的响应,则不会再重传

21. 端到端与逐跳的区别

22. cancel消息的特点

cancel是逐跳的cancel的CSeq和branchId和上一个invite一致

一般的cancel请求处理图

23. Via的特点

请求在传递给下一站时,UA会在在最上面加上自己的Via头。branch tag来自 from, to, callId, request-url的hash值大多数sip头的顺序都是不重要的,但是Via的顺序决定了,响应应该送到哪里如果请求不是来自Via头

24 CSeq

CSeq 会持续增长,有可能不会按1递增同一个事务的CSeq是相同的ACK的CSeq会和invite一致

最后,小测试

补充完整的时序图

补充完整 CSeq的序号和 method

补充完整的时序图提示

Forking Proxy没有record route一共缺少6个sip消息