首页 文章

为什么WebRTC需要信令服务器?

提问于
浏览
25

WebRTC是一种协议,用于定义对等体之间的媒体数据的传输方法 . 了解 . 它也适用于RTP / UDP . 这也明白了 .

在讨论有关信令服务器时,提到它需要进行兼容性检查/通道启动等等 .

My Question is : Having said above,

1)是否意味着信令服务器是强制性的?

2)WebRTC是否具有在没有签名服务器的情况下直接与其他对等方交谈的智能?

3)与webRTC相关的每篇文章都以“浏览器与浏览器通信之间的状态?”开头,是否意味着,webRTC不能用于a)带摄像头的嵌入式设备[无浏览器],b)其他地方的浏览器 .

4)此外,如果使用webRTC与传统的流式传输方式相比,获得的收益是多少? [老实说,我不知道遗留的方式] .

我知道这是一个理论问题 . 虽然,我看到这种问题可能在不同的背景下浮现在互联网上 . 希望这个问题能给出一些架构层面的答案谢谢 .

4 回答

  • 8

    WebRTC doesn't solve discovery (nor should it).

    WebRTC知道如何在没有信令服务器的情况下直接与另一个对等方通话,但它不知道如何发现另一个对等方 . 发现是一个固有的问题,所以我有点困惑,人们希望WebRTC为他们解决它 .

    想一想:你怎么打电话给我?您如何指导您的计算机与我联系而不是其他十亿人?通过GPS坐标?电子邮件地址?静态IP? IRC?即时消息? Facebook的?电话号码?

    另外,我怎么知道你什么时候打电话?我的电脑会“响”吗?使用常规Web技术有数百种方法可以解决这个问题,因此如果WebRTC采用特定的方式,那么它将对您造成伤害 . 您的申请背景可能会告知最佳联系方式 . 也许我在一些在线论坛或在线游戏的虚拟房间遇到你?

    从技术上讲,你并不需要一个带WebRTC的信令服务器,只要你有其他方法可以向你的同伴提供SDP报价(一段文字),并通过电话接收相应的SDP答案 . 文字,IM,irc,电子邮件或信鸽 . 在Chrome或Firefox中尝试此操作:https://jsfiddle.net/nnc13tw2 - 单击"Offer"(等待最多20秒),将输出发送给您的朋友,将其粘贴到其末尾的同一字段中并按Enter键,然后让他们发回答案,然后粘贴在答案字段中按Enter键 . 您现在应该已连接,并且从未涉及任何连接服务器 .

    为什么jsfiddle工作:它将SDP中的所有ICE候选者打包,这可能需要几秒钟,一次性为您提供所需的一切 .

    一些高级功能,例如改变呼叫中等的视频源的数量等也需要信令,但是一旦 Build 了呼叫,应用就可以使用其自己的数据信道来满足对等体之间的任何进一步的信令需求 .

    Stackoverflow现在要求我包含链接到jsfiddle的代码,所以我也可以在这里包含它(尽管如果你在Chrome上使用上面的小提琴,因为相机访问似乎不适用于片段):

    var config = { iceServers: [{ urls: "stun:stun.l.google.com:19302" }]};
    
    var dc, pc = new RTCPeerConnection(config);
    pc.onaddstream = e => v2.srcObject = e.stream;
    pc.ondatachannel = e => dcInit(dc = e.channel);
    v2.onloadedmetadata = e => log("Connected!");
    
    var haveGum = navigator.mediaDevices.getUserMedia({video:true, audio:true})
      .then(stream => pc.addStream(v1.srcObject = stream))
      .catch(failed);
    
    function dcInit() {
      dc.onopen = () => log("Chat!");
      dc.onmessage = e => log(e.data);
    }
    
    function createOffer() {
      button.disabled = true;
      dcInit(dc = pc.createDataChannel("chat"));
      haveGum.then(() => pc.createOffer()).then(d => pc.setLocalDescription(d)).catch(failed);
      pc.onicecandidate = e => {
        if (e.candidate) return;
        offer.value = pc.localDescription.sdp;
        offer.select();
        answer.placeholder = "Paste answer here";
      };
    };
    
    offer.onkeypress = e => {
      if (!enterPressed(e) || pc.signalingState != "stable") return;
      button.disabled = offer.disabled = true;
      var desc = new RTCSessionDescription({ type:"offer", sdp:offer.value });
      pc.setRemoteDescription(desc)
        .then(() => pc.createAnswer()).then(d => pc.setLocalDescription(d))
        .catch(failed);
      pc.onicecandidate = e => {
        if (e.candidate) return;
        answer.focus();
        answer.value = pc.localDescription.sdp;
        answer.select();
      };
    };
    
    answer.onkeypress = e => {
      if (!enterPressed(e) || pc.signalingState != "have-local-offer") return;
      answer.disabled = true;
      var desc = new RTCSessionDescription({ type:"answer", sdp:answer.value });
      pc.setRemoteDescription(desc).catch(failed);
    };
    
    chat.onkeypress = e => {
      if (!enterPressed(e)) return;
      dc.send(chat.value);
      log(chat.value);
      chat.value = "";
    };
    
    var enterPressed = e => e.keyCode == 13;
    var log = msg => div.innerHTML += "<p>" + msg + "</p>";
    var failed = e => log(e);
    
    <video id="v1" height="120" width="160" autoplay muted></video>
    <video id="v2" height="120" width="160" autoplay></video><br>
    <button id="button" onclick="createOffer()">Offer:</button>
    <textarea id="offer" placeholder="Paste offer here"></textarea><br>
    Answer: <textarea id="answer"></textarea><br><div id="div"></div>
    Chat: <input id="chat"></input><br>
    <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
    
  • 0
    • 是的,信令是强制性的,以便ICE候选者等进行交换,以便对等连接知道其对等方是谁

    • 不,如果没有某种交换,它怎么会知道它的同行呢?

    • 不,这并不意味着 . 我使用raspis和其他本机设备进行了大量实验,我通过WebRTC对等连接将视频流式传输到浏览器页面 .

    • 你在说什么?你的意思是使用WebRTC与Flash和中央服务器的收益? WebRTC是点对点的,如果你将它与GetUserMedia和Html5相结合,你就不需要flash和中央媒体服务器来处理所有的媒体交换 .

  • 6

    您需要一个信令服务器才能在两个任意对等体之间 Build 连接;它是当今使用的互联网架构的简单现实 .

    要联系Web上的其他对等方,您需要先了解其IP地址 . 已经存在第一个问题 . 您需要知道对等方的IP地址 . 如果没有坐在这些计算机上的人通过电话互相通话并指示IP收件人,你将如何从对等方A获得此信息?为此,每个对等体首先发现自己的地址,然后将其发送给另一个对等体 . 这打开了还有两个问题:对等体如何发现其向外的IP地址(可能与其自身的IP有很大不同),以及如何将其传达给未知地址的其他对等体?

    这是信令服务器的用武之地 . 两个对等体在彼此连接之前都与信令服务器 Build 了连接 . 因此,他们使用信令服务器代表他们转发消息,直到他们协商了直接的谈话方式 . 在本地子网上没有第三方帮助的情况下协商连接是可能的;但这种情况可能很少见,我甚至不确定规范是否正在解决它 .

    至于3):WebRTC可以在任何设备上实现,它只是一个协议;它并不仅限于浏览器 .

    至于4):从一个浏览器到另一个浏览器的任何流式传输方式总是涉及中间的中继服务器 . 该服务器具有很高的CPU和带宽要求,是一个昂贵的瓶颈 . 除轻量级信令服务器外,WebRTC无需中间人即可实现直接P2P连接 . 此外,之前并没有真正的开放标准;大部分时间你都会以这种或那种方式向Adobe支付一些钱 .

  • 37

    大多数答案已被涵盖,只是想我会添加一些东西 . 当Google第一次创建webRTC并在4年前开源时,它就严格按照自己的方式进行,没有任何信令功能 .

    然而,最近谷歌收购了Firebase,所以我很快就会打赌,他们将很快为WebRTC开放一个完整的端到端解决方案,这样我们所有人都可以更轻松地实施它 .

    说到Firebase,我尝试了它并且它还不错,完成了基本的工作:http://antonvolt.com/prototype2/

相关问题