1、關於SIP的UDP與MTU的關系
如果sip消息的大小超過了MTU,則有可能被網絡中的某一節點分片,而UDP處理分片會有很大的問題,從而導致sip消息傳輸失敗。要解決該問題的話,兩種方案:
1)減少sip消息的體積,比如減少codecs、x headers等
2)使用tcp來替代udp傳輸sip消息
這就是為什么sip終端要同時支持tcp與udp的原因。
2、為什么TCP傳輸sip不會出現問題?
因為tcp傳輸sip消息時,不會出現分片,下面是具體原因:
為什么TCP不會造成IP分片呢?原因是TCP自身支持分段,在TCP進行三次握手的時候,會協商MSS的大小(一般就是MTU),該MSS值存放在TCP段的選項中。當TCP要傳輸長度超過MSS(Maxitum Segment Size)的數據時,會先對數據進行分段,因此,TCP一般不會造成IP分片。
而UDP和ICMP就不支持這種分段功能了,UDP和ICMP認為網絡層可以傳輸無限長(實際上有65535的限制)的數據,當這兩種協議發送數據時,它們不考慮數據長度,僅在其頭部添加UDP或ICMP首部,然后直接交給網絡層就萬事大吉了。接着網絡層IP協議對這種“身長頭短”的數據進行分片,不要指望IP能很“智能”地識別傳給它的數據上層頭部在哪里,載荷又在哪里,它會直接將整個的數據切成N個分片,這樣做的結果是,只有第一個分片具有UDP或者ICMP首部,而其它分片則沒有。
備注:
最大傳輸單元(Maximum Transmission Unit)