半关闭是什么
TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓
的半关闭。
什么时候处于半关闭
如图所示当四次挥手处于被动关闭的一方在收到主动关闭方的FIN时,进入CLOSE_WAIT状态,主动方收到对方的同意ACK后就进入了半关闭状态。此时,左方还可以收到右方所发送过来的数据。当右方已经没有数据可发时向对方发送FIN,等对方回复确认ACK后,这个TCP的链接便彻底关闭了。
为什么要有半关闭
例如:在Unix中的rsh( 1 )命令,它将完成在另一个系统上执行一个命令。
命令 sun % rsh bsdi sort < datafile
将在主机bsdi上执行sort排序命令,rsh命令的标准输入来自文件datafile。rsh将在它 与在另一主机上执行的程序间建立一个 TCP连接。 rsh的操作很简单:它将标准输入 (datafile)复制给TCP连接,并将结果从 TCP连接中复制给标准输出。(牢记TCP连接是全双工的)
sort程序只有读取到所有输入的数据后才能产生输出。而仅通过TCP来传输数据,会出现一些难以解决的问题,比如发送方数据已经发完后,没有数据可发,但是接收方无法知道数据已经发完,而会继续等待发送方发送数据,发送方只能通过发一下特定的东西来提示接收方数据已经发完,但又可能出现接收方并不认识发送方的提示,而将该提示也当作待处理的数据,这样两方就都会处于尴尬的阻塞,来等待对方的消息。现在半关闭就可以将此问题很简单的处理,发送方发现数据到达文件尾时,即没有数据发送了,这时发送方发送一个FIN来通知接收方我数据已经发送完了,接收方收到FIN后,向发送发回复一个ACK表示收到发送方的状态,此时发送方进入了半关闭的状态,但是还可以就收对方发送的数据,于是就等待对方对数据进行操作并把结果反馈给我。
小结
半关闭可以很好的完成发送端对接收端的数据发送完的提醒,并且也不影响发送端接收对端的结果回应。