TCP协议的三向握手和四向波过程的详细说明

时间:2020-10-20

在线会议平台

 尽管TCP和UDP使用相同的网络层(IP),但TCP提供的服务从UDP到应用层完全不同。TCP提供面向连接的可靠字节流服务。

 面向连接意味着使用TCP的两个应用程序(通常是客户端和服务器)在相互交换数据之前必须建立一个TCP连接。这个过程非常类似于调用。先打电话,等对方拿起电话打招呼,然后解释是谁。

 本文将解释在传统的TCP协议中建立连接(所谓的“三次握手”)和断开连接(所谓的“四次波”)的过程。

 相关资源

 让我们首先了解一下TCP消息格式

 有关协议的详细信息,请参见协议详细说明中关于协议格式的章节(单击此处查看协议详细在线版)。

 下面是传输控制协议消息格式图:

 理论经典:对TCP协议的三向握手和四向波过程的详细解释

 上图中有几个字段需要突出显示:

 (1)序列号:Seq序列号,占用32位,用于标识从TCP源发送到目的地的字节流,在发起方发送数据时进行标记。

 (2)确认序列号:确认序列号,占32位。确认序列号字段仅在确认标志位为1且确认=Seq+1时有效。

 (3)总共有6个标志位,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:

 紧急指针有效。

 确认:确认序列号有效。

 (三)PSH:接收方应尽快将此消息提交给应用层。

 RST:重置连接。

 同步:启动一个新的连接。

 (六)FIN:释放连接。

 应该指出的是:

 (a)不要混淆标志位中的确认和确认。

 (b)确认者的Ack=发起者的Req+1,两端成对。

 三次握手过程的详细说明

 所谓的三向三向握手()是指当建立一个TCP连接时,客户端和服务器总共需要发送三个数据包来确认连接的建立。在套接字编程中,这个过程是由执行连接的客户端触发的,整个过程如下图所示:

 理论经典:详细解释了TCP协议的三向握手和四向波过程

 (1)第一次握手:

 客户端将标志位SYN设置为1,随机生成一个值seq=J,并将数据包发送到服务器,客户端进入SYN_SENT状态,等待服务器确认。

 (2)第二次握手:

 收到数据包后,服务器知道客户端请求通过标志位SYN=1建立连接。服务器将标志位SYN和ACK设置为1,ack=J+1,随机生成一个值seq=K,并将数据包发送给客户端以确认连接请求。服务器进入同步RCVD状态。

 (3)第一次三方握手:

 收到确认后,客户端检查确认是否为J+1,确认是否为1。如果正确,它将标志确认设置为1,确认=K+1,并将数据包发送到服务器,服务器检查确认是否为K+1,确认是否为1。如果正确,则连接成功建立,客户机和服务器进入建立状态并完成三次握手,然后客户机和服务器之间的数据传输可以开始。

 同步攻击:

 在三次握手的过程中,在服务器发送同步确认后,从客户端收到确认前的TCP连接称为半开连接。此时,服务器处于同步RCVD状态,收到确认后,服务器进入建立状态。同步攻击是指客户端在短时间内伪造大量不存在的IP地址,并不断向服务器发送同步数据包。服务器回复确认数据包,并等待客户端的确认。因为源地址不存在,服务器需要重新发送它,直到超时。这些伪造的SYN数据包将占用未连接的队列,导致正常的SYN请求被丢弃,因为队列已满,从而导致网络拥塞甚至系统瘫痪。同步攻击是一种典型的分布式拒绝服务攻击。检测同步攻击的方法非常简单,即当服务器上存在大量的半连通状态,并且源IP地址是随机的时,可以断定它受到了同步攻击。使用以下命令将其激活:

 #netstat -nap | grep SYN_RECV

 四波过程的详细解释

 三次握手很常见,据估计,经过四次握手后,很少有人知道。所谓的四路波手是终止TCP连接,这意味着当TCP连接断开时,客户端和服务器需要发送总共四个数据包来确认断开。在套接字编程中,这个过程是由客户机或服务器执行close触发的,整个过程如下图所示:

 理论经典:详细解释三向握手和四向波过程

 因为TCP连接是全双工的,所以每个方向都必须独立关闭。其原理是当一方完成数据传输任务时,它发送一个FIN来终止这个方向的连接。接收FIN仅意味着在这个方向上没有数据流,也就是说,不会再接收到数据,但是数据仍然可以在这个TCP连接上发送,直到FIN在这个方向上发送。关闭的第一方将执行主动关闭,而另一方将执行被动关闭,如上图所述。

 第一次挥手:

 客户端发送一个FIN来关闭从客户端到服务器的数据传输,客户端进入FIN_WAIT_1状态。

 第二次挥手:

 在接收到FIN后,服务器向客户端发送确认消息,确认序列号为接收到的序列号+1(与SYN相同,一个FIN占用一个序列号),服务器进入CLOSE_WAIT状态。

 第三次挥手:

 服务器发送一个FIN来关闭从服务器到客户端的数据传输,服务器进入最后确认状态。

 第四波:

 接收到FIN后,客户端进入TIME_WAIT状态,然后向服务器发送确认消息,确认序列号为接收到的序列号+1,服务器进入CLOSED状态并完成四次挥动。

 以上是一方主动关闭而另一方被动关闭的情况。实际上,它也会同时启动主动关闭。具体流程如下:

 理论经典:详细解释TCP协议的三向握手和四向波过程

 过程和状态在上图中是清楚的,所以我们在这里不再重复,而是参考前面的四个波形分析步骤。

 结论

 通常会有关于三次握手和四次挥手的典型面试问题,在此提出,供需要的XD视酷参考:

 (1)什么是三方握手或过程?四次握手怎么样?分析之前的答案是。

 (2)为什么建立连接是三次握手,而关闭连接是四次握手?

 这是因为当服务器在侦听状态下接收到连接建立请求的同步消息时,它会将确认和同步放在一个消息中,并将其发送给客户端。当关闭连接时,当从另一方接收FIN消息时,这仅仅意味着另一方不再发送数据,但是仍然可以接收数据。我们自己的一方可能不会将所有数据发送给另一方,因此我们可以立即关闭它,或者向另一方发送一些数据,然后向另一方发送FIN消息,以表明我们同意立即关闭连接。因此,我们的确认和确认通常是分开发送的。