我遇到了一个非常奇怪的问题,我不知道该怎么办了。我遇到的所有问题都是几周前开始的。
我的网络的基本示意图如下:
基本配置:
M1 服务:
M2 服务:
- USB网络服务器在端口 8080 上
路由器端口转发(外部 [E:] 到内部)
- E:81 至 M1:80
- E:4321 至 M1:4321
- E:8080 至路由器:8080
- E:8081 至 M2:8080
- E:22 至 M1:22 (ssh)
- E:10000 至 M1:10000 (https webmin)
- E:3389 至 M2:3389 (rdc)
问题:
在端口 4321 上,我的传入流量非常大。当我意识到 M1 上的 HTTPD 服务只能从某些 ISP 访问时,我的问题就开始了。
我的互联网服务提供商为我提供了一个基于 PPPOE 连接的静态 IP 地址 (188.26.X.XXX),称为 RDS。本讨论中的其他 ISP 包括 ROMTELECOM、ORANGE、UPC 和 INTERSAT。
经过几次测试,问题如下:
E:81、E:4321、E:8080、E:10000 无法从 RDS(我自己的网络)、ROMTELECOM、INTERSAT 加载。E:81、E:4321、E:8080、E:10000 可从 ROMTELECOM(不同地理区域)、UPC 和 ORANGE 等移动网络加载。
从任何地方都可以访问 E:8081、E:3389 和 E:22。
所有服务均在 LAN 中可用。
故障排除步骤
- 禁用路由器和 M1 上任何类型的防火墙。
- 结果:同样的问题。
- 更改路由器 (wan) 和 M1 的 LAN ip 和 MAC 地址
- 结果:同样的问题。
- 将运行 DD-WRT 的路由器 Asus WL-520GU 更改为运行默认固件和 Tomato 的 WRT54GL。
- 结果:同样的问题。
- 从网络中移除 M1,并在 M2 上安装 2 个虚拟机 VM1 和 VM2。VM1 的配置与 M1 相同。VM2 用于测试目的,运行带有 RoR for Windows 和 USBWebserver 的 WINDOWS XP。
- 结果:VM1 与 M1 的情况相同(ssh 正常。RoR 和 apache 不正常)。VM2 无法访问。
- 从网络中移除路由器并直接连接到 M2。将端口转发到 VM1 和 VM2。
- 结果:同样的问题。
- 吓坏了。
- 结果:同样的问题。
- 致电 ISP 支持并发送电子邮件。进行了电话交谈并解释了问题。他们没有发现任何问题。我的 ISP 没有改变流量。
- 结果:同样的问题。
- 以随机顺序重复上述步骤...
我做的其他测试
使用 WFetch 后,我意识到我的服务器收到了来自受影响网络的请求,但响应在几个字节之后就变得不稳定了。使用我的 E:81_h5ai作为屏幕截图和其他文件共享用途的服务,我删除了所有文件并创建了一个只有 1 个字符的 index.html。再次从受影响的网络测试 E:81,服务可以访问,并且已收到 index.html 的内容。向文件中添加字符后,我发现已连续收到一个包含 ~1499 个字符的 index.html。再添加一个字符,效果将变得如所述无响应。浏览器没有超时,只是在等待响应。不幸的是,这个缓冲区在 WEBrick 上不一样。需要我的服务器提供更大的响应(~3k 个字符)才能重现该问题。E:8081 始终可以从所有网络访问。
此外,我意识到如果我请求不存在的页面 :81/xyz 或 :4321/xyz,我会收到 404 错误。无论是来自 HTTP 服务器,apache2 还是 WEBrick。这与允许作为响应的最大数据量有关。
重现问题
我当前的配置包含 VM1。M1 和 VM2 已被移除。尝试通过浏览器访问 188.26.X.XXX:4321 和 188.26.X.XXX:81,如果不行,则通过取回。
谢谢,我希望我已经清楚地表达了我的问题。
答案1
我发现连续收到一个~1499个字符的index.html,再加一个字符,效果就会像描述的一样无响应。
这表明最大传输单元问题(维基百科链接)您的路由器发送了另一个路由器无法处理的大数据包。
通俗地说,网络/互联网上的所有通信都被分解成小数据包,但数据包的大小并不固定。MTU(最大传输单元)是设备(例如路由器)应该发送的最大大小。如果您尝试发送较大的数据包,您的设备应该将数据包拆分成两个数据包并分别发送。
但是,如果您的路由器向无法处理的另一个路由器发送大型数据包,则可能会出现问题。在这种情况下,您的路由器会认为数据包丢失并再次发送,由于这也会失败,它会一次又一次地发送,直到它放弃。
减少路由器上的 MTU 意味着您的路由器将发送另一个路由器可以接受的较小的数据包,并且一切都开始正常工作。
那么为什么不每个人都使用每个人都能应付的较小的 MTU 设置呢?每个发送的数据包都有开销,例如有关数据包来自谁以及要发送给谁的信息,并且还必须收到指示数据包已正确接收的回复。因此,数据包越小,您需要发送的数据包就越多,开销就越大,这会降低您的连接速度。(例如,出于性能原因,我理解 XBOX live 需要至少 1364 的 MTU)
因此,通常的建议是使用默认设置,除非您遇到问题,在这种情况下,您不断降低 MTU 设置(以 10 为步长),直到找到可靠的值。
默认设置取决于您使用的网络连接类型。例如,内部 Windows 网络上的默认设置是 1500,而使用 PPPoE 的互联网连接的默认设置是 1492。