日期:
来源:车小胖谈网络收集编辑:车小胖谈网络
昨天晚上群里有位同学提了工作中遇到的问题,如下所示:
遇到这样一个问题。就是协商的mss 是1460。但服务只收到1461- 1645之间的数据。 运维反馈是调低了mtu值后,问题未重现。如果坚持阅读公众号写过关于TCP、IP分片的文章,仔细看这副图片就能还原问题的现场。Alice有1645字节需要传输给Bob,由于使用了MSS=1460,所以1645字节被分成两个包裹1、2:- 包裹1,对应图片中的第4行(1514),对应字节数1-1460字节,Pia! 包裹扔出去了。
- 包裹2,对应图片中的第5行(238),对应字节数1461-1645字节,Pia! 包裹又扔出去了。
- 包裹2已经安全抵达Bob,否则不会弹射出第6行这个ACK报文。
因为包裹1的尺寸(1460)> 包裹2 的尺寸(184)。很显然,是由于包裹1的尺寸 + 20字节IP头+ 20字节TCP头 = 1500 >互联网上某条链路的MTU! 大概率 IP报文头的DF= 1,所以被互联网该网络设备丢弃了。接下来Alice一直在尝试重传6次,到达重传上限值,发送Reset将TCP连接重置。当然抵达Bob的第二个包裹最后也没有什么用,一旦Bob接收到Reset指令,立马释放包裹2。当然互联网不光有三层的路由器设备,还有二层的交换机设备。如果交换机设备的MTU <1500,且包裹1会途径该交换机,无论DF= 0还是DF=1,包裹1都会被丢弃。中国电信AS号假设 = 10,中国联通AS号假设=20,问:中国电信BGP路由器将BGP路由,发给中国联通,中国联通会将中国电信的路由,再发给中国电信吗?是否启用水平分割原则?当然不会发,当然也会启用水平分割原则,且水平分割原则比普通的路由协议还要严格。- 中国电信发给中国联通的BGP路由,都会携带一个AS-Path =10的属性值。同时中国电信还会将凡是携带as-path =20过滤掉(Filter Out)。换句话说,凡是携带联通AS= 20的路由,都不会发给中国联通,这是第一道保险(Out-Bound Filter)。
- 联通又不傻,对于电信发给自己的路由启用入向过滤(In-Bound Filter)。凡是路由携带AS-Path = 20(联通自己的AS号)的统统扔掉,这是第二道保险。
- 联通将BGP路由表发给电信时,和电信一样的操作,凡是携带中国电信AS号的(10),全部过滤掉,不能发给电信。
- 电信接收联通BGP路由时,首先过滤掉携带自己AS号(10)的路由表,丢弃处理。接收其它所有路由表。
即使联通将电信BGP路由(AS-PATH =10)发给中国移动(AS= 30)。那么中国移动向中国电信分享BGP表时,一样会将携带电信AS号(AS-PATH =10)的路由过滤掉。电信入向过滤掉AS-Path =10 的所有路由,这就是BGP大名鼎鼎的双保险组合。即使其中一个节点出现问题,也有另外一个保险防止路由的环路。至于如何学好计算机网络,首先要坚持阅读文章。多思考,带着问题去学习。深度学习要阅读RFC文档、协议白皮书。另外,计算机网络是一门有科技含量的学科,不要妄自菲薄,淡泊明志才是真!