WebRTC的ICE之STUN协议

WebRTC的ICE之STUN协议


WebRTC专题开嗨鸭 !!!

前言

WebRTC是音视频行业的标杆, 如果要学习音视频, WebRTC是进入音视频行业最好方法, 里面可以有成熟方案, 例如:音频中3A 算法、网络评估、自适应码流、Simulcast、SVC等等 , 非常适合刚刚进入音视频行业小伙伴哈_ 我也是哦, 以后再音视频行业长期打算的小伙伴的学习项目。 里面有大量知识点

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、 STUN协议

在这里插入图片描述

STUN header和STUN Body组成的

  1. 包括20字节的STUN header
  2. Body中可以有0个或多个Attribute

二、 STUN协议头格式

在这里插入图片描述

三、 STUN Header

  1. 2个字节(16bit)类型
  2. 2个字节(16bit)信息长度、不包括信息头
  3. 16个字节(128bit)事务ID、请求与响应事务ID相同

四、STUN Message Type

  1. 前两位必须是00、以区分复用同一个端口时STUN协议
  2. 2位用于分类、即C0和C1
  3. 12 位用于定义请求/指示

C表示分类,M 表示方法

在这里插入图片描述

1 、C0C1

  1. 0b00: 表示是一个请求
  2. 0b01: 表示是一个指示
  3. 0b10: 表式是请求成功的响应
  4. 0b11: 表示是请求失败的响应

2、 STUN信息类型

在这里插入图片描述

3 、大小端模式

大端模式: 数据的高字节保存在内存的低地址中
小端模式: 数据的高字节保存在内存的高地址中
网络字节顺序: 采用大端排序方式

五、 StunMagicCookie

4字节、32位、固定值0x2112A442。通过它可以判断客户端是否可以支持某些属性

六、Transaction ID事务ID

12字节、96位、标识同一个事物的请求和响应

七、STUN Message Body

  1. 信息头后有0或多个属性
  2. 每个塑性进行TLV编码: Type、Length、Value

在这里插入图片描述

八、RFC 3489定义的属性

在这里插入图片描述

九、 WebRTC中代码


bool StunMessage::Read(ByteBufferReader* buf) {
  if (!buf->ReadUInt16(&type_))
    return false;

  if (type_ & 0x8000) {
    // RTP and RTCP set the MSB of first byte, since first two bits are version,
    // and version is always 2 (10). If set, this is not a STUN packet.
    return false;
  }

  if (!buf->ReadUInt16(&length_))
    return false;

  std::string magic_cookie;//0x2112A442
  if (!buf->ReadString(&magic_cookie, kStunMagicCookieLength))
    return false;

  std::string transaction_id; // 12bit
  if (!buf->ReadString(&transaction_id, kStunTransactionIdLength))
    return false;

  uint32_t magic_cookie_int;
  static_assert(sizeof(magic_cookie_int) == kStunMagicCookieLength,
                "Integer size mismatch: magic_cookie_int and kStunMagicCookie");
  std::memcpy(&magic_cookie_int, magic_cookie.data(), sizeof(magic_cookie_int));
  if (rtc::NetworkToHost32(magic_cookie_int) != kStunMagicCookie) {
    // If magic cookie is invalid it means that the peer implements
    // RFC3489 instead of RFC5389.
    transaction_id.insert(0, magic_cookie);
  }
  RTC_DCHECK(IsValidTransactionId(transaction_id));
  transaction_id_ = transaction_id;
  reduced_transaction_id_ = ReduceTransactionId(transaction_id_);
  printf(
      "type_ = %u, magic_cookie = %s, transaction_id = %s, magic_cookie_int = "
      "%u\n ",
      type_, magic_cookie.c_str(), transaction_id.c_str(), magic_cookie_int);
  if (length_ != buf->Length())
    return false;

  attrs_.resize(0);

  size_t rest = buf->Length() - length_;
  while (buf->Length() > rest) {
    uint16_t attr_type, attr_length;
    if (!buf->ReadUInt16(&attr_type))
      return false;
    if (!buf->ReadUInt16(&attr_length))
      return false;

    std::unique_ptr<StunAttribute> attr(
        CreateAttribute(attr_type, attr_length));
    if (!attr) {
      // Skip any unknown or malformed attributes.
      if ((attr_length % 4) != 0) {
        attr_length += (4 - (attr_length % 4));
      }
      if (!buf->Consume(attr_length))
        return false;
    } else {
      if (!attr->Read(buf))
        return false;
      attrs_.push_back(std::move(attr));
    }
  }

  RTC_DCHECK(buf->Length() == rest);
  return true;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值