【问题标题】:The effect close/shutdown has on the TCP receive buffer关闭/关闭对 TCP 接收缓冲区的影响
【发布时间】:2015-03-12 07:23:35
【问题描述】:

假设我有一个 TCP 客户端和一个 TCP 服务器。首先,客户端向服务器发送了一些数据,但是服务器正忙于做其他事情,所以它没有读取这个连接。数据保存在服务器主机的 TCP 接收缓冲区中。在这一点上,请帮助我澄清在以下不同情况下会发生什么:

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

【问题讨论】:

    标签: sockets networking tcp shutdown


    【解决方案1】:

    在服务器调用读取之前,客户端调用关闭此连接。并且 FIN 已经到达服务器 TCP,服务器 TCP 已经发送了 ACK。那么此时,如果服务器在这个socket上调用read,read会返回什么?是否返回 TCP 接收缓冲区中的未读数据?

    是的。

    还是只是返回0表示EOF,未读数据被丢弃?

    没有。

    在服务器调用读取之前,客户端在此连接上使用 SHUT_WR 调用关闭。并且 FIN 已经到达服务器 TCP,服务器 TCP 已经发送了 ACK。那么此时,如果服务器在这个socket上调用read,read会返回什么?它是否返回 TCP 接收缓冲区中的未读数据?还是只是返回0表示EOF,未读数据被丢弃?

    同上。

    在服务器调用读取之前,客户端直接退出而不调用关闭或关闭。并且客户端主机中的 TCP 会发送 FIN,这个 FIN 已经到达服务器 TCP,服务器 TCP 已经发送了 ACK。那么此时,如果服务器在这个socket上调用read,read会返回什么?它是否返回 TCP 接收缓冲区中的未读数据?还是只是返回0表示EOF,未读数据被丢弃?

    同上。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多