Featured image of post sip协议(rfc2361)要点笔记(一)

sip协议(rfc2361)要点笔记(一)

sip协议(rfc2361)原文

sip协议原文:rfc2361

旧版sip协议原文:rfc2543

基础要点

  1. 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

  1. response line的格式为:

SIP-Version SP Status-Code SP Reason-Phrase CRLF

SIP-Version 是sip协议版本号,Status-Code 是响应码,Reason-Phrase 是响应短语,CRLF 是回车换行。

  1. Header字段
  • 格式:field-name: field-value
1
2
3
4
Subject:            lunch
Subject      :      lunch
Subject            :lunch
Subject: lunch

以上都是正确的格式,但是Subject:lunch是最好的格式。

  • field-name相同的可以有多个,以下都是等价的
1
2
3
4
Route: <sip:alice@atlanta.com>
Subject: Lunch
Route: <sip:bob@biloxi.com>
Route: <sip:carol@chicago.com>
1
2
3
Route: <sip:alice@atlanta.com>, <sip:bob@biloxi.com>
Route: <sip:carol@chicago.com>
Subject: Lunch
1
2
3
Subject: Lunch
Route: <sip:alice@atlanta.com>, <sip:bob@biloxi.com>,
       <sip:carol@chicago.com>

Route是有顺序的,以下两个是不等价的

1
2
3
Route: <sip:alice@atlanta.com>
Route: <sip:bob@biloxi.com>
Route: <sip:carol@chicago.com>
1
2
3
Route: <sip:bob@biloxi.com>
Route: <sip:alice@atlanta.com>
Route: <sip:carol@chicago.com>
  • 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
  1. 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的ToURL一样。

    如何request头里Totag,response的To必须和request的To一样。

  1. 无状态的UAS
1
2
3
4
不会发送(1xx)response
不会重传response
忽略ACK request
忽略CANCEL request
  1. CANCEL 最好只对INVITE 请求使用,不能包括RequireorProxy-Require
  2. REGISTER
  • response 带有Date字段,会通知client校准本地时间
  • response 不能带Record-Route字段,如果request带Record-Route字段, UAS要忽略掉。
  • expires的优先级高于Expires字段
  • 200(OK)response必带Contact字段,以及expires参数
  1. 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>

那么请求为:

1
2
METHOD sip:proxy1
Route: <sip:proxy2>,<sip:proxy3;lr>,<sip:proxy4>,<sip:user@remoteua>
  • 如果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

最后更新于 2025-02-13
本博客已稳定运行
发表了26篇文章 · 总计45.09k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计