据我所知,IP层是有分片的机制的,它为了保证数据报不被连路中的某个硬件设备丢弃,所以它有根据连路中最小的MTU值对上层发来的包进行分片.看TCP时,发现TCP本身也是有分片的,我想他是为了减少IP层分片的消耗所以这么干的吧,因为他本身是流协议,没有边界保护,所以他可以随意的将上层发来的包分成MTU-IP包头-TCP包头的大小,只需要保证包的顺序就好了,这也是为什么TCP在使用过程中经常会遇到粘包和拆包情况的原因吧.不知这样理解对不对?
顺带问题一个:有关UDP的校验字段,很多地方都讲说他的校验方法其实用处不大,在TCP/IP卷一里作者还提到了某某应用并未使用UDP校验云云,现在我打算基于UDP写一个摸拟TCP的可靠传输协议(主要是因为要用UDP实现P2P应用),既然UDP的校验如此不济,有没有什么方法可以通知UDP层关掉此校验,免得影响效率.望高手给予解答.

解决方案 »

  1.   

    UDP的checksum还是有点用处的……
      

  2.   


    1. 为避免在源到目的二主机的网络路径上TCP数据包因为MTU限制而禁止通行,TCP采用了分片,但是因为某些网络会允许最大64K的IP数据包通行,这样处理的效率将会提高,由于同样的限制也会分片;
        TCP粘包和拆包可能导致的因素很多,上述情况可能会导致;但诸如用户的发送数据问题或接收时的同步不当也都有可能;2. UDP数据包的CHECKSUM是可选的,但在默认状况下是使用的,使用和不使用的差异:
        UDP包使用CHECKSUM   : 在接收端检测到数据包有错,将生成差错报文;
        UDP包不使用CHECKSUM : 提高了UDP的Network File System速度,但出现差错丢弃后不生成报文;
      

  3.   

    嗯,非常清晰,非常感谢,那既然UDP的CHECKSUM是可选的,我有不有可能在应用层用什么方式指定UDP不要使用CHECKSUM呢?我要写的应用是在UDP之上的.