本文对SIP 消息中from, contact, via, record-route 和route 字段进行详细的解释,便于大家对SIP信令进行分析和排错
From:
如果一个SIP消息中没有Contact或者Record-Route头域,那么callee就会根据From头域产生后续的Request。比如:如果 Alice打一个电话给Bob,From头域的内容是 From:Alice<sip:alice@example.org>。那么Bob打给Alice时就会使用 sip:alice@example.org作为To头域和Request-URI头域的内容。
Contact:
后续Request将根据Contact头域的内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。它还可以用来指示没 有在Record-Route头域中记录的Proxies的地址。同时它还可以被用在Redirect servers和REGISTER requests 和responses。
Record-Route/Route:
Record-Route头域一般是被proxies插入到request中的,这样后续的Request如何有着和前面一样的call-id就会被路由 到这些proxies。它也会被User Agent作为发送后续request的依据。这套机制很像source-route,Record-Route头域的信息被复制到Route头域中。并 且Request-URI头域会被设置为第一个Route头域的内容。
Via:
Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路。它不会对未来的request 或者是response造成影响。
总的来说,如果有Route,request就应该根据Route发送,如果没有就根据Contact头域发送,如果连Contact都没有,就根据From头域发送。
dialog, transaction, session
SIP中3个很重要的概念,就是dialog, session和transaction。
以下是我学习中对这三个概念的心得,贴出来和大家探讨。
dialog 的建立是收到UAS的响应(To tag)时开始建立的。收到180响应时建立的
dialog叫做早期对话(early dialog),收到2XX的应答开始才是真正的dialog建立。
session 是媒体交换之后才建立的。具体而言就是通过offer/answer方式交换sdp的媒体。
session的建立可以使INVITE-200 也可以是200-ACK。这要看媒体的交换发生的时间。
具体来说,INVITE 中的消息体用sdp语言来描述自己可处理的媒体类型,200OK中
带回UAS端可处理的媒体类型。这个时候媒体交换就算是完成了。也就是session建立起
来了。
dialog 是end-point对end-point的关系。而 transaction 是hop by hop的关系。dialog通过
From tag, To tag(应该说local tag, remote tag--这两个tag随着UAC和UAS而不同。)以及
Call-ID 来判别。而transaction是一个SIP entity和下一个SIP entity之间请求和应答关系,(无状态代理服务器不再此列)
是通过对Via里的branch来判别的。
Transaction:
维护hop to hop状态,包括一个请求和其触发的所有响应,包括若干暂时响应和一个最终响应。生命周期从请求产生到收到最终响应。
Dialog:
维护peer to peer状态,目前只有invite和subscribe请求会触发dialog。其生命周期贯穿一个端到端会话的始终。
下面是对SIP一些应答消息中数字的解释,大家可以保留下来作为参考
SIP应答头
1xx = 通知性应答
100 正在尝试
180 正在拨打
181 正被转接
182 正在排队
183 通话进展
2xx = 成功应答
200 OK
202 被接受:用于转介
3xx = 转接应答
300 多项选择
301 被永久迁移
302 被暂时迁移
305 使用代理服务器
380 替代服务
4xx = 呼叫失败
400 呼叫不当
401 未经授权:只供注册机构使用,代理服务器应使用代理服务器授权407
402 要求付费(预订为将来使用)
403 被禁止的
404 未发现:未发现用户
405 不允许的方法
406 不可接受
407 需要代理服务器授权
408 呼叫超时:在预定时间内无法找到用户
410 已消失:用户曾经存在,但已从此处消失
413 呼叫实体过大
414 呼叫URI过长
415 不支持的媒体类型
416 不支持的URI方案
420 不当扩展:使用了不当SIP协议扩展,服务器无法理解该扩展
421 需要扩展
423 时间间隔过短
480 暂时不可使用
481 通话/事务不存在
482 检测到循环
483 跳数过多
484 地址不全
485 模糊不清
486 此处太忙
487 呼叫被终止
488 此处不可接受
491 呼叫待批
493 无法解读:无法解读 S/MIME文体部分
5xx = 服务器失败
500 服务器内部错误
501 无法实施:SIP呼叫方法在此处无法实施
502 不当网关
503 服务不可使用
504 服务器超时
505 不支持该版本:服务器不支持SIP协议的这个版本
513 消息过长
6xx = 全局失败
600 各处均忙
603 拒绝
604 无处存在
606 不可使用
From:
如果一个SIP消息中没有Contact或者Record-Route头域,那么callee就会根据From头域产生后续的Request。比如:如果 Alice打一个电话给Bob,From头域的内容是 From:Alice<sip:alice@example.org>。那么Bob打给Alice时就会使用 sip:alice@example.org作为To头域和Request-URI头域的内容。
Contact:
后续Request将根据Contact头域的内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。它还可以用来指示没 有在Record-Route头域中记录的Proxies的地址。同时它还可以被用在Redirect servers和REGISTER requests 和responses。
Record-Route/Route:
Record-Route头域一般是被proxies插入到request中的,这样后续的Request如何有着和前面一样的call-id就会被路由 到这些proxies。它也会被User Agent作为发送后续request的依据。这套机制很像source-route,Record-Route头域的信息被复制到Route头域中。并 且Request-URI头域会被设置为第一个Route头域的内容。
Via:
Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路。它不会对未来的request 或者是response造成影响。
总的来说,如果有Route,request就应该根据Route发送,如果没有就根据Contact头域发送,如果连Contact都没有,就根据From头域发送。
dialog, transaction, session
SIP中3个很重要的概念,就是dialog, session和transaction。
以下是我学习中对这三个概念的心得,贴出来和大家探讨。
dialog 的建立是收到UAS的响应(To tag)时开始建立的。收到180响应时建立的
dialog叫做早期对话(early dialog),收到2XX的应答开始才是真正的dialog建立。
session 是媒体交换之后才建立的。具体而言就是通过offer/answer方式交换sdp的媒体。
session的建立可以使INVITE-200 也可以是200-ACK。这要看媒体的交换发生的时间。
具体来说,INVITE 中的消息体用sdp语言来描述自己可处理的媒体类型,200OK中
带回UAS端可处理的媒体类型。这个时候媒体交换就算是完成了。也就是session建立起
来了。
dialog 是end-point对end-point的关系。而 transaction 是hop by hop的关系。dialog通过
From tag, To tag(应该说local tag, remote tag--这两个tag随着UAC和UAS而不同。)以及
Call-ID 来判别。而transaction是一个SIP entity和下一个SIP entity之间请求和应答关系,(无状态代理服务器不再此列)
是通过对Via里的branch来判别的。
Transaction:
维护hop to hop状态,包括一个请求和其触发的所有响应,包括若干暂时响应和一个最终响应。生命周期从请求产生到收到最终响应。
Dialog:
维护peer to peer状态,目前只有invite和subscribe请求会触发dialog。其生命周期贯穿一个端到端会话的始终。
下面是对SIP一些应答消息中数字的解释,大家可以保留下来作为参考
SIP应答头
1xx = 通知性应答
100 正在尝试
180 正在拨打
181 正被转接
182 正在排队
183 通话进展
2xx = 成功应答
200 OK
202 被接受:用于转介
3xx = 转接应答
300 多项选择
301 被永久迁移
302 被暂时迁移
305 使用代理服务器
380 替代服务
4xx = 呼叫失败
400 呼叫不当
401 未经授权:只供注册机构使用,代理服务器应使用代理服务器授权407
402 要求付费(预订为将来使用)
403 被禁止的
404 未发现:未发现用户
405 不允许的方法
406 不可接受
407 需要代理服务器授权
408 呼叫超时:在预定时间内无法找到用户
410 已消失:用户曾经存在,但已从此处消失
413 呼叫实体过大
414 呼叫URI过长
415 不支持的媒体类型
416 不支持的URI方案
420 不当扩展:使用了不当SIP协议扩展,服务器无法理解该扩展
421 需要扩展
423 时间间隔过短
480 暂时不可使用
481 通话/事务不存在
482 检测到循环
483 跳数过多
484 地址不全
485 模糊不清
486 此处太忙
487 呼叫被终止
488 此处不可接受
491 呼叫待批
493 无法解读:无法解读 S/MIME文体部分
5xx = 服务器失败
500 服务器内部错误
501 无法实施:SIP呼叫方法在此处无法实施
502 不当网关
503 服务不可使用
504 服务器超时
505 不支持该版本:服务器不支持SIP协议的这个版本
513 消息过长
6xx = 全局失败
600 各处均忙
603 拒绝
604 无处存在
606 不可使用