若是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