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-Forwards
response头里的
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 请求使用,不能包括
Require
orProxy-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 必须生成
ACK
request 为 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