1、SIP消息之逐项讲解Agenda SIP INVITE SIP INVITE Message BodySIP INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TCP 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwards: 69Contact: Via: SIP/2.0/TCP 192.168.5.162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE
2、5F9C759FB02F679AFD6CB71394CFrom: ;tag=704b1683edd4438f85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Call-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microsoft.rtc-multipartyContent-Type: application/sdpContent-Length: 134SIP消息的第一部分:起始行 (StartLine)本消息属于 Request Line,它所包含的信息:R
3、equestType: 方法名就是 INVITE,表示邀请其他用户加入会话Request-URI: sip:;transport=tcp, 这属于 SIP URI中的 “Address-of-Record(AOR)”种类。SIP Version:2.0版本号SIP INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TCP 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwards: 69Contact: Via: SIP/2.0/TCP 192.168.
4、5.162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE5F9C759FB02F679AFD6CB71394CFrom: ;tag=704b1683edd4438f85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Call-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microsoft.rtc-multipartyContent-Type: applicatio
5、n/sdpContent-Length: 134SIP消息的第二部分:消息头 (Message Header)Via:记录了请求在 SIP网络中的路由路径。最下面的 Via是初始化这个请求的 UA(User Agent)插入的;上面的 Via都是在这个路由路径上的 Proxy们插入的。Via头域就是用来指示如何将响应沿原路返回到 UA的。SIP INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TCP 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwa
6、rds: 69Contact: Via: SIP/2.0/TCP 192.168.5.162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE5F9C759FB02F679AFD6CB71394CFrom: ;tag=704b1683edd4438f85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Call-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microso
7、ft.rtc-multipartyContent-Type: application/sdpContent-Length: 134SIP消息的第二部分:消息头 (Message Header)Max-Forwards:最大转发数,用来限制一个 SIP请求消息所能经过的实体的最大数目。如果消息拷贝中包含一个 Max-Forwards字段,代理服务器必须将其减一。如果消息拷贝中不含 Max-Forwards字段,代理服务器必须加入该字段,其值应该为 70。如果请求消息中包含 Max-Forwards字段,且其值为零,则 SIP实体不得转发,并且返回 483(Too Many Hops)响应。SIP
8、 INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TCP 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwards: 69Contact: Via: SIP/2.0/TCP 192.168.5.162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE5F9C759FB02F679AFD6CB71394CFrom: ;tag=704b1683edd4438f
9、85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Call-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microsoft.rtc-multipartyContent-Type: application/sdpContent-Length: 134SIP消息的第二部分:消息头 (Message Header)From Tag, To Tag,和 Call-ID构成了 dialog信息,可以唯一标识一个 dialog。 在本次呼叫 (Call)中的所有请求和响应
10、将使用同样 dialog信息。Call-ID的构成:伪随机数字 +”+主机名或者 IP地址SIP INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TCP 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwards: 69Contact: Via: SIP/2.0/TCP 192.168.5.162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE5F9C75
11、9FB02F679AFD6CB71394CFrom: ;tag=704b1683edd4438f85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Call-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microsoft.rtc-multipartyContent-Type: application/sdpContent-Length: 134SIP消息的第二部分:消息头 (Message Header)CSeq: Command Sequence Number
12、用于标识事务并对事务排序。由一个序列号和请求方法组成。呼叫开始时初始化 CSeq。非 REGISTER请求的 CSeq,序列号值可以是一个任意的 32位无符号整数。 CSeq按照各自方向严格单向按 1递增。CSeq能够区分某个请求是新请求还是重发的请求。SIP INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TCP 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwards: 69Contact: Via: SIP/2.0/TCP 192.168.5.
13、162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE5F9C759FB02F679AFD6CB71394CFrom: ;tag=704b1683edd4438f85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Call-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microsoft.rtc-multipartyContent-Type: application/
14、sdpContent-Length: 134SIP消息的第二部分:消息头 (Message Header)Contact: 包含的 SIP/SIPS URI是 UA希望用来接收请求的地址,后续请求可以用它来联系到当前 UA。如果代理服务器没有插入 Record-Route字段来希望自己留在后续请求消息的传输路径上,那么可以忽略这些代理服务器,后续请求直接用 Contact字段的URI来通讯。当 Contact中包含一个显示名称时,带有所有的 URI参数的 URI应该放入尖括号中。SIP INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TC
15、P 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwards: 69Contact: Via: SIP/2.0/TCP 192.168.5.162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE5F9C759FB02F679AFD6CB71394CFrom: ;tag=704b1683edd4438f85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Cal
16、l-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microsoft.rtc-multipartyContent-Type: application/sdpContent-Length: 134SIP消息的第二部分:消息头 (Message Header)Record-Route: 如果代理服务器希望自己留在后续请求消息的传输路径上,而这些后续请求消息属于由当前请求创建的一个对话,那么即使请求中已经出现了 Route字段,代理服务器也必须在请求消息的拷贝中已有的 Record-Route字段值之前插入一个 Reco
17、rd-Route字段。SIP INVITEINVITE sip:;transport=tcp SIP/2.0Via: SIP/2.0/TCP 192.168.5.162;branch=z9hG4bK381ACAFC.537D4376;branched=FALSE;Max-Forwards: 69Contact: Via: SIP/2.0/TCP 192.168.5.162:11499;ms-received-port=2992;ms-received-cid=b100Record-Route: ;tag=9B8AE5F9C759FB02F679AFD6CB7From: ;tag=704b168
18、3edd4438f85a34adb6201e078;epid=d9176cec0cTo: ;epid=203e516cd9Call-ID: d455d3faf197403482154b9a319f54e0CSeq: 1 INVITERequire: com.microsoft.rtc-multipartyContent-Type: application/sdpContent-Length: 134SIP消息的第二部分:消息头 (Message Header)Content-Type: 定义消息实体的类型,如 text/plain,或 application/sdp。如果消息体不为空, Content-Type字段必须存在。Content-Length: 定义消息实体的长度,单位为字节。SIP消息实体不能采用 HTTP 1.1中所定义的 “Chunked”传送编码机制。