我的 Linux 网络堆栈出现了奇怪的连接受限情况。问题是,每当我尝试下载某些内容时,我只能获取所请求资源的前 5.5KB,两个都使用我的以太网卡 (Realtek 8139) 以及我的无线网卡 (IPW2200)。例如:
- wget google.it => 我将获得一个完整的“index.html”页面(因为它有 4.9KB)
- wget google.it/intl/it_it/images/logo.gif => 我将获取图像的前 5.5KB,然后 wget 将挂起,无限期地等待图像的剩余部分
- 捕获与 www.polito.it 的 HTTP 对话(6)(正如您在该截图中看到的那样,即使页面缺少某些元素,也不会再发出任何请求)
环境和工具:
- 我尝试通过 Firefox 和命令行链接查看页面,无论是从我的本地安装还是从 Live CD
- 在 Windows 上,两个网卡均运行正常没有任何问题(我现在正在使用双启动的 Windows 进行编写)
- 这个问题正在发生在每个 Linux 发行版上我尝试过(每个都有不同的内核):ArchLinux、Live ArchLinux 2007.08、grml 2008、grml 2009.10
这是我的 Linux 配置:
- 内核正在检测卡(模块 8139too 或 ipw2200)并为其分配一个良好的 IRQ
DHCP 服务器(地址为 192.168.1.1)正确地将 IP 192.168.1.2 分配给我的网络接口。以太网一示例:
eth0 链路封装:以太网 HWaddr 00:c0:9f:be:77:da
inet 地址:192.168.1.2 Bcast:192.168.1.255 掩码:255.255.255.0 inet6 地址:fe80::2c0:9fff:febe:77da/64 范围:链路 UP 广播运行多播 MTU:1500 指标:1 RX 数据包:478 错误:0 丢弃:0 超限:0 帧:0 TX 数据包:322 错误:0 丢弃:0 超限:0 载波:0 冲突:0 txqueuelen:1000 RX 字节:163064(159.2 KiB) TX 字节:40610(39.6 KiB) 中断:16 基地址:0xc000MTU 设置为 1500,但即使使用较小的值,问题仍然存在(我尝试过 1492、1454、1000、500 的值)
- DNS 解析运行良好
对网络/互联网上其他主机的 ping 操作正常:
PING www.l.google.com (74.125.43.104) 56(84) 字节数据。来自 bw-in-f104.1e100.net (74.125.43.104) 的 64 字节:icmp_seq=1 ttl=50 time=52.1 ms 来自 bw-in-f104.1e100.net (74.125.43.104) 的 64 字节:icmp_seq=2 ttl=50 time=50.9 ms
内核没有指示超时/接收缓冲区已满/未处理的 IRQ 消息
我不知道为什么会发生这种情况...除此之外,这个问题是可重现的,对于任何网页,它都会在给定的量之后停止加载。
答案1
我发现了问题:我的网关无法正确处理 TCP 窗口缩放。因此,我指示 Linux 内核不要使用此功能,现在连接运行顺畅。
供您参考,这是我对网络配置的修补。在 /etc/sysctl.conf 中,我添加了以下几行:
net.ipv4.tcp_window_scaling=0
net.ipv4.tcp_ecn=0
这是我的路由器的标识:“Alice Gate 2 Plus Wi-Fi”,固件版本为“AGIA_1.2.0”
答案2
如果正如您所说的那样,它在 Windows 上运行良好,但在各种 Linux 发行版上遇到问题,那么 Linux 驱动程序可能存在问题。
我会亲自提交错误报告或者看看你是否可以找到不同版本的驱动程序。
另外,我对一点有点困惑 -
我尝试通过 Firefox 和命令行链接查看页面,无论是从我的本地安装还是从 Live CD
您是说您尝试过并且成功了还是失败了?
如果可行,请尝试从实时 CD 中抓取驱动程序。如果失败,您可能运气不佳。
在任何时候您都不必手动摆弄 MTU 或其他技术项目...我总是说这样的东西存在,所以一旦您知道它已经在工作,您就可以对其进行微调(这样您就知道如果有错误该返回到哪里!),但如果它默认不起作用,那就是您应该首先查看的其他某种故障。