|
TCP连接的建立是从客户向服务器发送一个主动打开请求而启动的。如果服务器已经执行了被动打开操作,那么双方就可以交换报文以建立TCP连接。只有在建立TCP连接之后,双方才开始收发数据。而且,当其中一方发送完数据后,就会关闭它这一方的连接,同时向对方发送撤销TCP连接的报文。需要注意的是,TCP连接的建立是一个非对称的活动,即一方执行被动打开而另一方执行主动打开(更准确地说,当双方试图同时打开连接时,连接的建立是对称的。但常见的情况是一方执行主动打开,另一方执行被动打开);而连接终止则是对称的活动,即每一方都独立地关闭连接。因此,有可能一方已经完成了关闭连接,即它不再发送数据,但是另一方却保持双向连接的另一半打开状态并且继续发送数据。
|
|
|
TCP连接的建立和终止使用了三次握手(Three-way Handshake)机制。三次握手是指客户和服务器之间要交换三次报文,如下图所示。
|
|
|
|
|
三次握手机制的基本思想是,连接双方需要协商一些参数,在打开一个TCP连接的情况下,这些参数就是双方打算为各自的字节流使用的初始序号。
|
|
|
(1)首先,客户(主动参与方)发送一个连接建立请求报文给服务器(被动参与方),声明它将使用的初始序号(SYN,SEQ=x)。
|
|
|
(2)服务器用一个连接建立响应报文,确认客户端的序号(ACK=x+1),同时声明自己使用的开始序号(SYN,SEQ=y)。也就是说,第二个报文的Flags字段的SYN和ACK标志位都设置为1。
|
|
|
(3)最后,客户用第三个报文来响应并且确认服务器的开始序号(ACK,ACK=y+1)。确认序号比发送来的序号大1的原因是确认序号(Acknowledgment Number)字段实际标明了“所希望的下一个字节序号”,因此隐含地确认所有前面的字节序号。
|
|
|
虽然,上图没有显示出重传定时器的事情,但是在前面两个报文中都使用了定时器,而如果发送方没有接收到所希望的应答,就会重发该报文。
|
|
|
读者可能会问,为什么在TCP连接建立阶段客户和服务器要相互交换开始序号呢?如果建立连接的双方简单地从已知的序号开始(比如每次都从0开始)会比较简单。实际上,TCP要求连接的每一方随机地选择一个初始序号,这样做的原因是防止黑客太容易猜测初始序号而进行TCP连接劫持攻击。
|
|
|