SIP: From ,Contact, Via 和 Record-Route/Route head字段详解

http://bbs.csc-china.com.cn/forum.php?mod=viewthread&tid=17606


From: 


如果一个SIP消息中没有Contact或者Record-Route头域,那么callee就会根据From头域产生后续的Request。比如:如果 Alice打一个电话给Bob,From头域的内容是 From:Alice。那么Bob打给Alice时就会使用 sip:[email protected]作为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 不可使用

你可能感兴趣的:(sip/gb28181)