我的上网方式
当时我的上网路径如下:
PC -> 路由器 -> 光猫 -> 电信
原来我光猫拨号,路由器动态获取,后台光猫改成桥接模式,在路由器进行拨号,然后PC连接路由器进行上网。
我就发现光猫MTU默认为1500, 路由器默认为1492,那么如果设置一个最合适的MTU大小,不使数据传输时可能导致的拆包发送呢?
首先需要找出ISP允许的最大数据包大小
嗅探出 路由器 上最大数据包大小为:1464
[K2P /home/root]# ping -s 1464  www.baidu.com
PING www.baidu.com (14.215.177.38): 1464 data bytes
1472 bytes from 14.215.177.38: seq=0 ttl=56 time=17.896 ms
1472 bytes from 14.215.177.38: seq=1 ttl=56 time=18.310 ms
1472 bytes from 14.215.177.38: seq=2 ttl=56 time=18.377 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 17.896/18.194/18.377 ms
[K2P /home/root]# ping -s 1465  www.baidu.com
PING www.baidu.com (14.215.177.38): 1465 data bytes
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
PC 上最大数据包大小为:1452
Jeffrey.Deng@Jeffreydeng-pc /d/User/Desktop
λ ping -f -l 1452 imcoder.site

正在 Ping imcoder.site [47.106.118.235] 具有 1452 字节的数据:
来自 47.106.118.235 的回复: 字节=1452 时间=35ms TTL=51
来自 47.106.118.235 的回复: 字节=1452 时间=35ms TTL=51
来自 47.106.118.235 的回复: 字节=1452 时间=35ms TTL=51
来自 47.106.118.235 的回复: 字节=1452 时间=35ms TTL=51

47.106.118.235 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 35ms,最长 = 35ms,平均 = 35ms
Jeffrey.Deng@Jeffreydeng-pc /d/User/Desktop
λ ping -f -l 1453 imcoder.site

正在 Ping imcoder.site [47.106.118.235] 具有 1453 字节的数据:
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。

47.106.118.235 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),
pc默认MTU大小为:1480
Jeffrey.Deng@Jeffreydeng-pc /d/User/Desktop
λ netsh interface ipv4 show subinterfaces

   MTU  MediaSenseState   传入字节  传出字节      接口
------  ---------------  ---------  ---------  -------------
  1480                1  1203203469  112412547  WLAN
4294967295                1          0     265248  Loopback Pseudo-Interface 1
  1480                5          0          0  以太网
  1480                1       2952     151866  VMware Network Adapter VMnet1
  1480                1          0     182123  VMware Network Adapter VMnet8
  1480                5          0          0  SSTAP 1
MTU大学的时候学过
MTU,全称 Maximum Transmission Unit,中文意思为:最大传输单元,单位是字节,既数据传输时会分段传输。
上面测试的数据包大小1452,1464等为帧内数据包大小,既用户实际发送的数据包大小
MTU大小等于 数据大小 + TCP头大小(20字节),一般以太网最大MTU大小为1500,既可用的数据大小为1500-20=1480字节
设计MTU原因:
第一个是数据的完整性,如果一次性传1个G,如果中间一小段丢了,那不白传了
第二是,防止链路堵塞,如果你一次性传1个G,那还让不让别人用啊
先不管猫上的,设置为1500,
路由器上设置为1492,为什么是1492呢?其中的8字节指?
因为PPPoE拨号协议头所用字节为8,我是用的是拨号上网,专线上网则没有这个。
PPPoE协议介于链路层与网络层之间,会在ip报文之上包装一层PPPoE报文,大小为8字节
测出最大数据包大小为1464,原因是 1492=1464+20+8 ,这里的8字节又指?
ping使用的ICMP协议,ICMP信息占用8个字节,ICMP信息的信息被封装到IP的数据包中
pc上最大为1452,1452+28=1480,等于设置值,
那为什么是1480,让我苦思不得其解,
首先我怀疑这个值是迅游加速器设置的,那为什么要设置1480呢?
睡了一觉之后突然明白了
最根本原因
问题就出在路由器拨号,
    如果是PC拨号,那么PC会进行PPPoE的封装,会按照MTU:1492来进行以太网帧的封装,即使通过路由器,路由器这时候也只是转发而已,不会进行拆包。
    而当用路由器拨号时,PC并不知道路由器的通信方式,会以网卡的设置,默认1500的MTU来进行以太网帧的封装,到达路由器时,由于路由器需要进行PPPoE协议的封装,加上8字节的头信息,这样一来,就必须进行拆包,路由器把这一帧的内容拆成两帧发送,一帧是1492,一帧是8,然后分别加上PPPoE的头进行发送
    平时玩游戏不卡,是因为数据量路由器还处理得过来,而当进行群怪AOE的时候,由于短时间数据量过大,路由器处理不过来,就会发生丢包卡顿的情况,也就掉线了。
    设置的1480,猜测可能是尽量设小一点,避免二次拨号带来的又一次PPPoE的封装。

想通之后默默把昨晚改的 MTU=1492改回来。。
PS C:\WINDOWS\system32> netsh interface ipv4 set subinterface "WLAN" mtu=1480 store=persistent
确定。

添加新评论