下面是一个涉及到TCP紧急方式(TCP中的URG标志)的例子。
在主机sun上运行rlogin客户进程,然后登录到主机bsdi,向终端输出一个大文本文件,然后键入control s终端输出,当输出
停止时,我们键入中断键以异常方式终止该进程。
下面这些要点关于客户、服务器和链接的状态的概述:
1.键入control s以停止终端的输出。
2.用于终端的输出缓存很快被填满,所以rlogin的客户向终端的写操作被阻塞。
3.此时客户也不能从网络连接上读取数据,所以客户的TCP接收缓存也将被填满。
4.当接收缓存已满时,客户进程的TCP会向服务器进程的TCP通告现在的接收窗口是0.
5.当服务器收到客户的窗口为0时,将停止向客户发送数据,这样,服务器的发送缓存也被填满。
6.由于发送缓存已满,所以Rlogin服务器进程将停止。这样,Rlogin服务器将不能从服务器运行的cat处读取数据。
7.当cat程序的输出缓存被填满时,cat也将停止。
8.然后我们用终端键来终止服务器上cat程序,这个命令从客户的TCP传输到服务器的TCP,因为该方向的数据传输没有被
流量控制所终止。
9.cat程序收到终端命令并且终止。这使得它的输出缓存被清空,这将唤醒Rlogin服务器进程,然后Rlogin服务器进入紧急
方式,向客户进程发送清仓输出命令。虽然接收窗口还是0,但是在客户进程内部,由于客户进程的TCP接收到了对方的
紧急通知,它把该通知告诉客户进程,客户进程就知道服务器进程已经进入了紧急方式。
10.客户进程开始读取已经在输入缓存中等待被读取的数据,接收窗口就会被重新打开,然后服务器进程就开始正常发送
数据,当客户进程收到包含紧急数据的报文段,它就丢弃重新打开窗口后接收到的报文,并且清空终端的输出缓存。最后
服务器发送两个字节中断键的回显“^?”。