INVITE sip:[email protected] SIP/2.0 Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds Max-Forwards: 70 To: Bob <sip:[email protected]> From: Alice <sip:[email protected]>;tag=1928301774 Call-ID: [email protected] CSeq: 314159 INVITE Contact: <sip:[email protected]> Content-Type: application/sdp Content-Length: 142 (Alice’s SDP not shown)
1. Via
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
1.1 用来标识Responeses消息的返回路径(todo:各router的区别),包含SIP版本,通过的路径,branch;每个Request-Line(请求消息)路过代理Server时都会记录,然后原路返回;
1.2 用来检查路由环,因为每经过server都会把他放在via里面,每都一个Server里先检查via头里面有没有这个server如果有,出现了路由环Spiral:Alice calls [email protected] ,example.com 把信息传给Bob的PC,返回时又转给了[email protected],这样又回到了example.com proxy上,所以这不是一个死循环【PS: 和loop不一样】;
1.3 Branch是一个事务ID(Transaction ID),用于区分同一个Client所发起的不同Transaction,它不会对未来的request 或者是response造成影响,对于遵循RFC3261规范的实现,这个branch参数的值必须用magic cookie”z9hG4bK”打头. 其它部分是对“To, From, Call-ID头域和Request-URI”按一定的算法加密后得到;
1.4 与CallID的区别:CallID是用来在session层,branch用在transation层
Call-ID contains a globally unique identifier for this call,generated by the combination of a random string and the softphone's host name or IP address. The combination of the To tag, From tag,and Call-ID completely defines a peer-to-peer SIP relationship between Alice and Bob and is referred to as a dialog.
2.Max-Forwards
Max-Forwards: 70
serves to limit the number of hops a request can make on the way to its destination. It consists of an integer that is decremented by one at each hop.
2.1 用于表示这个包最多可以传送多少跳,当Max-Forwards==0&&没到达目的地时,系统会返回483(Too many hops);一般会在有Request的包里面;
2.2 默认为70;
2.3 原理:每经过一跳时【Todo:一个代理?】都会减一向下一跳传去.
3. To
To: Bob <sip:[email protected]>
3.1 目的地的绝对地址,包含补叫的display name 和被 叫URL,&前面带的是设备号或被叫号码,&后带的是Proxy地址;
3.2 这个地址用于给Proxy们找路由的,一般会经过Proxy一步步定位到最精确的位置【改为其它精确地址】.
4. From
From: Alice <sip:[email protected]>;tag=1928301774
4.1 格式与To一样,表示Caller的绝对地址,但是会加一个Tag标签;
4.2 Tag 他是一个随机码【Todo:可不可变?】用于 identification purposes.
5. Call-ID
Call-ID: [email protected]
5.1 Call-ID由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变,与其它的session是不同的;
5.2 对于用户发出Invite消息,本地会生成From Tag 和Call-ID全局唯一码,被叫方代理生成 To tag全局唯一码,这三个随机码做为整个对话中对话标识(dialog indentifier).
6. Cseq
CSeq: 314159 INVITE
6.1 又叫Command Seqence(命令队列),每发一个新的请求,这个数就会+1,最大2*31;
6.2 用来标识命令和命令顺序,整数部用于同一session(CallID决定)中不同的请求排序,它会与将请求和应答想匹配:比如:Alice 发1 Invite 没返回--->再发 2 Invite--->没返回--->再发3 Invite--->这时返回了2 Invite就知道是第2个请求得到了响应(这个数是一直递增1的); 【因为在同一个transtation里面,所以invite其它消息都没有变化的,就用cseq来区别了】
- Ack的CSeq:这个是与Invite里面的一样的,这使代理为非成功最终应答产生Ack时不用再建立新的CSeq,保证唯一性,只用client代理创建哦;
- Cancel的CSeq:这个也是与Invite里面的一样的,这也是为什么CSeq里面要加Method的原因,如果不加,client就不知道这个是cancel还是invite的应答了;
以上几个字段是所有 SIP 消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须
7. Contact
Contact: <sip:[email protected]>
Contact contains a SIP or SIPS URI that represents a direct route to contact Alice, usually composed of a username at a fully qualified domain name (FQDN). While an FQDN is preferred, many end systems do not have registered domain names, so IP addresses are permitted. While the Via header field tells other elements where to send the response, the Contact header field tells other elements where to send future requests.
7.1 包含源的URI信息,用来给响应消息直接和源建立连接用;
7.2 注意和From的差别:这个是可以让被叫方Bob直接找到呼叫方的绝对地址。
8. Content-Type,Content-Length
Content-Type: application/sdp %%指明消息体的类型为SDP【Todo: SDP会话描述协议】
Content-Length: 142 %%指明消息体的字节大小