[Pion/WebRTC] Try reading Offer messages
Tags: webrtc, pion
Published: 2022-07-03 07:07:57

## Intro
This time, I will try reading Offer messages.
I output the logs of my application created with Pion/WebRTC.

* [[Go] Try Pion/WebRTC with SSE](https://dev.to/masanori_msl/go-try-pionwebrtc-with-sse-582)
* [[Go][Pion/WebRTC] Closing chan and adding DataChannel](https://dev.to/masanori_msl/gopionwebrtc-closing-chan-and-adding-datachannel-f83)

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.

* [[ASP.NET Core][TypeScript] Try WebRTC](https://dev.to/masanori_msl/asp-net-core-typescript-try-webrtc-c5m)

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)

* [RFC8866 - SDP: Session Description Protocol](https://datatracker.ietf.org/doc/html/rfc8866)

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
```ini
# [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
```ini
...
# [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
```ini
...
# [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
```ini
...
# [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](https://datatracker.ietf.org/doc/html/rfc8866)
* [RFC3264 - An Offer/Answer Model with the Session Description Protocol (SDP)](https://datatracker.ietf.org/doc/html/rfc3264)
* [RFC5888 - The Session Description Protocol (SDP) Grouping Framework](https://datatracker.ietf.org/doc/html/rfc5888)
* [RFC8445 - Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal](https://datatracker.ietf.org/doc/html/rfc8445)
* [RFC8839 - Session Description Protocol (SDP) Offer/Answer Procedures for Interactive Connectivity Establishment (ICE)](https://datatracker.ietf.org/doc/html/rfc8839)
* [RFC8843 - Negotiating Media Multiplexing Using the Session Description Protocol(SDP)](https://datatracker.ietf.org/doc/html/rfc8843)
* [RFC8122 - Connection-Oriented Media Transport over the Transport Layer Security (TLS) Protocol in the Session Description Protocol (SDP)](https://datatracker.ietf.org/doc/html/rfc8122)
* [RFC8285 - A General Mechanism for RTP Header Extensions](https://datatracker.ietf.org/doc/html/rfc8285)
* [RFC9143 - Negotiating Media Multiplexing Using the Session Description Protocol(SDP)](https://datatracker.ietf.org/doc/html/rfc9143)
* [RFC4145 - TCP-Based Media Transport in the Session Description Protocol (SDP)](https://datatracker.ietf.org/doc/html/rfc4145)
* [RFC5761 - Multiplexing RTP Data and Control Packets on a Single Port](https://datatracker.ietf.org/doc/html/rfc5761)
* [RFC5506 - Support for Reduced-Size Real-Time Transport Control Protocol (RTCP):Opportunities and Consequences](https://datatracker.ietf.org/doc/html/rfc5506)
* [RFC4585 - Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF)](https://datatracker.ietf.org/doc/html/rfc4585)
* [RFC8841 - Session Description Protocol (SDP) Offer/Answer Procedures for Stream Control Transmission Protocol (SCTP) over Datagram Transport Layer Security (DTLS) Transport](https://datatracker.ietf.org/doc/html/rfc8841)
* [RTCP message for Receiver Estimated Maximum Bitrate draft-alvestrand-rmcat-remb-03](https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03)
* [RTP Extensions for Transport-wide Congestion Control draft-holmer-rmcat-transport-wide-cc-extensions-01](https://datatracker.ietf.org/doc/html/draft-holmer-rmcat-transport-wide-cc-extensions-01)
* [WebRTC 'goog-remb' and 'transport-cc' SDP lines - StackOverflow](https://stackoverflow.com/questions/44517546/webrtc-goog-remb-and-transport-cc-sdp-lines)
* [ハイパフォーマンス ブラウザネットワーキング(High Performance Browser Networking)](https://www.oreilly.co.jp/books/9784873116761/)
* [WebRTC が利用している RTP 拡張の簡単な紹介 - voluntas - GitHub](https://gist.github.com/voluntas/b0e73348181ab96f1d47c6f3ff3f1dc1)