关闭/关闭效果对TCP接收缓冲区有影响

时间:2015-01-14 06:58:30

标签: sockets networking tcp shutdown

假设我有一个TCP客户端和一个TCP服务器。首先,客户端将一些数据发送到服务器,但服务器正在忙于执行其他操作,因此它不会读取此连接。数据保存在服务器主机上的TCP接收缓冲区中。在这一点上,请帮助我澄清在以下不同场景中会发生什么:

  1. 在服务器调用读取之前,客户端在此连接上调用closeFIN已到达服务器TCP,服务器TCP已发送ACK。此时,如果服务器在此套接字上调用read,它将返回什么?它是否在TCP接收缓冲区中返回未读数据?或者它只返回0表示EOF,未读数据被丢弃?
  2. 在服务器调用read之前,客户端会在此连接上使用shutdown调用SHUT_WRFIN已到达服务器TCP,服务器TCP已发送ACK。此时,如果服务器在此套接字上调用read,它将返回什么?它是否在TCP接收缓冲区中返回未读数据?或者它只返回0表示EOF,未读数据被丢弃?
  3. 在服务器调用read之前,客户端只是退出而不调用closeshutdown。客户端主机中的TCP将发送FIN,此FIN已到达服务器TCP,服务器TCP已发送ACK。此时,如果服务器在此套接字上调用read,它将返回什么?它是否在TCP接收缓冲区中返回未读数据?或者它只返回0表示EOF,未读数据被丢弃?

1 个答案:

答案 0 :(得分:3)

  

在服务器调用read之前,客户端调用在此连接上关闭。并且FIN已到达服务器TCP,并且服务器TCP已发送ACK。那么在这一点上,如果服务器调用读取此套接字,那么将返回什么内容?它是否在TCP接收缓冲区中返回未读数据?

  

或者它只返回0表示EOF,未读数据被丢弃?

没有

  

在服务器调用read之前,客户端在此连接上使用SHUT_WR调用shutdown。并且FIN已到达服务器TCP,并且服务器TCP已发送ACK。那么在这一点上,如果服务器调用读取此套接字,那么将返回什么内容?它是否在TCP接收缓冲区中返回未读数据?或者只返回0表示EOF,未读数据被丢弃?

与上述相同。

  

在服务器调用read之前,客户端只需退出而不调用close或shutdown。并且客户端主机中的TCP将发送FIN,此FIN已到达服务器TCP,并且服务器TCP已发送ACK。那么在这一点上,如果服务器调用读取此套接字,那么将返回什么内容?它是否在TCP接收缓冲区中返回未读数据?或者只返回0表示EOF,未读数据被丢弃?

与上述相同。

接收缓冲区可以被清除的唯一方法是读取所有数据,或者如果服务器收到 reset ,即RST,这可能是以各种方式引起的,或者当然,如果服务器在没有读取所有数据的情况下关闭套接字,在这种情况下,如果有待处理的读取数据,发出 RST