2008-11-26 37 views
6

我正在开发一个类似FTP的程序,将大量小文件下载到Xbox 360 devkit(使用Winsock),并将其移植到Playstation3(也是一个开发工具包,并使用Linux据我所知)。该程序使用BSD风格的套接字(TCP)。这两个程序都与同一台服务器通信,下载相同的数据。该程序遍历在这样的循环中的所有文件:winsock和linux套接字之间的区别

for each file 
    send(retrieve command) 
    send(filename) 
    receive(response) 
    test response 
    receive(size) 
    receive(data) 

在Xbox 360执行,整个下载时间1:27,最后发送之间和第一接收时间大约需要14秒。这对我来说似乎很合理。

对于相同的数据,Playstation3实施需要4点01分。瓶颈似乎在最后一次发送和第一次接收之间,这个时间占用了3:43。网络和磁盘时间都比Xbox 360要小得多。

这两个devkits与我的PC都在同一个交换机上,这个文件服务器提供文件服务,并且在所述交换机上没有其他流量。

我试过设置TCP_NODELAY标志,这并没有显着改变事情。我也尝试将SO_SNDBUF/SO_RCVBUF设置为625KB,这也不会显着影响时间。

我假设不同之处在于Winsock和linux之间的TCP/IP栈实现;是否有一些套接字选项可以让linux实现更像Winsock?还有别的我没有考虑的吗?

唯一的解决方案是重写它,以便它将所有文件请求发送到一起,然后全部接收它们。

不幸的是,索尼的实施没有TCP_CORK选项,所以我不能说这是否是差异。

+0

您正在使用哪种FTP模式,被动还是主动? 另外,你说“上次发送和第一次接收之间的时间大约需要14秒,这对我来说似乎很合理。”我很惊讶,等待14秒钟回复RETR命令是合理的,特别是当PS3的时间更长时。 – Alexander 2008-11-27 16:50:40

回答

2

你想要TCP_CORK。它会阻止部分帧被发送,从而增加吞吐量(以延迟为代价) - 就像winsock一样。

int v,vlen; 
v=1; vlen=sizeof(v); 
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen); 

设置v=0刷新帧之前收到:

int v,vlen; 
v=0; vlen=sizeof(v); 
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen); 

在大多数Unix系统中,你可以通过使用writev()sendfile()进一步提高你的吞吐量......

1

Wireshark是你的朋友,嗅探看看数据包,看看每个数据包是如何排序的,看看你是否无法发现差异/问题。

在高延迟链路上,您确实需要尽可能缓冲以保持每个TCP数据包最大。

发送合并通常是一个好主意。它只在发送端有多个未确认的帧排队时触发。通常,只有只有禁用此功能,如果您知道自己在做什么以及您的系统提供全面缓冲,则禁用该功能肯定会对高延迟网络中的系统性能造成负面影响。

对于最高吞吐量缓冲区分界点应该是路径MTU的确切因子。

相关问题