當(dāng)使用Go語言構(gòu)造SIP消息體后,通過`s.Write(msg)`發(fā)送給FreeSWITCH,但在抓包工具(如Wireshark)中看到的Body部分顯示為一堆數(shù)字而不是可讀的文本。
首先,使用`parts[1]`來獲取Body部分的字符串,并通過`msg.Pack.Body = []byte(parts[1])`將其轉(zhuǎn)換為字節(jié)數(shù)組,然后通過`s.Write(msg)`發(fā)送。但抓包時(shí)看到的Body是數(shù)字,這顯然不符合預(yù)期,因?yàn)?span>SIP的Body通常是文本格式的SDP。
需要考慮以下幾個(gè)可能的原因:
1. Body內(nèi)容本身是否正確:用戶是否正確生成了符合SDP格式的字符串?如果Body內(nèi)容本身是二進(jìn)制數(shù)據(jù)或格式錯(cuò)誤,抓包工具可能會(huì)顯示為十六進(jìn)制數(shù)字。
2. Content-Type頭是否正確設(shè)置:如果SIP消息頭中沒有正確聲明`Content-Type: application/sdp`,Wireshark可能無法正確解析Body,導(dǎo)致顯示為原始字節(jié)。
3. 換行符是否正確:SDP要求使用`\r\n`作為換行符,如果用戶錯(cuò)誤地使用了`\n`,可能導(dǎo)致解析錯(cuò)誤,進(jìn)而顯示為亂碼。
4. 抓包工具的配置問題:用戶是否在Wireshark中啟用了SIP和SDP的解析器?如果解析器未正確配置,即使Body正確,也可能顯示為字節(jié)流。
逐步分析每個(gè)可能性:
檢查Body內(nèi)容:用戶是否在構(gòu)造SDP時(shí)使用了正確的字段和格式?例如,必須包含`v=`, `o=`, `s=`, `c=`, `t=`, `m=`等字段,并且順序正確。在這些字段中有拼寫錯(cuò)誤或順序錯(cuò)誤,可能導(dǎo)致解析失敗。
驗(yàn)證Content-Type頭:用戶是否在SIP消息頭中明確設(shè)置了`Content-Type: application/sdp`?如果缺失或錯(cuò)誤,Wireshark無法識別Body格式,只能顯示原始字節(jié)。
換行符是否正確:在構(gòu)造SDP字符串時(shí),是否使用`\r\n`作為換行符?例如,`v=0\r\no=...`。如果僅使用`\n`,可能導(dǎo)致格式錯(cuò)誤,抓包工具無法正確解析。在構(gòu)造消息中,如果只有header沒有body,那么使用/r/n/r/n進(jìn)行結(jié)束;如果header和body都存在,那么構(gòu)造消息時(shí)使用\r\n進(jìn)行分開,而不是\r\n\r\n。
解決方案包括
1.確保SDP格式正確:檢查用戶生成SDP的代碼,確認(rèn)所有必填字段存在且順序正確,使用標(biāo)準(zhǔn)縮寫,換行符正確。
2. 設(shè)置正確的Content-Type頭:在SIP消息頭中添加`Content-Type: application/sdp`,確保FreeSWITCH和抓包工具能正確識別Body類型。
3. 檢查換行符:確認(rèn)在生成SDP字符串時(shí)使用`\r\n`而不是`\n`。
4.配置Wireshark:指導(dǎo)用戶如何在Wireshark中啟用SIP/SDP解析,確保Body正確顯示為文本而非字節(jié)流。