TCP连接的建立和终止

理解协议

大师级别的技术作家Richard Stevens先生在UNP2e的前言中写道:

I have found when teaching network programming that about 80% of all network programming problems have nothing to do with network programming, per se. That is, the problems are not with the API functions such as accept and select, but the problems arise from a lack of understanding of the underlying network protocols. For example, I have found that once a student understands TCP’s three-way handshake and four-packet connection termination, many network programming problems are immediately understood.

作者阐述了这么一个事实:大部分网络编程问题与API函数的使用无关,问题多是因对网络协议理解不够而导致的。所以,学好TCP/IP协议非常重要,首选之作当属Stevens先生的TCP/IP Illustrated。我觉得The TCP/IP Guide对新手更友好,讲解细致,插图精美,这本书可以在线阅读,也有免费的pdf下载。

连接的建立和终止过程

TCP连接的建立和终止过程就不用我蹩脚地重述一遍,The TCP/IP Guide的插图基本可以将全过程描述清楚。TCP连接建立的过程又称之为“三路握手”(Three-Way Handshake)(图片来源:TCP Connection Establishment):

tcp_open

TCP连接终止的过程又称之为“四路握手”(Four-Way Handshake)(图片来源:TCP Connection Termination):

tcp_close

为什么是三路和四路

TCP必须保证通道双向都通畅,所以两端都要向对方发送数据并能收到对方的回复。同时,双方都要知晓彼此的初始序列号(Initial Sequence Number)以及其它参数,即握手的过程也要交流信息。这样来看,两端一共要传送四个控制消息。建立连接时,被动打开的一端可以将自己的SYN和回复给对方的ACK一起发送过去,所以只需要“三路握手”。终止连接时,被动关闭的一端收到FIN之后,要等待应用程序完成任务后才能关闭连接,所以只能先回复一个ACK,等待一段时间后再发送自己的FIN给对方,不能一起发送过去,所以需要“四路握手”。

参考

  1. 谈一谈网络编程学习经验
  2. The TCP/IP Guide