PPTP的问题.奇怪(一些网页无法打开)

情况是这样的,vpn拨号成功后,qq网站可以打开,但是百度打不开
一直停在"正在打开网页"

这里问题就是mtu没设置,

iptables -A FORWARD -p tcp --syn -s 172.16.0.0/24 -j TCPMSS --set-mss 1356;

这样设置后,重新拨vpn,可以正常打开所有网页。
1356这个值怎么得出来的

在服务器上用netstat -i查看接口,得到

Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500   0 102528561      0      0      0 194391413      0      0      0 BRU
eth1   1500   0 519820535    954 11553    924 208798037      0      0      0 BRU
lo    16436   0   151062      0      0      0   151062      0      0      0 LRU
ppp0   1396   0       19      0      0      0        8      0      0      0 OPRU 

可知ppp的最大mtu为1396,当然,对应的mss应为(mtu-20字节的IP头部+20字节的TCP 头部=)1356 【小知识1】计算机网络中的MSS:
MSS: Maximum Segment Size 最大分段大小
MSS最大传输大小的缩写,是TCP协议里面的一个概念。
MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在 实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会 根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
MTU就是最大传输单元(英语:Maximum Transmission Unit,缩写MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。超过这个值就要分包传输,分包就有可能丢包,网络传输就会失败。

平时路由器里也有个mtu的设置,一般默认是1500,其实我们也可以修改成不需要分包的最大值。
首先要检测网关的MTU在电脑端打开dos窗口,执行:

ping -f -l 1472 192.168.0.1 

其中192.168.0.1是网关IP地址),1472是数据包的长度。请注意,上面的参数是“-l”(小写的L),而不是“-1”。 如果能ping通,表示数据包不需要拆包,可以通过网关发送出去。
如果出现: Packet needs to be fragmented but DF set. 或中文提示,表示数据包需要拆开来发送。此时,减少数据包长度,再执行上面的ping命令。从1400到1472之间多试几次,就能找到合适的数据包长度了。数值在可用的情况下尽量取大值。

注意:把数据包正常的长度加上数据包头28字节,就得到可以修改的MTU值。比如:测的1400,要加上28后得到1428,把1428填到路由器里面。如果检测到网关的MTU值是1500,不需要修改。

添加新评论