Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335620
  • 博文数量: 88
  • 博客积分: 907
  • 博客等级: 准尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 13:27
文章分类

全部博文(88)

文章存档

2017年(1)

2014年(3)

2013年(29)

2012年(21)

2011年(26)

2010年(8)

分类: LINUX

2013-06-08 21:29:36

前面总结了一下数据链路层,在里面提到了最大传输单元MTU,由此引发了很多疑问。

 

1:为什么需要MTU

2:比如IP要分片,那么分片的工作都是IP做的。或者说其他的会不会分片呢,比如TCP UDP ICMP IGMP会不会分片呢。如果用TCP UDP也会分片,那和IP分片不是就重复了。既然在TCPIP存在这些分片,又为什么存在呢。

3:既然会分片,那怎重组呢。

4:数据包是一般是乱序到达的,又是怎么处理这个乱序的情况

 

首先呢,为什么需要MTU

这个是由于硬件能力有限,所以总有限制,因此就有了MTU

 

第二:那么既然硬件有能力限制,那么数据包肯定会有比MTU大的情况,那么必然有分片的情况。那分片是在哪里发生的呢。在IPTCP。通过看书知道。IP会分片,但是呢TCP也会分片,而UDP却不分片。那TCPIP的能力是不是重复了?

 

假设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层分片,我想这就是为什么IPTCP都存在分片的原因。

 

这里有一个疑问为什么TCP需要自己分片,而UDP不自己分片,而是IP来分片呢。

应该是TCPUDP的特性决定的。TCP是有连接的,有确定的连接,会自动解决数据包丢失的原因。而UDP是没有这些条件的,数据包丢失了,就丢失了、没有重传。因此就把分片的事儿交给了IP。这点是个人猜测,所以还望有高人指点一下。

 

第三:既然分片了,那么怎么重组呢。在IP中,

 

IP的头里面有标志、DFMF 和偏移。IP就是利用这个几个条件来重组的。

标志是具有唯一性的、标志每一个数据包。

DF是表示不要分片。如果这位被置位,那么如果数据包太大就会被丢弃,并发送一个ICMP差错报文。

MF表示还有很多其他分片的数据包。

偏移就是指这个包现在的数据在原来数据包处于的开始位置。

以上具体计算可以参看TCP/IP卷一。

 

对于TCP的组装应该是根据确认号和时间戳来重组的。具体还没看到哪里。所以不敢乱说。

这里有一篇文章,写的不错。http://blog.csdn.net/okbaozhen/article/details/7451552 ,主要是讲解TCP , UDP分片的情况。

对于第四个问题,其实里面都已经可以解决乱序的问题。对于在网络上的数据包,大部分时间都是乱序到达的。因此根据以上的标志字段来确认顺序。具体的原因还得参看代码。

 

所以上面的四个问题又产生问题了。

 

学习就是一个问题接一个问题,解决问题,在发现问题,这么轮询。

阅读(2385) | 评论(1) | 转发(3) |
给主人留下些什么吧!~~