TCP三次握手,四次挥手

本文详细解析了TCP/IP协议中的三次握手和四次挥手过程,包括SYN、ACK、FIN等关键信号的作用及意义,揭示了客户端与服务器如何建立和断开连接,以及为何采用这些机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于QQ,采用的是TCP/IP,UDP两种通信协议,而为保证稳定,微信用了长链接和短链接相结合,微信划分了http模式(short链接)和 tcp 模式(long 链接),分别应对状态协议和数据传输协议。

1.握手代表建立连接,握手成功之后就可以进行通信了
2.挥手代表断开连接,挥手完毕之后就可以结束通信了
下面我们来具体了解一下客户端与服务器是怎么进行握手的呢?
首先了解几个名词:SYN,ASK,FIN,ack,seq。
SYN:Synchronize Sequence Numbers,建立连接的信号。
ACK:Acknowledgement,确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符,表示发来的数据已确认接收无误。
FIN:Final,标志结束。
ack:这个代表下一个数据包的编号,这也就是为什么第二请求时,ack是seq+1。
seq:序列号当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。

一、三次握手
1.客户端向服务器发起一起连接请求(SYN=1),同时发送一个序列号(seq=X);
2.服务端收到SYN包之后,确认收到(ACK=1),并且返回一个ack(x+1)给客户端,此时自己的包的序列号为:Y;
3.客户端收到服务端的确认信息之后,返回一个确认ACK=1,并且返回序列号为Y+1。

二、为什么不是两次握手
如果服务器发送确认信息给客户端的时候,客户端没有进行回应,那么服务器就不知道自己的确认信息是否被客户端看到而造成反复的发送确认信息给客户端。

三、四次挥手
原因:客户端与服务端都需要进行发送关闭请求并且接收来自对方的应答,所以需要四次。
1.客户端的数据发送完毕之后,就发送FIN=1的结束信号给服务器;
2.服务器接收到包之后,就发送确认收到的信号ACK=1,并且序列号为收到的加1;(结束了客户端与服务器的数据传送)
3.服务器这边确认数据也发送完毕的时候,发送FIN=1的信号给客户端,准备进入准备关闭阶段;
4.客户端接收到服务器的FIN信号,客户端发送最后的确认ACK=1给服务器。
注意:最后挥手的时候,客户端会在自己发出结束标志之后调动自己的计时器进入等待(time_wait)阶段,等待的时间为2MSL;
原因:第四次回复的应答丢失导致服务器接收不到,而会重复进行第三次挥手

2MSL
Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”
所以其实还有个作用就是保证最后产生的报文会在网络上消逝,不影响服务器。

### TCP 三次握手四次挥手的过程及原理 #### 一、TCP 三次握手过程及原理 TCP 是一种面向连接的可靠传输协议,在数据传输前需要通过三次握手来建立连接。以下是其具体过程: 1. **第一次握手** 客户端向服务器发起连接请求,发送一个带有 SYN 标志位的数据包,并随机生成一个初始序列号 `Seq=x`,此时客户端进入 `SYN_SENT` 状态[^5]。 2. **第二次握手** 服务器收到客户端的 SYN 请求后,返回一个确认消息,该消息同时携带两个标志位:SYN 和 ACK。其中,SYN 表示同意建立连接并随机生成自己的初始序列号 `Seq=y`;ACK 则是对客户端序列号的确认,即 `Ack=x+1`。此时服务器进入 `SYN_RCVD` 状态[^4]。 3. **第三次握手** 客户端收到服务器的响应后,再次发送一个确认消息给服务器,此消息仅带有一个 ACK 标志位,用于确认服务器的序列号,即 `Ack=y+1`。随后,客户端进入 `ESTABLISHED` 状态,而服务器在接收到这个 ACK 后也进入 `ESTABLISHED` 状态,至此完成三次握手[^1]。 通过以上三个步骤,双方不仅建立了连接,还同步了各自的序列号和确认号,从而确保后续通信的可靠性[^3]。 --- #### 二、TCP 四次挥手过程及原理 由于 TCP 协议采用全双工模式工作,因此关闭连接时需分别处理双向通道的释放问题,这通常涉及四个阶段的操作,称为“四次挥手”。 1. **第一次挥手** 主动关闭的一方(通常是客户端)发送 FIN 报文通知对方自己已经没有数据要发送了,同时终止本方向上的数据流。此时,主动关闭方进入 `FIN_WAIT_1` 状态[^2]。 2. **第二次挥手** 被动关闭一方(通常是服务器)收到 FIN 报文后,回应一个 ACK 报文作为确认,设置 `Ack=seq+1`,并将被动关闭方的状态改为 `CLOSE_WAIT`。与此同时,主动关闭方则转变为 `FIN_WAIT_2` 状态[^4]。 3. **第三次挥手** 当被关闭方也没有更多数据待发时,它会再发送一个 FIN 报文告知主动关闭方准备完全断开连接。此时,被动关闭方变为 `LAST_ACK` 状态[^5]。 4. **第四次挥手** 主动关闭方接收到来自被动关闭方的 FIN 报文之后,回复最后一个 ACK 报文予以确认,然后进入 `TIME_WAIT` 状态。经过一段时间延迟(一般为两倍最大分组生存时间 MSL),如果未检测到异常情况,则正式关闭连接并转入 `CLOSED` 状态。同样地,被动关闭方在接受到最终 ACK 报文后立即切换至 `CLOSED` 状态,结束整个流程[^3]。 值得注意的是,“四次挥手”的核心在于允许两端独立管理各自方向上的资源回收,保障任何尚未送达的信息能够得到妥善处理[^2]。 --- ```python # Python模拟TCP三次握手四次挥手逻辑示意 class TCPSession: def __init__(self, client_seq, server_seq): self.client_seq = client_seq self.server_seq = server_seq def three_way_handshake(self): print(f"Client -> Server: SYN Seq={self.client_seq}") self.client_seq += 1 print(f"Server <- Client: SYN+ACK Ack={self.client_seq} Seq={self.server_seq}") self.server_seq += 1 print(f"Client -> Server: ACK Ack={self.server_seq}") def four_way_wavehand(self): print(f"Client -> Server: FIN Seq={self.client_seq}") print(f"Server <- Client: ACK Ack={self.client_seq + 1}") print(f"Server -> Client: FIN Seq={self.server_seq}") print(f"Client <- Server: ACK Ack={self.server_seq + 1}") session = TCPSession(0, 0) print("\n--- Three-Way Handshake ---") session.three_way_handshake() print("\n--- Four-Way Wavehand ---") session.four_way_wavehand() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值