龙兄鼠弟:Ipv4, Ipv6, Mtu, Mss, Fragmentation 那些事.

1. Ipv4协议向Ipv6协议栈的过渡中, "市场机制失灵".
让我们首先看一组域间路由表, 纵轴表示的是Ipv6全球BGP路由条目数.


下图是另一组数据, 纵轴是Ipv4全球BGP路由条目数.


通过上面的两组图表, 大家对Ipv6和Ipv4在路由体系中的相对规模有了大致的认识吧. 下面这幅图, 描述在同一时刻, Ipv6 BGP路由表相对Ipv4 BGP路由表的百分比.

 
有一个有趣的情况, 在第一附图描述的Ipv6路由表项中, 我们可以发现在08年和09年之间某个时间段, Ipv6的BGP表项有大幅度的波动. 这个很有可能应该是运营商的Ipv6路由故障造成的.
路由条目数并不是衡量Ipv6或者Ipv4网络规模以及应用的唯一一个衡量指标. 但是可以确定的是, 在过去这些年的发展中, Ipv6技术视乎并没有达到一个可以称为快速发展的临界值.
现阶段的Ipv4网络环境是需要逐步的通过Ipv6/Ipv4双栈环境过渡到将来 Ipv6环境中的. 原因就是Ipv6并不向后兼容Ipv4. 虽然一个Ipv4的32位地址可以映射到一个全球唯一的Ipv6地址, 但是反之则是不可能的. 虽然说一个Ipv4主机希望发送报文给一个Ipv6主机, Ipv4地址可以映射为Ipv6地址的一个小的子网环境, 但是实际上是不可行的. Ipv6协议栈是继承自Ipv4协议栈, 但是确是不向后兼容于Ipv4协议栈的.
所以我们会面临下面的过渡阶段过程.
 
初始架构, Ipv6的孤岛网络, 通过tunnel技术互联.
 
 
Ipv6/Ipv4共存的双堆栈基础网络架构.
 
 
运营商和网络组织希望部署Ipv6以替代现在的Ipv4网络的目的是因为Ipv4地址池的渐渐枯竭. 理想状况下, Ipv4网络环境向双栈网络架构进化应该如下图所示.
 
