zoukankan      html  css  js  c++  java
  • 简便的SIP消息--我们来看看SIP消息的格式

    疫情期间,学校停课,北京的学校都在家上网络课堂,大家使用的不是腾讯视频会议便是钉钉视频会议。

    疫情对大部分企业都造成了损失,然而视频会议市场却迎来生机。

    今天咱们来谈谈视频会议中使用的SIP协议是什么样子的。

    咱们立刻用SIP终端发起一个呼叫,然后抓取网络包如下,我们看到它包含很多A:B这种格式的数据,这些就叫SIP Header,和HTTP Header差不多。

    下面是发起呼叫的invite  SIP消息

    INVITE sip:6999 SIP/2.0

    From: <sip:112826@136.123.127.49>;tag=1b7ffa38-6800a8c0-13c4-60011-8ca1-5ce4ed6e-8ca1

    To: <sip:6999>

    Call-ID: 1b855600-6800a8c0-13c4-60011-8ca1-614dc2d0-8ca1

    CSeq: 1 INVITE

    Via: SIP/2.0/UDP 136.123.127.49:5060;rport;branch=z9hG4bK-8ca1-2255705-7fc7db28-1b7c8d00

    Max-Forwards: 70

    Supported: replaces,timer,100rel

    Allow: INVITE, ACK, BYE, REFER, NOTIFY, INFO, CANCEL

    User-Agent: Sherlock 3.2.0.8

    Contact: <sip: 112826@136.123.127.49>

    Session-Expires: 1800;refresher=uac

    咱们再看看被邀请的一方返回的SIP消息

    SIP/2.0 200 OK

    From: <sip: 112826@136.123.127.49>;tag=1b7ffa38-6800a8c0-13c4-60011-8ca1-5ce4ed6e-8ca1

    To: <sip:6999>;tag=7f231e4ff028-e46b820a-13c4-55022-22b3fa-3ca0854f-22b3fa

    Call-ID: 1b855600-6800a8c0-13c4-60011-8ca1-614dc2d0-8ca1

    CSeq: 1 INVITE

    SIP消息包含了很多SIP Headers,它很容易看懂,咱们挑几个看一下

    1. 1.       INVITE sip:6999 SIP/2.0

    它的意思是,这是一个invite消息,呼叫的对象是sip:6999,SIP协议版本是2.0

    1. 2.       From: <sip:112826@136.123.127.49>;tag=1b7ffa38-6800a8c0-13c4-60011-8ca1-5ce4ed6e-8ca1

    它的意思是这个invite消息来自谁,tag用来标识这个谁

    1. 3.       To: <sip:6999>

    它的意思很明显,就是发送给谁

    1. 4.       Call-ID: 1b855600-6800a8c0-13c4-60011-8ca1-614dc2d0-8ca1

    它的意思也很明显,就是呼叫的ID,用来标识这次呼叫

    1. 5.       CSeq: 1 INVITE

    1 是个序列号,一个对话包含很多请求,一般情况下每次发起一个新的请求,这个序列号会+1

    INVITE 这个是请求的名字。

    这个CSeq有好几个用途

    1)       解决失序问题

    比如一个request发送到了远端,远端也有序列号,如果远端发现新过来的request里的序列号比自己的序列号低,就认为这个请求顺序乱了,就会返回一个500的内部错误(Server Internal Error)。

    2)       用来区分是新请求还是重新发送的请求

    比如re-Invite请求是个新请求,序列号会+1

    retransmitted invite就只是重传原来的请求,序号不会+1

    远端根据这个序列号就能知道,这是一个新请求,还是重新发送的请求。

    3)       用来判断response对应哪个request.

    比如UAC先发了一个invite request, 紧接着发送一个cancel request. 这两个request 都可能发送回来200OK response,UAC怎么知道到底这个200OK response是invite request的,还是cancel request的?就靠CSeq里的请求名字。

    比如我们前面的例子里的200OK的消息,它里面的CSeq是这样的:

    CSeq: 1 INVITE

    这说明这个200OK的response是对应invite request的。

    是不是很简单,比H323简单多了。现在视频会议大都通过SIP消息来控制会议,H323协议慢慢被淘汰了。

    不知道钉钉和腾讯使用什么协议,也有可能是使用自己的私有协议,但最大可能是使用SIP,在网络上抓个包,立刻就能知道了。

    Reference: https://tools.ietf.org/html/rfc3261

  • 相关阅读:
    面向对象的本质是算法的上下文封装,是同一类属的行为接口的一致性
    结构化方法和面向对象方法的比较
    需求文档和软件都是服务的集合
    注意 Laravel 清除缓存 php artisan cache:clear 的一个坑
    面向对象复习笔记(一)
    详解如何在Laravel中增加自定义全局函数
    Laravel 引入自定义类库或第三方类库
    PHP怎么调用其他类的方法
    Laravel如何引用第三方(自定义)库
    laravel框架手机发送验证码
  • 原文地址:https://www.cnblogs.com/dapplehou/p/12784373.html
Copyright © 2011-2022 走看看