# WebRTC **Repository Path**: RainbowHair/WebRTC ## Basic Information - **Project Name**: WebRTC - **Description**: 基于WebRTC实现的音视频设备调用 视频特效 消声 降噪 和 桌面共享功能 可以搭配流媒体服务器实现直播功能 - **Primary Language**: NodeJS - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 0 - **Created**: 2020-04-29 - **Last Updated**: 2025-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 这是一个使用WebRTC实现的音视频和桌面共享和聊天室的应用 使用node作为服务器 使用WebRTC的首要条件是HTTPS 这里使用的是OpenSSL生成的SSL 如果有域名的话可以获取免费的SSL证书 public里的chatroom是聊天室 需要引入socket.io device 的index_share是桌面共享 index_capture是音视频相关 使用node搭建信令服务器作为各个节点的数据通信中转 WebRTC使用的是P2P模式 所以对带宽会有浪费 使用STUN进行NAT穿越 使用TURN可以使用云服务进行流媒体转发 使用ICE框架进行协议的选择 最优先的是NAT穿越 下面是NAT类型判断 客户端发送Echo请求到服务端 服务端对同样的IP和端口进行返回数据 如果没有回来 说明这个UDP不通 如果收到了可以收到客户端生成的公网IP和端口 然后判断生成公网IP和port和内网IP和port是否一致 如果一致 ( 说明没有被NAT 但是要证明是不是真的公网 然后在发送一个Echo到第一个IP和Port 然后使用第二个IP和Port回信息 如果收到了 说明是公网 如果没有收到 说明在一个对称的防火墙后面 ) 如果不一致( 说明被NAT了 发送请求给第一个IP和Port 然后使用第二个IP和Port回信息 收到了 是完全锥型 收不到 向第二个IP和端口发送数据 然后判断两次的IP和端口 如果IP不同就是对称型 如果相同就是限制型 向第一个IP和Port发送请求 然后使用相同IP不同Port穿回来 如果收不到就是端口限制型 可以收到就是地址限制型 ) RFC STUN规范: RFC3489 通过UDP进行穿越 RFC5389 包括UDP和TCP两个进行穿越 RFC5389报文: 2字节类型 00开头 2字节消息长度 4字节成为Magic Cookie 12字节事务ID RFC3486报文: 2字节类型 2字节消息长度 16字节事务ID 用于请求响应匹配 Message Type: 前两位必须是00用来区分复用同一端口时的STUN协议 C0C1用来分类: 0b00:表示一个请求 0b01:表示是一个指示 0b10:请求成功 0b11:表示请求失败 剩下12位用于不同请求的定义 消息类型: 0x0001:绑定消息 0x0002:私密请求 0x0101:绑定响应 0x0102:私密的响应 0x0111:绑定错误 0x0112:私密的错误 使用WireShark和tcpdump进行抓包的时候可以根据STUN的报文来判断STUN使用的是那个协议