Linux操作系统。
我在两台计算机之间有一根以太网电缆。 C中的简单服务器 - 客户端程序,用于将文件从客户端传输到服务器。客户端从文件中读取100个字节的数据并将其发送到服务器,然后在发送下一个数据包之前等待2秒。
当客户端发送数据时,我拔出了服务器端的以太网线,因为连接断开,我预计客户端会出现一些错误。但是客户端继续将数据写入管道,服务器没有收到任何东西(但仍在等待接收).Client发送整个文件并停止。现在,我再次连接以太网电缆,服务器接收客户端发送的所有数据。这怎么可能?数据包是否存储在某个缓冲区中并在连接时再次发送?
很抱歉让它太久了。
答案 0 :(得分:8)
TCP的重点是提供可靠的数据传输,尽管下面有一个不可靠的网络。基本上,它的工作方式是TCP只考虑从远程机器接收到确认数据包后发送的数据;在那之前,内核在本地存储数据。它的缓冲时间可能会很长,具体取决于/proc
中的一系列设置以及测量的网络参数。
编辑:应用可以使用SIOCOUTQ
ioctl检查未完成发送队列的大小;请参阅tcp(7)联机帮助页。同一个联机帮助页也讨论了错误处理。
如果您希望丢失数据而不是缓冲数据,请使用UDP。
答案 1 :(得分:2)
是。根据配置,它甚至可能需要等待一段时间才能查看是否可以恢复连接。甚至,tcp超时可能只有几分钟...注意here例如,参数tcp_fin_timeout
和其他与超时相关的参数。
答案 2 :(得分:1)
在Linux上,您可以通过运行以下命令查看内核维护的发送队列和超时:
netstat -tanpo
当连接由于错误或超时而突然终止时,客户端可以通过检查write()
,shutdown()
和close()
的返回值来注意。