关闭/关闭对TCP接收缓冲区的影响

3
假设我有一个TCP客户端和一个TCP服务器。首先,客户端向服务器发送一些数据,但是服务器正在忙于其他事情,因此它没有读取此连接。数据保留在服务器主机上的TCP接收缓冲区中。此时,请帮我澄清以下不同情况下会发生什么:
  1. 在服务器调用read之前,客户端在此连接上调用close。并且FIN已到达服务器TCP,并且服务器TCP已发送ACK。此时,如果服务器在此套接字上调用read,它会返回什么?它会返回TCP接收缓冲区中未读取的数据吗?还是只返回0以表示EOF,并且未读取的数据被丢弃?
  2. 在服务器调用read之前,客户端使用SHUT_WR调用shutdown关闭此连接。并且FIN已到达服务器TCP,并且服务器TCP已发送ACK。此时,如果服务器在此套接字上调用read,它会返回什么?它会返回TCP接收缓冲区中未读取的数据吗?还是只返回0以表示EOF,并且未读取的数据被丢弃?
  3. 在服务器调用read之前,客户端只是退出而没有调用close或shutdown。并且客户端主机中的TCP将发送FIN,这个FIN已到达服务器TCP,并且服务器TCP已发送ACK。此时,如果服务器在此套接字上调用read,它会返回什么?它会返回TCP接收缓冲区中未读取的数据吗?还是只返回0以表示EOF,并且未读取的数据被丢弃?
1个回答

3
在服务器调用read之前,客户端会在此连接上调用close。FIN已经到达服务器TCP,并且服务器TCP已发送ACK。因此,在这一点上,如果服务器在此套接字上调用read,读取将返回什么?它是否返回TCP接收缓冲区中未读取的数据?
是的。
还是只返回0以表示EOF,未读取的数据被丢弃?
不。
在服务器调用read之前,客户端使用SHUT_WR关闭此连接。FIN已经到达服务器TCP,并且服务器TCP已发送ACK。因此,在这一点上,如果服务器在此套接字上调用read,读取将返回什么?它是否返回TCP接收缓冲区中未读取的数据?还是只返回0以表示EOF,未读取的数据被丢弃?
与上述情况相同。
在服务器调用read之前,客户端退出而没有调用close或shutdown。客户端主机中的TCP将发送FIN,该FIN已到达服务器TCP,并且服务器TCP已发送ACK。因此,在这一点上,如果服务器在此套接字上调用read,读取将返回什么?它是否返回TCP接收缓冲区中未读取的数据?还是只返回0以表示EOF,未读取的数据被丢弃?
与上述情况相同。
接收缓冲区清除的唯一方法是读取所有数据,或者如果服务器收到复位(reset),即RST,这可能以各种方式引起,或者当服务器关闭套接字而未读取所有数据时,它会发出RST(如果存在待处理的读取数据)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接