假设我有一个TCP客户端和一个TCP服务器。首先,客户端将一些数据发送到服务器,但服务器正在忙于执行其他操作,因此它不会读取此连接。数据保存在服务器主机上的TCP接收缓冲区中。在这一点上,请帮助我澄清在以下不同场景中会发生什么:
close
。 FIN
已到达服务器TCP,服务器TCP已发送ACK
。此时,如果服务器在此套接字上调用read
,它将返回什么?它是否在TCP接收缓冲区中返回未读数据?或者它只返回0表示EOF
,未读数据被丢弃?read
之前,客户端会在此连接上使用shutdown
调用SHUT_WR
。 FIN
已到达服务器TCP,服务器TCP已发送ACK
。此时,如果服务器在此套接字上调用read
,它将返回什么?它是否在TCP接收缓冲区中返回未读数据?或者它只返回0表示EOF
,未读数据被丢弃?read
之前,客户端只是退出而不调用close
或shutdown
。客户端主机中的TCP将发送FIN
,此FIN
已到达服务器TCP,服务器TCP已发送ACK
。此时,如果服务器在此套接字上调用read
,它将返回什么?它是否在TCP接收缓冲区中返回未读数据?或者它只返回0表示EOF
,未读数据被丢弃?答案 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
。