1. sip协议由request-uri路由,而不是to字段
sip消息再经过ua发送出去时,request-uri可能会被重写,而to字段,一般是不变的
2. 主叫生成callId和from tag, 响应to tag由另一方生成
totag的作用可以用来区分初始化请求和序列化请求
3. sip消息有哪些头字段是必须的?
- Via
- Max-Forwards (请求消息必须有这个头,响应消息一般没有这个头) 感谢 @genmzy 提示。
- From
- To
- Call-ID
- CSeq
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. sip 网关是干什么的?
网关的两侧通信协议是不同的,网关负责将协议翻译成彼此可以理解的协议。sip网关也是如此。电话网络的通信协议不仅仅只有sip, 还有其他的各种信令,如七号信令,ISDN, ISUP, CAS等。
10. sip结构组件
- SIP User Agents
- Presence Agents
- B2B User Agents
- SIp Gateways
- SIP Server
- 代理服务器
- 注册服务器
- 重定向服务器
11. 代理服务器和UA与网关的区别?
- 代理服务器没有媒体处理能力
- 代理服务器不解析消息体,只解析消息头
- 代理服务器并不分发消息
12. 什么是Forking Proxy?
Forking Proxy收到一个INVITE请求,却发出去多个INVITE来呼叫多个UA, 适用于多人会议。
13. SIP url有哪些形式?
下图是 sip url 参数列表: 比较重要的有
- lr
- ob
- transport
14. ACK请求的要点知识
- 只有INVITE需要ACK确认
- 2xx响应的ACK由主叫方产生
- 3xx, 4xx,5xx,6xx的ACK是逐跳的,并且一般是代理服务器产生
15. 可靠性的机制 重传 T1 T2
sip如果使用tcp, 那么tcp是自带重传的,不需要sip再做重传机制。如果使用udp, udp本身是没有可靠性的保证的。那么这就需要应用层去自己实现可靠性。
- 请求在发送出去时,会启动定时器
- 重传在达到64T1, 呼叫宣布失败
16. ACK 消息 Cseq method会怎样改变?
- Cseq不变 method变为ACK
- 主叫方发送ack, 其中ack的CSeq序号和invite保持一致
17. 端到端的ACK和逐跳的ACK有什么区别
- 对200响应的ACK是端到端的,对非200的ACK是逐跳的
- 端到端的ACK是一个新的事务,有新的branchId
- 逐跳的ACK和上一个INVITE请求的branchId一致
- 当你收到ACK请求时,你要判断这个ACK是应当立即传递到下一跳,还是自己处理
18. 非INVITE请求的重传
- 消息发送出去时,启动定时器,周期为T1
- 如果定时器过期,则再启动定时器,周期为2T1, 周期2倍递增,如果周期到达T2, 则以后的重传周期都是T2
- 如果中间收到了1xx的消息,则计时器立即将周期设置为T2, 并在T2过期时再次重发
19. INVITE请求的重传
- 请求以2倍之前的周期执行重传
- 如果收到1xx的响应,则不会再重传
20. 端到端与逐跳的区别
21. cancel消息的特点
- cancel是逐跳的
- cancel的CSeq和branchId和上一个invite一致 一般的cancel请求处理图
22. Via的特点
- 请求在传递给下一站时,UA会在在最上面加上自己的Via头。
- branch tag来自 from, to, callId, request-url的hash值
- 大多数sip头的顺序都是不重要的,但是Via的顺序决定了,响应应该送到哪里
- 如果请求不是来自Via头
23. 24 CSeq
- CSeq 会持续增长,有可能不会按1递增
- 同一个事务的CSeq是相同的
- ACK的CSeq会和invite一致