【问题标题】:Difference between winsock and linux socketswinsock 和 linux 套接字的区别
【发布时间】:2008-11-26 01:40:59
【问题描述】:

我正在开发一个类似 FTP 的程序,用于将大量小文件下载到 Xbox 360 开发工具包(使用 Winsock)上,并将其移植到 Playstation3(也是开发工具包,并使用 linux AFAIK)。该程序使用 BSD 样式的套接字 (TCP)。这两个程序都与同一台服务器通信,下载相同的数据。程序循环遍历所有文件,如下所示:

对于每个文件
    发送(检索命令)
    发送(文件名)
    接收(响应)
    测试响应
    接收(大小)
    接收(数据)

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

Playstation3 实施需要 4:01 处理相同的数据。瓶颈似乎在最后一次发送和第一次接收之间,占用了 3:43 的时间。网络和磁盘时间都大大少于 Xbox 360。

这两个 devkit 与我的 PC 位于同一台交换机上,我的 PC 负责提供文件服务,并且该交换机上没有其他流量。

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

我假设 Winsock 和 linux 之间的 TCP/IP 堆栈实现之间存在差异;是否可以设置一些套接字选项以使 linux 实现的行为更像 Winsock?还有什么我没有考虑到的吗?

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

不幸的是,索尼的实现没有 TCP_CORK 选项,所以我不能说这是否有区别。

【问题讨论】:

  • 您使用的是哪种 FTP 模式,被动还是主动?另外,您说“最后一次发送和第一次接收之间的时间大约需要 14 秒。这对我来说似乎很合理。”我很惊讶等待 14 秒来回复 RETR 命令是合理的,尤其是在 PS3 更长的时候。

标签: networking sockets winsock xbox360 playstation


【解决方案1】:

你想要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()... 进一步提高吞吐量...

【讨论】:

    【解决方案2】:

    Wireshark 是您的朋友,请嗅探电线——查看数据包,了解每个数据包的排序方式,看看您是否无法发现差异/问题。

    在高延迟链接上,您确实希望确保尽可能多地缓冲,以保持每个 TCP 数据包最大化。

    发送合并通常是个好主意。它仅在发送端有多个未确认帧排队时触发。通常,您应该在您知道自己在做什么并且系统提供全面缓冲的情况下禁用此功能,否则禁用它肯定会对高延迟网络上的系统性能产生负面影响。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 2017-06-01
      • 2011-07-28
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多