这是Jon C. Snader的著作 [Effective TCP/IP Programming --
44 Tips to Improve Your Network Programs] 其中一个Tip的开头。
作者网站: http://www.netcom.com/~jsnader
(我看的是繁体版 林洙如 译, 当然首选的教课书应是Stevens的UNIX
NETWORK PROGRAMMING 2nd系列的书, 可惜他已不在人世!)
---------------------------------------------------------------
TIP 10:记得,TCP/IP不是一直发出探测讯息的通讯协定
熟悉其他网路技术的网路工程师在刚开始接触TCP/IP通讯协定时, 一
旦他们发现TCP 不能立即对应用程式提供连结中断通知, 往往会觉得疑
惑甚至是失望。某些人甚至就下了TCP 不适合使用在应用程式间通讯的
结论。在这个TIP中我们将讨为何TCP没有提供这种通知的原因, 这种做
法的优缺点在那里, 以及应用程式设计师应采取何种方法, 来侦测连结
是否已经中断。
如同我们在TIP 9 中所看到的, 网路中断或系统当机, 可能使得两端
的应用程式在错误发生时, 无法立即被侦测到, 也无法继续传递讯息。
而传送端的应用程式, 直到TCP 放弃重传之前, 它不会发现该连结已经
中断。在耗费相当可观的时间之后, 它才会发现连结已经中断, 因为在
BSD 系统中, TCP 大约九分钟之后才会放弃重传。而且, [red]假如这个应用
程式并没有处在传送资料的状态下, 它可能永远也不会发现连结中断了[/red]
...
设计TCP 时不提供连结中断的立即通知, 其最重要的原因即是它主要
的设计目的: 当面对网路的瘫痪时, 它要具备继续维持通讯的能力。TCP
是(美国)国防部所支持的研究计划的产物, 它的设计理念是, 即使它面
对的是因战争或重大天然灾害而造成的网路瘫痪, 它所提供的网路通讯
协定也要能维持电脑之间可靠的通讯。网路中断常常只是暂时性的, 或
者路由器可以为连结找到一条(不同的)路径。藉由容忍暂时的连结中断,
TCP 甚至能够在相对两端的应用程式都不知道的情况下度过网路中断的
危机。
---------------------------------------------------------------
至于为何很多人经验上或认为网路中断时可以立即得知, 其实这就要了
解TCP/IP的原理, 比方说你是以拨接PPP 连上线, 因为不是固定IP, 所
以即使断线后重新连上Internet, 但你的IP已经变更了, 这时就算两端
的程式未曾中止, 但再也连不上了。如果你是使用固定IP的话, 可以试
试看将你的网路线拔掉一会再接上, 这时你的程式还是可正常接收, 并
不会中断。