🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。
🤼专栏收录于:计算机网络原理
在使用TCP协议进行网络交互时,TCP会进行三次握手即建立连接,TCP四次挥手即断开连接。三次握手与四次挥手后就完成了网络交互,这样的操作也叫TCP的连接管理机制,本篇博文将详细介绍TCP通信过程和三次握手、四次挥手过程。
目录
1、TCP通信过程
1.1 TCP首部报头
1.2 TCP通信过程
2、三次握手
2.1 三次握手流程
2.2 为什么要三次握手
3、四次挥手
3.2 为什么要四次挥手
1、TCP通信过程
1.1 TCP首部报头
TCP首部(TCP Header)是TCP协议中的报头部分,它跟随在IP报头后面。TCP报头通常由20个字节组成,其中包括了一些标志位、序列号、确认号、端口号等信息,用于在TCP通信中控制和传递数据。
源端口号/目的端口号:表示数据的发送方与数据的接受方端口号
32位序号/32位确认序号:TCP将每个字节的数据都进行了编号即为序列号。
6位标志位:TCP的6位标志位默认为0,当返回相应的报文时,会把该报文位设置位1。
URG(Urgent):表示是否包含紧急数据。
ACK(Acknowledgment):表示确认号是否有效。
PSH(Push):表示是否立即推送。
RST(Reset):表示连接是否复位。携带RST标识的称为复位报文段。
SYN(Synchronize):表示同步请求/应答。携带SYN标识的称为同步报文段
FIN(Finish):表示传输结束。携带FIN标识的为结束报文段。
当TCP客户端和服务器建立连接时,它们会共同存储一些连接状态信息,以便在数据传输和连接释放的过程中使用。这些状态信息包括:
-
序列号(Sequence Number):用于对TCP数据段进行排序和重组。
-
确认号(Acknowledgment Number):用于确认在连接过程中收到的数据段的数量。
-
窗口大小(Window Size):用于指定接收端能够接收的数据量大小。
-
状态标志(Flags):用于指定TCP连接的状态、数据段类型和连接状态的变化等信息。
-
超时时间(Timeout):用于指定数据段传输时间的最大限制,超过该限制则认为连接出现了问题。
1.2 TCP通信过程
TCP通信过程模拟:
我们观察到 主机A 向 主机B 传输数据时,提供了以 1000 为单位的编号。这些编号称为 序列号。
我们可认为 主机A 向 主机B 发送数据为一个请求 即 SYN。TCP给这个请求随机分配一个序列号即SEQ。
并且 主机B 在收到 主机A 的数据后会作出回应,这个回应称之为 即 ACK。只有接收方返回 ACK 后,这样的通信才算完成。
确认序列号 的是序列号的下一个字节数。当 SYN 请求序列号为 1000,则 ACK 确认序列号为 1001,对照上图、下图进行理解。
注意,以上的 SYN 和 ACK 是怎样进行传输的呢,我们知道6位标志位默认为0,第1位到第6位分别为:URG、ACK、PSH、RST、SYN、FIN 。当要进行 SYN 请求时,则传输000010。当要进行 ACK 确认序列号时则传输 010000。
2、三次握手
握手(handshake)指通信双方进行网络交互,TCP 建立连接时客户端与服务器之间需要进行三次交互来完成连接。
建立连接一定是客户端向服务器发起的,在 TCP 协议下客户端首先向服务器发送建立连接请求即 SYN 报文段,服务器在接受到请求后会返回 ACK 确认序号。
服务器为了确保与客户端建立连接会向客户端也发送 SYN 报文段,客户端再返回 ACK 确认序号。这样客户端与服务器就完成了连接。
举例说明:
张三想与如花确定男女朋友关系,首先张三向如花发送求爱请求:“你可以做我的唯一吗?”(SYN)。
如花答应张三并返回确认信息:“我愿意”(ACK),但如花想张三也是她的唯一也向扎张三发送信息:“你也愿意做我的唯一吗?”(SYN)。
张三回复:“我愿意”(ACK)。
以上过程看似是四次交互,但实际中间两次交互可合并为一条交互,因此上述过程为三次握手。
只有双方都确定了彼此之间的信息这样才能完成建立连接。TCP中可通过序列号、确认号来保存彼此之间信息,在本文上方TCP通信过程中有详细讲解。
2.1 三次握手流程
1)当客户端向服务器发送请求时,会发送 SYN 报文段给服务器。
2)服务器在收到客户端的请求后,会回复 ACK 确认序列号。
3)服务器为了保证连接也会向客户端发送给 SYN 报文段。
4)客户端收到服务器的请求回复 ACK 确认序列号。
在上方 TCP 通信过程中,我们知道了 TCP 的报头有6位标志位,标志位默认为0。当需要相关操作时就会把某位标志位置为1,为了避免浪费资源,可把这两个操作合并在一起。
服务器向客服端发送 ACK 和 SYN 操作时就可以合并在一起,也就是 ACK 位和 SYN 位都置为1。看似是四次握手实际上只用了三次交互,因此我们称为三次握手,对照下图进行理解。
2.2 为什么要三次握手
防止已失效的连接请求报文段突然又传送到了服务端,从而导致服务端开启多个连接。
连接请求报文段正好在网络中滞留比较久,以至于延误到相应的确认没有足够的时候到达服务端,使得服务端误判连接id。
网络中出现了延迟的重传,因此服务端在已经建立了连接的情况下又收到了连接建立请求,如果没有三次握手情况下,会认为这是一个新的连接请求,从而重复建立新的连接。
3、四次挥手
四次挥手是TCP协议关闭连接时的一种基本过程,它的主要目的是确保双方的数据传输和处理都已经完成。具体来说,四次挥手主要包括以下步骤:
- 发起关闭请求的一方(假设是客户端)发送一个FIN (finish)请求,表示“我已经没有数据要发给你了”。
- 接收到FIN请求的另一方(假设是服务器)发送一个ACK确认报文,表示“我已经收到了你发来的关闭请求”。
- 接收到ACK确认报文的发起关闭请求的一方(即客户端)等待自己发送数据的过程完成并准备好关闭连接后,再次发送一个FIN请求,表示“我的数据发完了,我准备关闭连接”。
- 接收到最后一个FIN请求的另一方(即服务器)再次发送一个ACK报文,表示“我已经收到了你的关闭请求,确认关闭连接”。
这样,四次挥手就完成了。需要注意的是,关闭连接的两端都需要发送FIN请求和ACK确认请求,因为TCP协议是一种双向通信协议。在四次挥手过程中,客户端和服务器都需要确认对方的关闭请求,并相互发送ACK报文确认,以确保连接正常关闭。通过四次挥手,双方都能够顺利地关闭连接并释放资源。
四次挥手过程:
此处的四次握手的 ACK 和 FIN 为啥不能合并为一次,根据上述四次挥手过程进行解析:
连接的第一次关闭是客户端发送FIN请求,服务器返回ACK确认请求。这个请求的作用是告诉服务器,客户端已经没有数据要发送了,希望关闭连接。在这个阶段中,服务器只是确认收到了客户端发来的FIN请求,还可以继续发送数据给客户端。
连接的第二次关闭是服务器发送FIN请求,客户端回复ACK确认请求。这个请求的意义是告诉客户端,服务器也没有数据要发送了,希望关闭连接。在这个阶段中,客户端收到了服务器的FIN请求,可能还会发送一些最后的数据到服务器,然后再发送ACK确认请求。如果将第一次和第二次的请求合并在一起,服务器就无法获知客户端是否真正结束了数据的发送,可能会误认为客户端还在发送数据。
3.2 为什么要四次挥手
TCP是一种双向通信协议,双方都需要发送和接收数据。在四次挥手过程中,需要确保双方没有尚未处理完的数据或者请求。因此,四次挥手能够在正确关闭连接之前,保证数据双向传输和处理的完成。
不同于三次握手,在关闭连接时,可能存在未及时发送的数据。如果 TCP 四次挥手过程中全部包含在一个 TCP 报文中,则使用 TCP 的延迟 ACK,未及时发送其中的 ACK 报文,导致连接终止存在延迟。采用四次挥手可避免这种情况。
网络编程中避免出现类似TCP Head of Line Blocking(HOLB)的问题。如果在两端都尚未关闭连接之前,数据流还在传输中,一端出现故障,就会引起等待连接关闭的一方进入死等状态,造成连接阻塞。
因此,通过四次挥手过程,双方都能够正确地处理数据、确认请求,并最终彻底地关闭连接,从而保证 TCP 传输的安全、稳定并且可靠。
三次握手四次挥手是为了保证数据的可靠性传输,在TCP传输中还有其他保证数据的可靠性传输的机制如确认应答机制、超时重传机制,大家可在文章开头专栏中搜索。
本期博文到这里就结束了,感谢点赞、评论、收藏、关注~