如何确定应该通过TCP连接推送多少数据?

时间:2013-07-19 11:43:32

标签: tcp connection buffer

我现在正在开发一个TCP服务器,并且我想知道我应该通过连接推送多少数据。问题是如果我发送大量数据(例如10 MB)但连接速度很慢(如64 kBit / sec)会发生什么?数据是否会保留在操作系统的缓冲区内,还是会被推送到互联网并缓存在某种互联网提供商服务器中?测量传输速率是否合理,只能推出连接可以处理的数据量?

2 个答案:

答案 0 :(得分:2)

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

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

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

如果您将尝试在写入端测量传输速度,那么您将得到一个偏差的结果,因为当操作系统和路由器将它们排队时,前几个兆字节将飞过,然后一切都会慢慢爬到大约是真正的速度但会抖动很多。我看不出有这么好的理由。

答案 1 :(得分:1)

  

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

您的send()将阻止阻止模式,或以非阻止模式返回-1/EAGAIN/EWOULDBLOCK

  

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

  

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

没有

  

测量传输速率是否合理,只能推出连接可以处理的数据?

绝对不是。 TCP已经完全正确。