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

标签 tcp connection buffer

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

最佳答案

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

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

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

如果您尝试仅在写入端测量传输速度,您会得到一个有偏差的结果,因为前几兆字节会在操作系统和路由器排队时飞逝而过,然后一切都会变慢,就像爬行一样接近实际速度,但会抖动很多。我看不出这样做的真正充分理由。

关于tcp - 如何确定应该通过 TCP 连接推送多少数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17745298/

相关文章:

swing - eclipselink jpa 2.0 与 j2se swing 应用程序卡住

java - WSDL2Java Axis 之后无法建立与 SOAP WebService 的连接

java - 从 arrayList 转换为 Buffer

c# - 高性能C# TCP服务器问题: No connection could be made because the target machine actively refused it

C++/TCP数据传输垃圾

java - 请求方法 GET 返回错误的内容长度

android - 在 OpenGL 中卸载顶点缓冲区

c - C 中 get 的缓冲区溢出

python - 导入错误 : No module named 'twisted'

c# - C# 中通过 TCP 套接字传输图像的问题