sip协议(rfc2361)原文
sip协议原文:rfc2361
旧版sip协议原文:rfc2543
基础要点
- request line的格式为:
Method SP Request-URI SP SIP-Version CRLF
SP 是空格,Request-URI 是请求的资源,SIP-Version 是sip协议版本号,CRLF 是回车换行。
信令主要有:REGISTER,INVITE,ACK,CANCEL,BYE,OPTIONS,INFO,SUBSCRIBE,NOTIFY,REFER,MESSAGE
uri完整格式:
sip:user:password@host:port;uri-parameters?headers
- response line的格式为:
SIP-Version SP Status-Code SP Reason-Phrase CRLF
SIP-Version 是sip协议版本号,Status-Code 是响应码,Reason-Phrase 是响应短语,CRLF 是回车换行。
- Header字段
- 格式:
field-name: field-value
|
|
以上都是正确的格式,但是Subject:lunch是最好的格式。
- field-name相同的可以有多个,以下都是等价的
|
|
|
|
|
|
Route是有顺序的,以下两个是不等价的
|
|
|
|
- field-name 是没有大小写区分的,但是field-value 是区分大小写的。
- field-name 可以缩写,避免超过MTU.
- Header缩写表
field-name 简写 Call-ID i Contact m Content-Encoding e Content-Length l Content-Type c From f Subject s Supported k To t Via v
- UAC
-
请求头必须有六要素:
From, To, Call-ID, CSeq, Via, Max-Forwardsresponse头里的
From,Call-ID,CSeq必须和request头里的相同。response的Via包含request的Via如果request头里
To没有tag,response的To里的URL必须和request的To的URL一样。如何request头里
To有tag,response的To必须和request的To一样。
- 无状态的UAS
|
|
- CANCEL 最好只对INVITE 请求使用,不能包括
RequireorProxy-Require头 - REGISTER
- response 带有
Date字段,会通知client校准本地时间 - response 不能带
Record-Route字段,如果request带Record-Route字段, UAS要忽略掉。 expires的优先级高于Expires字段- 200(OK)response必带
Contact字段,以及expires参数
- dialog
- 如果response没有收到
route,UAC 必须把remote target uri 放到Request-URI里,然后请求不能加Route头 - 如果reponse收到
route,并且route里的第一个uri包含lr字段, uac必须把remote target uri 放到Request-URI里, 然后请求添加Route头,把respose的route放到Route头里。 - 如果response收到
route,并且route里的第一个uri不包含lr字段, uac必须把route里的第一个uri去掉其他的参数放到Request-URI里, 然后请求头添加Route,response的route放到Route头里。 把remote target uri 放到``Route`最后。
例子:remote target is sip:user@remoteua and the route set contains:
<sip:proxy1>,<sip:proxy2>,<sip:proxy3;lr>,<sip:proxy4>
那么请求为:
|
|
-
如果uac收到2xx repsonse, 那么uac 必须使用response的
Contact作为remote target uri -
如果uas收到request时,那么uas 必须把request的
Contact作为 remote target uri来发送请求 -
uac 必须生成
ACKrequest 为 2xx response, ACK的CSeq number和INVITE的CSeq number相同 -
uas 收到INVITE 没有SDP信息时,uas必须返回2xx response 带有SDP信息,这个就是(UPDATE)
Proxy流转
注意: mermaid不支持
;目前使用|代替
基础流程
sequenceDiagram
actor U1 as U1<br/>u1.example.com
participant P1 as P1<br/>example.com
participant P2 as P2<br/>domain.com
actor U2 as U2<br/>u2.domain.com
U1->>P1: INVITE sip:callee@domain.com SIP/2.0<br/> Contact: sip:caller@u1.example.com
P1->>P2: INVITE sip:callee@domain.com SIP/2.0 <br/> Contact: sip:caller@u1.example.com <br/> Record-Route: <sip:p1.example.com|lr>
P2->>U2: INVITE sip:callee@u2.domain.com SIP/2.0 <br/> Contact: sip:caller@u1.example.com <br/> Record-Route: <sip:p2.example.com|lr> <br/> Record-Route:<sip:p1.example.com|lr>
U2->>P2: SIP/2.0 200 OK <br/> Contact: sip:callee@u2.domain.com <br/> Record-Route: <sip:p2.domain.com|lr> <br/> Record-Route: <sip:p1.example.com|lr>
P2->>P1: SIP/2.0 200 OK <br/> Contact: sip:callee@u2.domain.com <br/> Record-Route: <sip:p2.domain.com|lr> <br/> Record-Route: <sip:p1.example.com|lr>
P1->>U1: SIP/2.0 200 OK <br/> Contact: sip:callee@u2.domain.com <br/> Record-Route: <sip:p2.domain.com|lr> <br/> Record-Route: <sip:p1.example.com|lr>
U1->>P1: BYE sip:callee@u2.domain.com SIP/2.0 <br/> Route: <sip:p1.example.com|lr> <br/> Route:<sip:p2.domain.com|lr>
P1->>P2: BYE sip:callee@u2.domain.com SIP/2.0 <br/> Route:<sip:p2.domain.com|lr>
P2->>U2: BYE sip:callee@u2.domain.com SIP/2.0
严格路由流程
- 这是U1请求U2,但是经过中间P1,P2,P3,P4转发
sequenceDiagram
actor U1 as U1<br/>u1.example.com
participant P1 as P1<br/>example.com
participant P2 as P2<br/>example.com
participant P3 as P3<br/>middle.com
participant P4 as P4<br/>domain.com
actor U2 as U2<br/>u2.domain.com
U1->>P1: INVITE sip:callee@domain.com SIP/2.0<br/> Contact: sip:caller@u1.example.com
P1->>P2: INVITE sip:callee@domain.com SIP/2.0 <br/> Contact: sip:caller@u1.example.com <br/> Record-Route: <sip:p1.example.com|lr>
P2->>P3: INVITE sip:callee@domain.com SIP/2.0 <br/> Contact: sip:caller@u1.example.com <br/> Record-Route: <sip:p2.example.com|lr> <br/> Record-Route:<sip:p1.example.com|lr>
P3->>P4: INVITE sip:callee@domain.com SIP/2.0 <br/> Contact: sip:caller@u1.example.com <br/> Record-Route: <sip:p3.middle.com> <br/> Record-Route:<sip:p2.example.com|lr> <br/> Record-Route:<sip:p1.example.com|lr>
P4->>U2: INVITE sip:callee@u2.domain.com SIP/2.0 <br/> Contact: sip:caller@u1.example.com <br/> Record-Route: <sip:p4.domain.com|lr> <br/> Record-Route:<sip:p3.middle.com> <br/> Record-Route:<sip:p2.example.com|lr> <br/> Record-Route:<sip:p1.example.com|lr>
U2->>P4: BYE sip:caller@u1.example.com SIP/2.0 <br/> Route: <sip:p4.domain.com|lr> <br/> Route:<sip:p3.middle.com> <br/> Route:<sip:p2.example.com|lr> <br/> Route:<sip:p1.example.com|lr>
P4->>P3: BYE sip:p3.middle.com SIP/2.0 <br/> Route:<sip:p2.example.com|lr> <br/> Route:<sip:p1.example.com|lr> <br/> Route:<sip:caller@u1.example.com>
P3->>P2: BYE sip:p2.example.com|lr SIP/2.0 <br/> Route:<sip:p1.example.com|lr> <br/> Route:<sip:caller@u1.example.com>
P2->>P1: BYE sip:caller@u1.example.com SIP/2.0 <br/> Route:<sip:p1.example.com|lr>
P1->>U1: BYE sip:caller@u1.example.com SIP/2.0
- U1请求P1,P1转发U2
sequenceDiagram
actor U1 as U1<br/>u1.example.com
participant P1 as P1<br/>p1.middle.com
actor U2 as U2<br/>u2.domain.com
U1->>P1: INVITE sip:callee@middle.com SIP/2.0<br/> Contact: <sip:caller@u1.example.com>
P1->>U2: INVITE sip:callee@u2.domain.com SIP/2.0 <br/> Contact: <sip:caller@u1.example.com> <br/> Record-Route: <sip:p1.middle.com|lr>
U2->>P1: SIP/2.0 200 OK <br/> Contact: <sip:callee@u2.domain.com> <br/> Record-Route: <sip:p1.middle.com|lr>
P1->>U1: SIP/2.0 200 OK <br/> Contact: <sip:callee@u2.domain.com> <br/> Record-Route: <sip:p1.middle.com|lr>
U1->>P1: BYE sip:callee@u2.domain.com SIP/2.0 <br/> Route: <sip:p1.middle.com|lr>
P1->>U2: BYE sip:callee@u2.domain.com SIP/2.0