Intro
This time, I will try reading Offer messages.
I output the logs of my application created with Pion/WebRTC.
Both the client and server side run on a single machine.
Environments
- Surface Pro 6
- Windows 11 Pro Insider Preview ver.22H2
- Google Chrome ver.103.0.5060.66
- Go ver.go1.18.3 windows/amd64
- Pion/WebRTC ver.3.1.42
SDP(Session Description Protocol)
Peers send data to each other in SDP format to establish a WebRTC connection.
According to SDP specifications, the Offer message can be divided into four parts.
- Session-Level Section
- Media Description(Video)
- Media Description(Audio)
Media Description(Data Channel)
Although my application can share video and audio tracks with multiple clients, the stream to establish WebRTC connection is Unicast stream.
Offer
Session-Level Section
SDP Offer Message
# [RFC8866 - 5.1] Session Description Protocol version is 0 v=0 # [RFC8866 - 5.2] user-name:-, sess-id:8899840538985226342, sess-verison:1656783194 # nettype:Internet, addtype:IPv4, unicast-address:0.0.0.0 o=- 8899840538985226342 1656783194 IN IP4 0.0.0.0 # [RFC8866 - 5.3][RFC3264 - 5] Session Name:- s=- # [RFC8866 - 5.9][RFC3264 - 5] The session is regarded as permanent t=0 0 # [RFC8445 - 7.2.4][RFC8122 - 5] A finger print for connectivity check a=fingerprint:sha-256 B5:9E:D5:18:B5:CB:F6:2C:C7:E9:4B:03:08:98:70:AC:4F:49:1D:B5:A1:90:85:5C:22:83:92:AA:17:FB:C8:3E # [RFC8285 - 6] Negotiate the use of one byte and two bytes in the same RTP stream # (RFC8285 - 4.1.2, 4.2, 4.3) a=extmap-allow-mixed # [RFC5888 - 5][RFC8859 - 4.5][RFC8843 - 7.2.1] Use a single transport for sending and receiving medias # (video, audio, data channel) a=group:BUNDLE 0 1 2 ... Media Description(Video)
Most lines are media-level attributes for adding information about the media description.
SDP Offer Message
... # [RFC8866 - 5.14][RFC8840 - 4.1.1][RFC8839 - 4.2.5][RFC4145 - 4] # media type:video, transport port:9, transport protocol: UDP/TLS/RTP/SAVPF # format: 96 97 98 99 100 101 102 121 127 120 125 107 108 109 123 118 116 m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 123 118 116 # [RFC8866 - 5.7][RFC8839 - 4.2.5][RFC9143 - 7.1] This value must be the same with other bundled medias c=IN IP4 0.0.0.0 # [RFC4145 - 4] The endpoint is willing to accept an incoming connection or to initiate an outgoing connection. a=setup:actpass # [RFC5888 - 4] Media Stream ID for grouping a=mid:0 # [RFC8839 - 4.2.1.3, 4.2.5, 5.4] username fragment for STUN connectivity checks a=ice-ufrag:hqOEoWujrDVDRqSt # [RFC8839 - 4.2.1.3, 4.2.5, 5.4] password for STUN connectivity checks a=ice-pwd:geVGJdXTqMLAdRTrCdzbcfebBTcXhSsg # [RFC5761 - 5.1.1][RFC9143 - 9.3.1] Multiplex RTP and RTCP onto a single port a=rtcp-mux # [RFC5506 - 5] To use Reduced-Size RTCP a=rtcp-rsize # [RFC8866 - 6.6] RTP payload type number:96, media format:VP8/90000 # media format: encoding-name/clock-rate a=rtpmap:96 VP8/90000 # [RFC4585 - 4.2] RTCP Feedback # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:96 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:96 ccm fir # [RFC4585 - 6.2.1] Generic NACK a=rtcp-fb:96 nack # [RFC4585 - 6.3.1] Picture Loss Indication (PLI) a=rtcp-fb:96 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:96 nack # [RFC4585 - 6.3.1] a=rtcp-fb:96 nack pli a=rtcp-fb:96 transport-cc # [RFC8866 - 6.6] a=rtpmap:97 rtx/90000 # [RFC8866 - 6.15] Media format-specific parameters what associated with the payload type number. a=fmtp:97 apt=96 # [RFC4585 - 6.2.1] a=rtcp-fb:97 nack # [RFC4585 - 6.3.1] a=rtcp-fb:97 nack pli a=rtcp-fb:97 transport-cc # [RFC8866 - 6.6] a=rtpmap:98 VP9/90000 # [RFC8866 - 6.15] a=fmtp:98 profile-id=0 # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:98 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:98 ccm fir # [RFC4585 - 6.2.1] a=rtcp-fb:98 nack # [RFC4585 - 6.3.1] a=rtcp-fb:98 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:98 nack # [RFC4585 - 6.3.1] a=rtcp-fb:98 nack pli a=rtcp-fb:98 transport-cc # [RFC8866 - 6.6] a=rtpmap:99 rtx/90000 # [RFC8866 - 6.15] a=fmtp:99 apt=98 # [RFC4585 - 6.2.1] a=rtcp-fb:99 nack # [RFC4585 - 6.3.1] a=rtcp-fb:99 nack pli a=rtcp-fb:99 transport-cc # [RFC8866 - 6.6] a=rtpmap:100 VP9/90000 # [RFC8866 - 6.15] a=fmtp:100 profile-id=1 # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:100 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:100 ccm fir # [RFC4585 - 6.2.1] a=rtcp-fb:100 nack # [RFC4585 - 6.3.1] a=rtcp-fb:100 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:100 nack # [RFC4585 - 6.3.1] a=rtcp-fb:100 nack pli a=rtcp-fb:100 transport-cc # [RFC8866 - 6.6] a=rtpmap:101 rtx/90000 # [RFC8866 - 6.15] a=fmtp:101 apt=100 # [RFC4585 - 6.2.1] a=rtcp-fb:101 nack # [RFC4585 - 6.3.1] a=rtcp-fb:101 nack pli a=rtcp-fb:101 transport-cc # [RFC8866 - 6.6] a=rtpmap:102 H264/90000 # [RFC8866 - 6.15] a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:102 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:102 ccm fir # [RFC4585 - 6.2.1] a=rtcp-fb:102 nack # [RFC4585 - 6.3.1] a=rtcp-fb:102 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:102 nack # [RFC4585 - 6.3.1] a=rtcp-fb:102 nack pli a=rtcp-fb:102 transport-cc # [RFC8866 - 6.6] a=rtpmap:121 rtx/90000 # [RFC8866 - 6.15] a=fmtp:121 apt=102 # [RFC4585 - 6.2.1] a=rtcp-fb:121 nack # [RFC4585 - 6.3.1] a=rtcp-fb:121 nack pli a=rtcp-fb:121 transport-cc # [RFC8866 - 6.6] a=rtpmap:127 H264/90000 # [RFC8866 - 6.15] a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:127 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:127 ccm fir # [RFC4585 - 6.2.1] a=rtcp-fb:127 nack # [RFC4585 - 6.3.1] a=rtcp-fb:127 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:127 nack # [RFC4585 - 6.3.1] a=rtcp-fb:127 nack pli a=rtcp-fb:127 transport-cc # [RFC8866 - 6.6] a=rtpmap:120 rtx/90000 # [RFC8866 - 6.15] a=fmtp:120 apt=127 # [RFC4585 - 6.2.1] a=rtcp-fb:120 nack # [RFC4585 - 6.3.1] a=rtcp-fb:120 nack pli a=rtcp-fb:120 transport-cc # [RFC8866 - 6.6] a=rtpmap:125 H264/90000 # [RFC8866 - 6.15] a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:125 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:125 ccm fir # [RFC4585 - 6.2.1] a=rtcp-fb:125 nack # [RFC4585 - 6.3.1] a=rtcp-fb:125 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:125 nack # [RFC4585 - 6.3.1] a=rtcp-fb:125 nack pli a=rtcp-fb:125 transport-cc # [RFC8866 - 6.6] a=rtpmap:107 rtx/90000 # [RFC8866 - 6.15] a=fmtp:107 apt=125 # [RFC4585 - 6.2.1] a=rtcp-fb:107 nack # [RFC4585 - 6.3.1] a=rtcp-fb:107 nack pli a=rtcp-fb:107 transport-cc # [RFC8866 - 6.6] a=rtpmap:108 H264/90000 # [RFC8866 - 6.15] a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:108 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:108 ccm fir # [RFC4585 - 6.2.1] a=rtcp-fb:108 nack # [RFC4585 - 6.3.1] a=rtcp-fb:108 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:108 nack # [RFC4585 - 6.3.1] a=rtcp-fb:108 nack pli a=rtcp-fb:108 transport-cc # [RFC8866 - 6.6] a=rtpmap:109 rtx/90000 # [RFC8866 - 6.15] a=fmtp:109 apt=108 # [RFC4585 - 6.2.1] a=rtcp-fb:109 nack # [RFC4585 - 6.3.1] a=rtcp-fb:109 nack pli a=rtcp-fb:109 transport-cc # [RFC8866 - 6.6] a=rtpmap:123 H264/90000 # [RFC8866 - 6.15] a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032 # [RFC4585][https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03 - 2.3] a=rtcp-fb:123 goog-remb # [RFC4585][RFC5104] a=rtcp-fb:123 ccm fir # [RFC4585 - 6.2.1] a=rtcp-fb:123 nack # [RFC4585 - 6.3.1] a=rtcp-fb:123 nack pli # [RFC4585 - 6.2.1] a=rtcp-fb:123 nack # [RFC4585 - 6.3.1] a=rtcp-fb:123 nack pli a=rtcp-fb:123 transport-cc # [RFC8866 - 6.6] a=rtpmap:118 rtx/90000 # [RFC8866 - 6.15] a=fmtp:118 apt=123 # [RFC4585 - 6.2.1] a=rtcp-fb:118 nack # [RFC4585 - 6.3.1] a=rtcp-fb:118 nack pli a=rtcp-fb:118 transport-cc # [RFC8866 - 6.6] a=rtpmap:116 ulpfec/90000 # [RFC4585 - 6.2.1] a=rtcp-fb:116 nack # [RFC4585 - 6.3.1] a=rtcp-fb:116 nack pli a=rtcp-fb:116 transport-cc # https://datatracker.ietf.org/doc/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 # RTP header extension and an RTCP message for use in congestion control algorithms for RTP-based media flows a=extmap:1 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 # [RFC8866 - 6.7.1] Receive-Only a=recvonly ... Media Description(Audio)
SDP Offer Message
... # [RFC8866 - 5.14][RFC8840 - 4.1.1][RFC8839 - 4.2.5][RFC4145 - 4] m=audio 9 UDP/TLS/RTP/SAVPF 111 9 0 8 # [RFC8866 - 5.7][RFC8839 - 4.2.5] c=IN IP4 0.0.0.0 # [RFC4145 - 4] a=setup:actpass # [RFC5888 - 4] a=mid:1 # [RFC8839 - 4.2.1.3, 4.2.5, 5.4] a=ice-ufrag:hqOEoWujrDVDRqSt # [RFC8839 - 4.2.1.3, 4.2.5, 5.4] a=ice-pwd:geVGJdXTqMLAdRTrCdzbcfebBTcXhSsg # [RFC5761 - 5.1.1][RFC9143 - 9.3.1] a=rtcp-mux # [RFC5506 - 5] a=rtcp-rsize # [RFC8866 - 6.6] a=rtpmap:111 opus/48000/2 # [RFC8866 - 6.15] a=fmtp:111 minptime=10;useinbandfec=1 a=rtcp-fb:111 transport-cc # [RFC8866 - 6.6] a=rtpmap:9 G722/8000 a=rtcp-fb:9 transport-cc # [RFC8866 - 6.6] a=rtpmap:0 PCMU/8000 a=rtcp-fb:0 transport-cc # [RFC8866 - 6.6] a=rtpmap:8 PCMA/8000 a=rtcp-fb:8 transport-cc # https://datatracker.ietf.org/doc/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 a=extmap:1 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 # [RFC8866 - 6.7.1] Receive-Only a=recvonly ... Media Description(Data Channel)
SDP Offer Message
... # [RFC8866 - 5.14][RFC8840 - 4.1.1][RFC8839 - 4.2.5][RFC4145 - 4][RFC8864] # media type:application, transport port:9, transport protocol: UDP/DTLS/SCTP # format: webrtc-datachannel m=application 9 UDP/DTLS/SCTP webrtc-datachannel # [RFC8866 - 5.7][RFC8839 - 4.2.5] c=IN IP4 0.0.0.0 # [RFC4145 - 4] a=setup:actpass # [RFC5888 - 4] a=mid:2 # [RFC8866 - 6.7.2] Send-Receive a=sendrecv # [RFC8841 - 5] SCTP-Port: Because "sctp-port" has no default value, this line can't be omitted a=sctp-port:5000 # [RFC8839 - 4.2.1.3, 4.2.5, 5.4] a=ice-ufrag:hqOEoWujrDVDRqSt # [RFC8839 - 4.2.1.3, 4.2.5, 5.4] a=ice-pwd:geVGJdXTqMLAdRTrCdzbcfebBTcXhSsg Resources
- RFC8866 - SDP: Session Description Protocol
- RFC3264 - An Offer/Answer Model with the Session Description Protocol (SDP)
- RFC5888 - The Session Description Protocol (SDP) Grouping Framework
- RFC8445 - Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal
- RFC8839 - Session Description Protocol (SDP) Offer/Answer Procedures for Interactive Connectivity Establishment (ICE)
- RFC8843 - Negotiating Media Multiplexing Using the Session Description Protocol(SDP)
- RFC8122 - Connection-Oriented Media Transport over the Transport Layer Security (TLS) Protocol in the Session Description Protocol (SDP)
- RFC8285 - A General Mechanism for RTP Header Extensions
- RFC9143 - Negotiating Media Multiplexing Using the Session Description Protocol(SDP)
- RFC4145 - TCP-Based Media Transport in the Session Description Protocol (SDP)
- RFC5761 - Multiplexing RTP Data and Control Packets on a Single Port
- RFC5506 - Support for Reduced-Size Real-Time Transport Control Protocol (RTCP):Opportunities and Consequences
- RFC4585 - Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF)
- RFC8841 - Session Description Protocol (SDP) Offer/Answer Procedures for Stream Control Transmission Protocol (SCTP) over Datagram Transport Layer Security (DTLS) Transport
- RTCP message for Receiver Estimated Maximum Bitrate draft-alvestrand-rmcat-remb-03
- RTP Extensions for Transport-wide Congestion Control draft-holmer-rmcat-transport-wide-cc-extensions-01
- WebRTC 'goog-remb' and 'transport-cc' SDP lines - StackOverflow
- ハイパフォーマンス ブラウザネットワーキング(High Performance Browser Networking)
- WebRTC が利用している RTP 拡張の簡単な紹介 - voluntas - GitHub
Top comments (0)