【摘要】:TCP 连接的建立是从客户向服务器发送一个主动打开请求而启动的。当其中一方发送完数据后,就会关闭它这一方的连接,同时向对方发送撤销TCP 连接的报文。TCP 连接的建立使用了三次握手机制。实际上,TCP 要求建立连接的每一方随机地选择一个初始序号,这样可防止黑客容易猜测到初始序号而进行TCP 连接劫持攻击。收到一个FIN 只意味着这一方向上没有数据流动,一个TCP 连接在收到一个FIN 后仍然能够发送数据。
TCP 连接的建立是从客户向服务器发送一个主动打开请求而启动的。如果服务器已经执行了被动打开操作,那么双方就可以交换报文以建立TCP 连接。只有在建立TCP 连接之后,双方才开始收发数据。当其中一方发送完数据后,就会关闭它这一方的连接,同时向对方发送撤销TCP 连接的报文。
TCP 连接的建立使用了三次握手机制。三次握手是指客户和服务器之间要交换三次报文,如图8.4所示。
图8.4 用三次握手建立TCP 连接
三次握手机制的基本思路是,连接双方需要协商一些参数,在打开一个TCP 连接的情况下,这些参数就是双方打算为各自的字节流使用的初始序号。
首先,客户发送一个连接建立请求报文给服务器,声明它将使用的初始序号(SYN,seq =x)。
其次,服务器用一个连接建立相应报文,确认客户端的序号(ack =x +1),同时声明自己使用的开始序号(SYN,seq=y)。也就是说,第二个报文的SYN 和ACK 标志位都设置为“1”。
最后,客户用第三个报文来响应并确认服务器的开始序号(ACK,ack =y +1)。确认序号比发送过来的序号大“1”的原因是,确认序号字段实际标明了“所希望的下一个字节序号”,因而隐含地确认所有前面的字节序号。(www.chuimin.cn)
为什么在TCP 建立阶段客户和服务器要相互交换开始序号呢?如果建立连接的双方简单地从已知的序号开始(如每次都从“0”开始)会比较简单。实际上,TCP 要求建立连接的每一方随机地选择一个初始序号,这样可防止黑客容易猜测到初始序号而进行TCP 连接劫持攻击。
在关闭一个TCP 连接时,通常需要四次握手。由于TCP 连接是全双工的,因此每一个方向都必须单独进行关闭。当一方完成它的数据发送任务后,就发送一个终结包FIN 来终止这个方向的连接。收到一个FIN 只意味着这一方向上没有数据流动,一个TCP 连接在收到一个FIN 后仍然能够发送数据。假设A 为客户端,B 为服务器端,TCP 连接关闭的过程如下:
①客户端A 发送一个FIN,用来关闭客户端A 到服务器端B 的数据传送。
②服务器B 收到这个FIN 后,发回一个ACK,确认序号为收到的序号加“1”。与SYN 一样,一个FIN 将占用一个序号。
③服务器B 关闭与客户端A 的连接,发送一个FIN 给客户端A。
④客户端A 发回ACK,并将确认号设置为收到序号加“1”。
相关推荐