但是由于种种原因, 现实并没有按上面理想的趋势去发展. 因为Ipv6并不向后兼容Ipv4基础网络, 导致双协议栈架构的中间过渡必然. 这意味着, 在现在的路由网络体系中, 交换机, 路由器, 以及各种基础设施服务, 比如说各种形式的DNS, 防火墙, 安全管理和评价系统都必须支持双协议栈架构. 这似乎是一个相当艰巨的目标. 互联网目前有大约2亿用户(在由ITU-T的公布的数据为基础). 至少有1亿终端主机(并可能得多),对数以亿计的路由器,防火墙和其他中间网络设备, 以及相关的网络配置和正在蔓延的跨越的辅助支持系统做升级将是天文费用. 当然, 这些费用最终会转化到消费者身上.
从市场的角度看, 这并不是一个令运营商和消费者满意的状况. 承载在Ipv4和Ipv6协议上的传输层协议, 并没有因为网络层的变化而有改变, 所以如果需要真正推动Ipv6网络的发展, 最根本的动力就是尽快的将Ipv4地址池消耗掉. 所以,我们有理由乐观的认为,未来几年也许Ipv6网络的大规模商用会开始,就如下面的图表所示。
 
 
当然,面对现在Ipv4地址池将要耗尽的情况, 设备商, 运营商和企业自身采用了NAT的过渡边缘技术加以解决. 这些也是需要费用的, 这些费用当然也是由用户买单的.
同时, 未分配的IPv4地址空间完全用尽意味着服务供应商可能需要部署在自己的网络中的NAT设备, 如果他们想为客户提供IPv4服务. 这种电信级NAT的部署会使得服务供应商成本上升, 并且能够提供给客户的服务质量下降. 确实可以想象, 在异构的竞争环境提供给客户的服务, 其中的地址稀缺, 没有统一的部署, 运营商最终会因为较高的成本, 较低的客户服务质量而失去自身的竞争力.
回顾电信业发展的历史, 我们必须采取一些特殊的, 刺激性的政策或者策略, 用以推动和加速Ipv6技术的发展.
2. Mtu, Mss, Fragmentation 概念
虽然网络层协议Ipv6或者Ipv4是一个承上(传输层TCP/UDP)启下(链路层)的协议,链路层协议和传输层协议不因为Ipv6或者Ipv4有改变,但是仍然因为协议的差别以及Ipv4网向Ipv6网过渡而使用的一些技术,会导致网络部署以及互联互通性上的问题。比如MTU,Mss和Fragmentation带来的问题。
先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC
由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。
(注:小于64Bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生)具体有关MTU的数值可以参考文档http://jasonccie.blog.51cto.com/2143955/391047
由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes 和帧尾CRC校验部分4Bytes(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes 这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。
 
当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。
对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。
对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。
对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。
当然对于TCP应用而言还有另外的解决方案, MSS。
MSS最大传输大小的缩写,是TCP协议里面的一个概念。MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
 
TCP MSS 的原理:
PC1(192.168.0.1)�D�D�DRouter�D�D�D�DInternet�D�D�D�Dwww server(238.135.1.1)
建立tcp连接的两端在三次握手时会协商tcp mss大小,具体如下:
pc1 发出syn报文,其中option选项填充的mss字段一般为1460,同样www server收到syn报文后,会发送syn+ack报文应答,option选项填充的mss字段也为1460;协商双方会比较syn和syn+ack报文中mss字段大小,选择较小的mss作为发送tcp分片的大小。通过比较,协商双方的tcp mss都是1460。
对于涉及mpls l3vpn、pppoe+nat、ipsec、l2tp、gre等组网,通常由于报文太大需要分片,一般可以通过设置tcp mss解决。
针对上例说明tcp mss如何实现
假设在路由器内网口配置tcp mss 1200
路由器收到www server的syn+ack报文时会修改option选项中的mss字段为1200,然后再转发给PC1,PC1收到报文后认为对端的tcp mss为1200,这样PC1发送资料(已经协商完了)给www server时会以1200作为分片大小;但路由器修改tcp mss为1200的操作www server是不知道的,因此www server还会以1460作为分片大小发送报文。

假设再路由器外网口配置tcp mss 1200
路由器收到PC1的syn报文时会修改option选项中的mss字段为1200,然后再转发给www server,同样www server发送资料给PC1时会以1200作为分片大小;同样PC1不知道路由器修改tcp mss为1200,因为PC1还会以1460作为分片大小发送报文。
因此在实现双向大包传输时需要在内外网同时修改tcp mss
综上所述:在路由器接口上配置的tcp mss命令仅对出接口方向的syn报文和syn+ack报文有效,对于入接口方向的syn和syn+ack报文无效。
 
Cisco IOS有feature支持TCP 的自适应. 命令: e.g. ip tcp adjust-mss 1452
Cisco的TCP Adjust MSS Feature:The TCP MSS Adjustment feature enables the configuration of the maximum segment size (MSS) for transient packets that traverse a router, specifically TCP segments in the SYN bit set, when Point to Point Protocol over Ethernet (PPPoE) is being used in the network. PPPoE truncates the Ethernet maximum transmission unit (MTU) 1492, and if the effective MTU on the hosts (PCs) is not changed, the router in between the host and the server can terminate the TCP sessions. The ip tcp adjust-mss command specifies the MSS value on the intermediate router of the SYN packets to avoid truncation. 
3. Ipv4分片和Ipv6分片案例
待续...

你可能感兴趣的:(职场,ipv4,ipv6,休闲,MTU,BGP,全球路由表)