我现在正在开发一个TCP服务器,并且我想知道我应该通过连接推送多少数据。问题是如果我发送大量数据(例如10 MB)但连接速度很慢(如64 kBit / sec)会发生什么?数据是否会保留在操作系统的缓冲区内,还是会被推送到互联网并缓存在某种互联网提供商服务器中?测量传输速率是否合理,只能推出连接可以处理的数据量?
答案 0 :(得分:2)
TCP通常是在假设缓冲将在任意位置发生的情况下构建的。有些将在您自己的应用程序中(当写入调用块时),一些将在操作系统中,一些在路由器中,一些在接收器的操作系统中(在应用程序读取数据之前)。
如果您编写了大量数据并且链接速度要慢得多,那么您的应用将会阻止,因为操作系统缓冲区的大小有限。如果您不希望这样,则需要使用非阻塞API并根据需要返回为套接字提供服务。
如果您关心延迟,那么TCP不太合适,它会尝试优化带宽和公平性。
如果您将尝试在写入端测量传输速度,那么您将得到一个偏差的结果,因为当操作系统和路由器将它们排队时,前几个兆字节将飞过,然后一切都会慢慢爬到大约是真正的速度但会抖动很多。我看不出有这么好的理由。
答案 1 :(得分:1)
如果我发送大量数据(例如10 MB)但连接速度很慢(如64 kBit / sec)会发生什么?
您的send()
将阻止阻止模式,或以非阻止模式返回-1/EAGAIN/EWOULDBLOCK
。
数据是否会保留在操作系统的缓冲区中
是
还是会被推送到互联网并在某种互联网提供商服务器上缓存?
没有
测量传输速率是否合理,只能推出连接可以处理的数据?
绝对不是。 TCP已经完全正确。