1

我现在正在使用 TCP 服务器,我想知道我应该通过连接推送多少数据。问题是如果我发送大量数据(例如 10 MB)但连接速度很慢(例如 64 kBit/sec)会发生什么?数据会保留在操作系统的缓冲区中,还是会被推送到 Internet 并被缓冲在某种 Internet-provider-server 中?测量传输速率是否有意义,只推出连接可以处理的尽可能多的数据?

4

2 回答 2

2

TCP 通常是在假设缓冲将发生在任意位置的情况下构建的。有些将在您自己的应用程序中(当写入调用阻塞时),有些将在操作系统中,有些在途中的路由器中,有些在接收器的操作系统中(在应用程序读取数据之前)。

如果您写入大量数据并且链接速度要慢得多,您的应用程序将阻塞,因为操作系统缓冲区的大小有限。如果您不希望这样,您将需要使用非阻塞 API 并根据需要返回以服务套接字。

如果您关心延迟,那么 TCP 不适合,它会尝试优化带宽和公平性。

如果您尝试仅在写入端测量传输速度,您将得到一个倾斜的结果,因为前几兆字节会飞过,因为它们被操作系统和路由器排队,然后一切都会慢到爬行,这几乎是真实的速度但会抖动很多。我看不出这样做的真正理由。

于 2013-07-24T19:47:33.217 回答
1

如果我发送大量数据(例如 10 MB)但连接速度很慢(例如 64 kBit/sec)会发生什么?

send()将在阻塞模式下阻塞,或以非阻塞模式返回-1/EAGAIN/EWOULDBLOCK

数据是否会留在操作系统的缓冲区中

是的。

还是会被推送到互联网并在某种互联网提供商服务器中缓冲?

不。

测量传输速率是否有意义,只推出连接可以处理的尽可能多的数据?

当然不。TCP 已经做到了这一点。

于 2013-07-24T22:21:57.687 回答