SDP(Session Description Protocol)的結(jié)構(gòu)
SDP用于描述多媒體會話的詳細信息,常用于SIP、WebRTC等協(xié)議中。這兩行是SDP中的兩個關(guān)鍵字段:o行(origin)和c行(connection information)。
o行和c行的具體含義。根據(jù)SDP規(guī)范
1. o行格式是:o=
username:通常為“-”表示沒有用戶名。
sess-id:會話標識符,通常是一個數(shù)字,比如例子中的20013。
sess-version:會話版本,當會話數(shù)據(jù)變化時遞增,例子中也是20013。
nettype:網(wǎng)絡(luò)類型,通常是IN(Internet)。
addrtype:地址類型,IPv4或IPv6。
unicast-address:主機的IP地址。
示例o行是:o=-20013 20013 IN IP4 %s,這里的第一個%s應(yīng)該對應(yīng)的是unicast-address,即主機的IP地址。
2. c行格式是:c=
nettype:同樣為IN。
addrtype:IPv4或IPv6。
connection-address:連接地址,通常是發(fā)送媒體的IP地址。
實例的c行是:c=IN IP4 %s,這里的第二個%s應(yīng)該是媒體流的IP地址。
這兩個%s是否分別對應(yīng)主機IP和媒體IP
有時候,這兩個IP可能相同,特別是在設(shè)備只有一個IP的情況下。但在某些情況下,比如存在NAT或不同網(wǎng)絡(luò)接口,這兩個IP可能不同。例如,主機可能使用內(nèi)網(wǎng)IP,而媒體流需要NAT后的公網(wǎng)IP。可能是在構(gòu)造SDP時,需要動態(tài)填入這兩個IP地址??赡芩麄儚呐渲没蚓W(wǎng)絡(luò)接口獲取這些IP,然后格式化到SDP中。
實際應(yīng)用場景
正在開發(fā)一個SIP客戶端,需要與FreeSWITCH通信,因此正確設(shè)置SDP中的IP地址至關(guān)重要,否則媒體流(如音頻、視頻)可能無法正確傳輸。如果這兩個IP填錯了,可能會導(dǎo)致媒體無法建立連接。這兩個%s是否代表不同的IP,或者是否有其他參數(shù)需要填充。比如,是否有可能第二個%s代表端口或其他信息?根據(jù)SDP規(guī)范,c行的connection-address通常是IP地址,可能包含端口,但格式通常是IP地址,端口在媒體行的m字段中指定。例如:m=audio 1234 RTP/AVP 0,這里的1234是端口。
o行的第一個%s是origin的unicast-address(主機IP),c行的第二個%s是connection-address(媒體流IP)。用戶需要確保這兩個IP地址正確,特別是在NAT環(huán)境下可能需要使用公網(wǎng)IP或STUN獲取的外部地址。
如果是本地測試,可能都用本地IP;如果部署在公網(wǎng),可能需要配置為公網(wǎng)IP,或者使用動態(tài)發(fā)現(xiàn)的方法。
常見場景
局域網(wǎng)直連:
localIP := "192.168.1.100"
mediaIP := localIP // 使用同一IP
NAT穿透(公網(wǎng)場景):
localIP := "192.168.1.100" // 內(nèi)網(wǎng)IP
mediaIP := getPublicIP() // 通過STUN獲取公網(wǎng)IP(例如 "203.0.113.5")
服務(wù)器中轉(zhuǎn):
localIP := "192.168.1.100" // 客戶端IP
mediaIP := "media.freeswitch.org" // 媒體服務(wù)器域名或IP