【问题分析】

先从一个实验说起
实验拓扑如下:
PC1——-***网关1―――――***网关2——–PC2


在上述组网中,***网关1和2之间建立了一条GRE隧道,PC1与PC2通过该GRE隧道互访。

这时,我们会发现,PC1在ping 1448的报文时,在PC2上抓包发现没有被分片,而ping 1449时,PC2上会发现PC1过来的报文已经被分片了。为什么呢?

PC1出来的IP报文长度为1448+8(ICMP报头长)+20(IP报头长),到达***网关1,***网关1发到GRE隧道口,封装GRE头(4字节),再加上外层IP头,到达***网关外层以太口,这时IP报文的长度已经变为:1448+8+20+4+20=1500字节,刚好等于以太口的MTU,于是被顺利传送。而ping 1449时,到达外层以太口为1501字节,超出了1500的MTU,又因为报文DF位未置1,即可以分片,***网关于是将该报文分片发送出去。这就是我们所看到的现象。
在上述实验中,由于应用程序是ping,所以报文可以被分片,因此互通没有问题。但是如果是WEB访问等应用,则有些报文是不允许分片的,这样在外层以太口就会将超过1500的报文丢掉,导致无法通讯。
从上述实验可以看到,由于***会额外加入一些报文头,如果通讯双方的MTU不能随之改变的话,就容易产生不通的问题。
下面以HTTP为例,说明为何产生此问题并如何解决。
先看看HTTP为何无法像ICMP那样自动分片通讯。
假设PC1/2建立了HTTP连接后,PC2希望从PC1下载一个大的网页。PC2开始发送,其IP的DF位置1,不允许分片,IP报文长度为1500字节。到达***网关1的外网口后,***网关1发现其长度超过了1500个字节,于是将其丢弃,并给PC1发回一个目的地址不可达的ICMP信息,出错代码为”Fragmentation needed”,表示需要分片,但不允许分片,同时给出”MTU of next hop: 1500”。PC1接收到该消息后,又按照1500字节对外发送,又被丢弃,于是就形成了循环,无法通讯。
根据上述的分析,很容易得到如下解决方式,在***网关1的出接口设置MTU为1500-4-20=1476,这样***网关1返回ICMP不可达消息时将给出”MTU of next hop: 1476”。PC2将以1476作为自己的最大MTU对外发送,到达***网关1,封装GRE和外层IP头后就不会超过1500而顺利发到对端。
这时仅解决了下载的问题,如果PC2需要将大文件上传到PC1,同样需要设置***网关2的出接口MTU值小于1476。

总结

当然,还可以更改***网关1的出接口的TCP MSS数值,将其更改为1500-4-20-20(TCP头)=1456字节,也可保证HTTP等TCP应用顺利通过。但该情况仅适用于TCP应用。上述解决方式同样适用于其他隧道技术,在L2TP、IPSEC等应用时可以相应的根据其包头数值设置MTU或MSS。

本文转载于公众号:网络之路博客

©著作权归作者所有:来自51CTO博客作者网络之路blo的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 11:VMware Horizon View 8.0-部署配置UAG网关
  2. 可靠型园区网组网,你该如何选择最优方案?
  3. 开课啦 dubbo-go 微服务升级实战
  4. HTTP概述
  5. 带你深入熟悉你所不知道的ICMP
  6. 华为路由交换技术:VRRP-虚拟网关冗余协议配置
  7. “网关”的特点及存在的价值和意义
  8. 网工在路上--漫谈生成树中的防护机制
  9. 【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建

随机推荐

  1. Android系统架构-----Android的系统体系
  2. Android studio学习之TextView、EditText
  3. Android软件工程师之不归路
  4. RN系列:Android原生与RN如何交互通信
  5. Android 4高级编程(第3版) 试读
  6. Android开发UI之android:gravity / andro
  7. Android 中文API合集(3)(83篇)(chm格式)
  8. 关于Android的selector小用法
  9. Android菜单详解——理解android中的Menu
  10. Android 源代码分享