分类: LINUX
2013-06-14 17:52:37
原文地址:一个MTU引发的联想 作者:fsfilove
前面总结了一下数据链路层,在里面提到了最大传输单元MTU,由此引发了很多疑问。
1:为什么需要MTU。
2:比如IP要分片,那么分片的工作都是IP做的。或者说其他的会不会分片呢,比如TCP UDP ICMP IGMP会不会分片呢。如果用TCP UDP也会分片,那和IP分片不是就重复了。既然在TCPIP存在这些分片,又为什么存在呢。
3:既然会分片,那怎重组呢。
4:数据包是一般是乱序到达的,又是怎么处理这个乱序的情况
首先呢,为什么需要MTU。
这个是由于硬件能力有限,所以总有限制,因此就有了MTU。
第二:那么既然硬件有能力限制,那么数据包肯定会有比MTU大的情况,那么必然有分片的情况。那分片是在哪里发生的呢。在IP,TCP。通过看书知道。IP会分片,但是呢TCP也会分片,而UDP却不分片。那TCP和IP的能力是不是重复了?
假设IP分片是因为了迎合硬件的能力限制。所以呢这是合理的。但为什么TCP也要分片呢 ?
考虑这么一个情况,假设装载有TCP的数据包的IP丢失了,那会发生什么。接收端是会丢掉整个TCP数据包。但是这样只是丢失了其中几个,而需要整个全部重传,是不是有点浪费时间,浪费资源。因此呢 ,在TCP中出现了分片的能力。如果TCP的数据包加上IP也没有超过MTU,那么TCP整个包就是一个数据包。这样即使掉了自己,其他的数据包是不需要重传整个TCP数据包。所以这样传输速度是不是就提高了很多。不用那么浪费带宽,时间等等。
那TCP是基于什么来分片的呢,总的有一个参考。这就要说到TCP三次握手了。
在TCP三次握手的时候,第一个数据包发送SYN,于此同时会发送mss,滑动缩放窗口选项、时间戳选项、有选择确定选项。重点看看mss,这个东东最大尺寸。这个东东就在开始就会进行交换。目的告诉对方自己的mss是多大。Mss = MTU-TCP header-IP header。因为是双工,所以在两个方向是mss是不一样的。使用MSS的原因就是避免频繁的分片、重传。最大的提高系统的吞吐量。
说了TCP,那么UDP要分片么,答案是:udp是不分片的,在应用层把数据交给发送缓冲区。然后由ISR直接发送到IP层(这点还没完全证实,udp是否有发送缓冲),然后由IP层分片,我想这就是为什么IP和TCP都存在分片的原因。
这里有一个疑问为什么TCP需要自己分片,而UDP不自己分片,而是IP来分片呢。
应该是TCP和UDP的特性决定的。TCP是有连接的,有确定的连接,会自动解决数据包丢失的原因。而UDP是没有这些条件的,数据包丢失了,就丢失了、没有重传。因此就把分片的事儿交给了IP。这点是个人猜测,所以还望有高人指点一下。
第三:既然分片了,那么怎么重组呢。在IP中,
在IP的头里面有标志、DF、MF 和偏移。IP就是利用这个几个条件来重组的。
标志是具有唯一性的、标志每一个数据包。
DF是表示不要分片。如果这位被置位,那么如果数据包太大就会被丢弃,并发送一个ICMP差错报文。
MF表示还有很多其他分片的数据包。
偏移就是指这个包现在的数据在原来数据包处于的开始位置。
以上具体计算可以参看TCP/IP卷一。
对于TCP的组装应该是根据确认号和时间戳来重组的。具体还没看到哪里。所以不敢乱说。
这里有一篇文章,写的不错。http://blog.csdn.net/okbaozhen/article/details/7451552 ,主要是讲解TCP , UDP分片的情况。
对于第四个问题,其实里面都已经可以解决乱序的问题。对于在网络上的数据包,大部分时间都是乱序到达的。因此根据以上的标志字段来确认顺序。具体的原因还得参看代码。
所以上面的四个问题又产生问题了。
学习就是一个问题接一个问题,解决问题,在发现问题,这么轮询。