【正确答案】
D
【答案解析】 本题中,对于选项A,当客户端主动关闭连接时,会发送最后一个ACK,然后进入TIME_WAIT状态,再停留2个MSL(Maximum Segment Lifetime,最大分节生命期,指的是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失)时间,进入CLOSED状态。正确的说法应该是TIME_WAIT状态是等待2个MSL时间的状态。所以,选项A错误。
对于选项B,对于sockfd,close会引起4次握手断开连接过程。shutdown之前调用close,只有当一个sockfd引用了此TCP连接,才会出现四次握手。如果多个进程或者fd引用了TCP连接,那么只close一个,只是减少一次引用。半关闭状态只能由shutdown引起,当然除了四次握手的中间暂存的状态不算,也就是半关闭不是由close引起的,而只能由shutdown引起。即使是暂态,close也不一定会引起。所以,选项B错误。
对于选项C,由于TCP连接是全双工的,因此,每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。主动发送FIN消息的连接端,收到对方回应ACK之前不能发只能收。所以,选项C错误。
对于选项D,TCP允许在传输的过程中突然中断连接,也就是TCP重置,通过设置RST为1。通过shutdown进入半关闭状态,调用close会进入四次握手断开连接。TCP连接在ESTABLISHED状态时收到RST包后,直接清理队列并删除TCB,连接进入CLOSED状态。所以,选项D正确。