13,329
次編輯
變更
数据包
,→运用
简单的说,你上网打开网页,这个简单的动作,就是你先发送数据包给网站,它接收到了之后,根据你发送的数据包的IP地址,返回给你网页的数据包,也就是说,[[网页]]的[[浏览]],实际上就是数据包的交换。
1、 [[ 数据链路层 ]] 对 [[ 数据帧 ]] 的长度都有一个限制,也就是 [[ 链路层 ]] 所能承受的最大数据长度,这个值称为 [[ 最大传输单元 ]] ,即MTU。以 [[ 以太网 ]] 为例,这个值通常是1500字节。
2、对于IP数据包来讲,也有一个长度,在IP [[ 包头 ]] 中,以16位来描述IP包的长度。一个IP包,最长可能是65535字节。
3、结合以上两个概念,第一个重要的结论就出来了,如果IP包的大小,超过了MTU值,那么就需要分片,也就是把一个IP包分为多个,这个概念非常容易理解,一个载重5T的卡车,要拉10T的货,它当然就得分几次来拉了。
4. IP分片是很多资料常讲的内容,但是我倒是觉得分不分片其实不重要,重要的是另一个东西。一个数据包穿过一个大的网络,它其间会穿过多个 [[ 网络 ]] ,每个网络的MTU值是不同的。我们可以设想,如果接受/发送端都是以太网,它们的MTU都是1500,我们假设发送的时候,数据包会以1500来 [[ 封装 ]] ,然而,不幸的是,传输中有一段X.25网,它的MTU是576,这会发生什么呢?我想,这个才是我们所关心的。
当然,结论是显而易见的,这个数据包会被再次分片,咱开始用[[火车]]拉,到了半路,不通火车,只通汽车,那一车货会被分为很多车……仅此而已,更重要的是,这种情况下,如果IP包被设置了“不允许分片标志”,那会发生些什么呢?对,数据包将被丢弃,然后收到一份ICMP不可达差错,告诉你,需要分片!这个网络中最小的MTU值,被称为路径MTU,我们应该有一种有效的手段,来发现这个值,最笨的方法或许是先用traceroute查看所有节点,然后一个个ping……
以太头+IP头+1个字节的数据"(引号内的内容可否在这里不详细阐述,对于1473的数据如何被分为1472和1不是很清楚2010.01.15 13:50)也就是省去ICMP头的封装,当然,IP头是不可以省的,否则怎么传输了……
事实上 ,TCP,[[TCP/IP ]] 协议采用的是后一种 [[ 封装方式 ]] ,这样,一次可以节约8个字节的空间。IP包头中,用了三个标志来描述一个
分片包:
1、分片标志:如果一个包被分片了,分片 [[ 标志 ]] 这个字段被置于1,最后一个分片除外;——这样,对于接收端来讲,可以根据这个标志位做为重组的重要依据之一;
2、分片偏移标志:光有一个标志位说明“自己是不是分片包”是不够的, [[ 偏移标志位 ]] 说明了自己这个分片位于 [[ 原始数据 ]] 报的什么 [[ 位置 ]] 。很明显,这两个标志一结合,就很容易重组分片包了。
3、不允许分片标志:如果数据包强行设置了这个标志,那么在应该分片的时候,…… err,刚才已经说过了。
==视频==