假设我们有一个连接C1 =(A,PortA,B,ListenPort),SockA是一个阻塞套接字,代表A End作为客户端,这里是我的问题
如果SockA的发送缓冲区中仍有很多数据,那么当它在调用close(SockA)后返回时?在发送第一个FIN之后或在发出所有数据和FIN之后函数返回?
调用close()之后,在这三个项目中,SO_LINGER超时,TIME_WAIT超时或SO_LINGER + TIME_WAIT超时,内核选择哪个项目来决定何时丢弃所有套接字即使数据量很大在发送缓冲区?
PortA将在什么时候再次可用?在SO_LINGER超时或TIME_WAIT超时后?
假设设置了SO_REUSEPORT,并且在TIME_WAIT到期之前,使用相同的PortA建立另一个连接C2 =(A,PortA,B,ListenPort)。现在,如果从HostB发送数据包,内核将数据包转发到哪个连接?
答案 0 :(得分:1)
如果SockA的发送缓冲区中仍然有很多数据,那么当它在调用close(SockA)后返回时?在发送第一个FIN之后或在发送完所有数据和FIN之后函数返回?
以上都不是。当FIN已经缓冲时返回。 NB您给出的替代方案之间没有区别。 FIN跟随数据。
调用close()之后,在这三个项目中,SO_LINGER超时,TIME_WAIT超时或SO_LINGER + TIME_WAIT超时,内核选择哪个项目来决定何时丢弃所有套接字,即使发送缓冲区中有大量数据?
以上都不是。丢弃数据的唯一方法是将delay设置为零,超时为零,这会导致RST而不是FIN并丢弃套接字发送缓冲区。在所有其他情况下,它会一直存在,直到传输或连接重置为止。
PortA何时可以再次使用?在SO_LINGER超时或TIME_WAIT超时后?
TIME_WAIT。
假设设置了SO_REUSEPORT
SO_REUSEPORT用于UDP。无论如何都与TCP无关。