我正在编写一个应该从服务器接收文件的客户端应用程序。通信使用了在TCP上设计的非常简单的专有协议:服务器发送16 is的数据块,等待来自我的客户端的简单响应,然后继续到下一个块;直到文件被完全传输为止。
服务器正在Windows上运行。如果我在Windows (通过Cygwin)上运行我的客户机,我的吞吐量为70 5Mbits/s。但是,如果我在Linux上运行它,我可以获得的最大吞吐量是5Mbit/s(这两个测试都使用相同的100 my以太网链路)。
在对我收集到的tcpdump跟踪进行了一些调查之后,我发现Linux需要花费大约10 is来回答每个TCP。每次调用recv()之后,我都尝试禁用套接字选项TCP_QUICKACK,但没有成功。我没有发现任何其他TCP选项可以改变这种行为(在bsd套接字下,甚至在Linux下)。
有人能帮我弄清楚发生了什么吗?
下面是我分析过的tcpdump跟踪的样本。这是块传输。服务器IP为10.200.252.1,客户端为10.200.252.2。以**开头的行是延迟为10 ACK的TCP数据包:
5184 28.060969 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4736738 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5185 28.060978 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4738182 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5186 28.060981 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4739626 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5187 28.060987 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4741070 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5188 28.060990 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4742514 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5189 28.060994 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4743958 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5190 28.060997 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4745402 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5191 28.061000 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4746846 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5192 28.061003 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4748290 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5193 28.061007 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4749734 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5194 28.061038 10.200.252.1 10.200.252.2 TCP 1510 search-agent > 58358 [ACK] Seq=4751178 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060
5195 28.061042 10.200.252.1 10.200.252.2 TCP 572 search-agent > 58358 [PSH, ACK] Seq=4752622 Ack=1741 Win=66048 Len=506 TSval=2951472 TSecr=2921060
**5196 28.068422 10.200.252.2 10.200.252.1 TCP 66 58358 > search-agent [ACK] Seq=1741 Ack=4742514 Win=64512 Len=0 TSval=2921061 TSecr=2951472
**5197 28.078479 10.200.252.2 10.200.252.1 TCP 66 58358 > search-agent [ACK] Seq=1741 Ack=4753128 Win=64512 Len=0 TSval=2921062 TSecr=2951472
5198 28.082418 10.200.252.2 10.200.252.1 TCP 70 58358 > search-agent [PSH, ACK] Seq=1741 Ack=4753128 Win=64512 Len=4 TSval=2921062 TSecr=2951472
5199 28.082675 10.200.252.2 10.200.252.1 TCP 68 58358 > search-agent [PSH, ACK] Seq=1745 Ack=4753128 Win=64512 Len=2 TSval=2921062 TSecr=2951472
5200 28.082714 10.200.252.1 10.200.252.2 TCP 66 search-agent > 58358 [ACK] Seq=4753128 Ack=1747 Win=66048 Len=0 TSval=2951474 发布于 2013-07-24 22:29:59
完全摆脱块和应用程序ACK。如果你必须的话,只有最后一个在文件的末尾。TCP已经做了分块和ACK,你正把它逼疯了,例如,它必须要ACK的ACK。不需要这么复杂。这是一种流媒体协议:像使用流媒体一样使用它。
https://stackoverflow.com/questions/17845000
复制相似问题