速读原著-TCP/IP(TCP的半关闭)
第18章 TCP连接的建立与终止
18.5 TCP的半关闭
T C P提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。正如我们早些时候提到的只有很少的应用程序使用它。
为了使用这个特性,编程接口必须为应用程序提供一种方式来说明“我已经完成了数据传送,因此发送一个文件结束( F I N)给另一端,但我还想接收另一端发来的数据,直到它给我发来文件结束(F I N)”。
如果应用程序不调用c l o s e而调用s h u t d o w n,且第2个参数值为1,则插口的A P I支持半关闭。然而,大多数的应用程序通过调用close终止两个方向的连接。
图1 8 - 1 0显示了一个半关闭的典型例子。让左方的客户端开始半关闭,当然也可以由另一端开始。开始的两个报文段和
图1 8 - 4是相同的:初始端发出的 F I N,接着是另一端对这个 F I N的A C K报文段。但后面就和图1 8 - 4不同,因为接收半关闭的一方仍能发送数据。我们只显示一个数据报文段和一个A C K报文段,但可能发送了许多数据报文段(将在第 1 9章讨论数据报
文段和确认报文段的交换)。当收到半关闭的一端在完成它的数据传送后,将发送一个F I N关闭这个方向的连接,这将传送
一个文件结束符给发起这个半关闭的应用进程。当对第二个 F I N进行确认后,这个连接便彻底关闭了。
为什么要有半关闭?一个例子是 U n i x中的r s h( 1 )命令,它将完成在另一个系统上执行一个命令。命令
sun % rsh bsdi sort < datafile
将在主机b s d i上执行s o r t排序命令,r s h命令的标准输入来自文件 d a t a f i l e。r s h将在它与在另一主机上执行的程序间建立一个 T C P连接。 r s h的操作很简单:它将标准输入(d a t a f i l e)复制给T C P连接,并将结果从 T C P连接中复制给标准输出(我们的终端)。图1 8 - 11显示了这个建立过程(牢记 T C P连接是全双工的)
在远端主机b s d i上,r s h d服务器将执行s o r t程序,它的标准输入和标准输出都是 T C P连接。第1 4章的 [Stevens 1990] 详细介绍了有关U n i x进程的结构,但这儿涉及的是使用 T C P连接以及需要使用T C P的半关闭。
s o r t程序只有读取到所有输入数据后才能产生输出。所有的原始数据通过 T C P连接从r s h客户端传送到s o r t服务器进行排序。当输入( d a t a f i l e)到达文件尾时, r s h客户端执行这个T C P连接的半关闭。接着 s o r t服务器在它的标准输入(这个 T C P连接)上收到一个文件结束符,对数据进行排序,并将结果写在它的标准输出上( T C P连接)。r s h客户端继续接收来自T C P连接另一端的数据,并将排序的文件复制到它的标准输出上。
没有半关闭,需要其他的一些技术让客户通知服务器, 客户端已经完成了它的数据传送,但仍要接收来自服务器的数据。使用两个T C P连接也可作为一个选择,但使用半关闭的单连接更好。
上一篇: B03 - 056、shell编程之一键安装三台Zookeeper
下一篇: TCP/IP协议