TCP连接管理——三次握手和四次挥手

2019-05-25 19:51:16 浏览数 (1)

版权声明:本文为博主原创文章,转载请注明博客地址: https://cloud.tencent.com/developer/article/1433300

TCP连接的建立——三次握手

TCP连接的建立过程通常被称为“三次握手”。客户端与服务器之间建立TCP连接的过程如下。

三次握手

  1. 客户端向服务器发送一个特殊的TCP报文段——SYN报文段。它不包含数据,但是会将TCP首部的SYN设置为1。并且,客户端会随机生成一个初始序号(client_isn)放在该报文段的序号字段中。随机生成序号有利于避免某些网络攻击。
  2. 服务器接收客户端发送的SYN报文段。服务器分配缓存和变量,并向客户端发送允许连接的报文段。这个允许连接的报文段也不包含数据,但是它的TCP首部SYN标志置1,将服务器生成的初始序号(server_isn)放在序号字段中,ACK被设置为client_isn 1。这段报文称为SYNACK报文段。
  3. 客户端收到SYNACK报文段以后,客户端分配缓存和变量,并向客户端发送报文段。该报文段的SYN被设置为0。序号被设置为client_isn 1,ACK被设置为server_isn 1。在这个阶段TCP报文段是可以携带数据的,因为连接已经建立了。

连接一旦被建立,那么以后的报文段中SYN都是0。

TCP连接的断开——四次挥手

TCP连接终止的时候,通常也是由客户端发起的。客户端向服务器发送一段特殊的TCP报文,这段报文首部的FIN标志设置为1.当服务器收到该报文后,就向客户端发送一个ACK。然后,服务器向客户端发送一个FIN请求,客户端接着向服务器发送一个ACK。到此为止,TCP连接被终止,所有的资源将被释放。

四次挥手

为什么需要初始序号?

序号是为了让发送方的数据到达接收方以后能够按序接收,从而组装数据。TCP采用随机初始化序号是为了避免一些网络攻击。如果初始序号是固定的,那么就很容易被恶意利用,恶意攻击者一旦知道了IP地址和端口号,就能很轻松的伪造TCP报文段,从而打断正常的TCP连接。而初始序号是随机化的,就很好地避免了这一点。

为什么是3次握手,而不是两次?

因为至少需要3次才能让通信的双方各自明确与它通信的那一方以及它自己的收发能力是否正常。同时也需要双方交换初始序号。

第一次握手,服务端收到客户端发送的SYN报文段,明确了发送方的发送能力是正常的和自己的接收能力是正常的;第二次握手,客户端收到服务器的SYNACK报文段,明确了服务器的接受和发送能力都是正常的,以及自己的发送能力是正常的;第三次握手,客户端发送报文段到服务器,让服务器明确了客户端接受能力是正常的(第三次握手是对第二次握手的回应)。也明确了自己的发送能力是正常的。当3次握手完成以后,客户端和服务器的连接就真正建立了。

这就像是两个齐心协力合作者之间的沟通,在开始做某件事情之前,它们进行的充分的沟通。

A:B,你准备好了吗?(SYN报文段)

B:A,我准备好了,你呢?(ACK SYN报文段)

A:我也准备好了,开始吧!(报文段)

经过上面的沟通,A和B就确认了对方都准备好了。那么接下来就可以正式开始了。

从上面的分析过程,我们可以看出,二次握手是不足以使通信双方确认对方的收发能力是否正常。而3次握手是可以确认的。显然,4次握手肯定也是可以确认的。所以,3次握手就是最少的握手次数。TCP协议也就理所当然的选择了3次握手,而非其他。

握手是3次,挥手是4次,这是为什么?

TCP传输是全双工的,当客户端和服务器一方发起了FIN终止请求的时候,另一方回复ACK,使得单向的数据传输终止(假设此处是客户端发起FIN请求,服务器回复客户端ACK)。但是TCP并不清楚服务器上层应用接下来会干什么?是否还有数据需要传输到客户端,所以仅仅回复客户端一个ACK,而不是ACK FIN。等待服务器端的上层应用不再传输数据的时候,服务器才主动给客户端发送FIN报文段,并等待接收方ACK回复,收到该ACK的时候,通信的双方才真正的断开连接。

所以,连接的建立只需要3次握手,而连接的断开需要4次挥手。

0 人点赞