自连接和同时打开-jpeg标准的中文文档pdf
28.9 自连接和同时打开读者应首先理解插口与自己建立连接的步骤。接着会看到在4.4 BSD中,如何巧妙地通过一行代码修正图28-25中的错误,从而不仅能够处理自连接,还能处理4.4 BSD以前的版本中都无法正确处理的同时打开。应用进程创建一个插口,并通过下列系统调用建立自连接:socket,bind绑定到一个本地端口(假定为3000),之后connect试图与同一个本地地址和同一个端口号建立连接。如果connect成功,则插口已建立了与自己的连接:向这个插口写入的所有数据,都可以在同一插口上读出。这有点类似于全双工的管道,但只有一个,而非两个标识符。尽管很少有应用进程会这样做,但实际上它是一种特殊的同时打开,两者的状态变迁图相同。如果系统不允许插口建立自连接,那么它也很可能无法正确处理同时打开,而后者是RFC 1122所要求的。有些人对于自连接能成功感到非常惊诧,因为只用了一个Internet PCB和一个TCP控制块。不过,TCP是全双工的、对称的协议,它为每个方向上的数据流保留一份专有数据。
图28-31给出了应用进程调用connect时的发送序号空间,SYN已发送,连接状态为SYN_SENT。插口收到SYN后,执行图28-18和图28-20中的代码,但因为SYN中未包含ACK,连接状态转移到SYN_RCVD。从状态变迁图(图24-15)可知,与同时打开类似。图28-32给出了接收序号空间。图28-20置位TF_ACKNOW,tcp_output生成的报文段将包含SYN和ACK(图24-16中的tcp_outflags)。SYN序号等于153,而确认序号等于154。
图28-31自连接:SYN发送后的发送序号空间
图28-32自连接:收到的SYN处理完毕后的接收序号空间
与图28-20处理的正常情况相比,发送序号空间没有变化,只是连接状态等于SYN_SENT。图28-33给出了收到同时带有SYN和ACK的报文段时,接收序号空间的状态。
图28-33 收到带有SYN和ACK报文段时,接收序号空间的状态
详细的分析和图示信息可参考这篇文章:TCP IP连接通信。
总之,自连接的奇妙之处在于它不仅揭示了TCP/IP协议的深层机制,还展示了应用程序在面对复杂网络环境时如何处理多种连接状态。TCP作为一种强大且灵活的协议,其设计之精妙令人叹为观止!