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