TCP/IP3次握手4次挥手

本文深入解析TCP协议中的三次握手建立连接与四次挥手断开连接的过程,阐述其背后的原因及必要性,避免资源浪费,确保数据传输的准确性和可靠性。

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误

“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”。主要目的防止server端一直等待,浪费资源

举个打电话的例子:

A : 你好我是A,你听得到我在说话吗

B : 听到了,我是B,你听到我在说话吗

A : 嗯,听到了

建立连接,开始聊天!


3次握手

为什么需要“四次挥手”

原因是tcp是全双工模式接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。


为什么TCP协议终止链接要四次?

1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。

2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。

3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。

4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。

A为什么等待2MSL,从TIME_WAIT到CLOSE?

在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。


4次挥手

这个网上转载的例子不错:

三次握手:

A:“喂,你听得到吗?”A->SYN_SEND

B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED

A:“我能听到你,今天balabala……”B->ESTABLISHED

四次挥手:

A:“喂,我不说了。”A->FIN_WAIT1

B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,说完了,我也不说了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED

转载于:https://www.cnblogs.com/jerrice/p/6708725.html

### TCP/IP握手和四挥手的详细过程 #### 一、TCP/IP握手的过程 TCP 协议通过三握手建立可靠的连接。以下是其具体流程: 1. **第一握手** 客户端向服务器发起请求,发送一个 SYN 数据包(同步序列号),表示希望与服务器建立连接并携带初始序列号 m[^1]。 2. **第二握手** 服务器接收到客户端的 SYN 请求后,会回复一个包含自己 SYN 序列号 n 和对客户端 ACK(m+1) 的确认包给客户端。这表明服务器已准备好接受来自客户端的数据流,并将自身的序列号告知客户端。 3. **第三握手** 客户端收到服务器返回的 SYN(n) 和 ACK(m+1),此时客户端进入 ESTABLISHED 状态。随后,客户端再向服务器发送 ACK(n+1) 来确认收到了服务器的 SYN 包,从而完成整个三握手过程,双方正式建立起可靠连接。 ```python # Python模拟三握手逻辑 class TCPSession: def __init__(self): self.client_seq = 0 self.server_seq = 0 def client_send_syn(self): # 发送SYN包 return {"type": "SYN", "seq": self.client_seq} def server_respond_syn_ack(self, seq): # 接收SYN并响应SYN/ACK ack_num = seq + 1 syn_num = self.server_seq self.server_seq += 1 return {"type": ["SYN", "ACK"], "ack": ack_num, "syn": syn_num} def client_confirm_ack(self, syn, ack): # 确认服务器的SYN/ACK if ack == (self.client_seq + 1): self.client_seq += 1 return {"type": "ACK", "ack": syn + 1} ``` --- #### 二、TCP/IP挥手的过程 当通信结束时,需要释放资源并通过四挥手断开连接。以下是具体的步骤: 1. **第一挥手** 主动关闭的一方(通常是客户端)发送 FIN 数据包通知对方要终止该方向上的数据传输。此操作意味着“我已经没有更多数据要发送了”。FIN 中包含了当前序列号 p[^2]。 2. **第二挥手** 被动关闭一方(通常为服务器)接收到 FIN 后,不会立刻关闭连接而是先进入 CLOSE_WAIT 状态。它会回应一个 ACK(p+1) 表明已经接受了对方停止发送的要求,但仍然可以继续接收剩余未处理完毕的数据[^2]。 3. **第三挥手** 当被动关闭方也完成了所有的数据传送之后,则同样发出自己的 FIN(q),告诉另一侧现在也可以安全地切断反方向上的链路了[^2]。 4. **第四挥手** 最终,主动关闭方回传最后一个 ACK(q+1),至此两台设备均处于 TIME_WAIT 或 CLOSED 状态,标志着完整的双向链接被彻底拆除[^2]。 --- ### 总结 - 三握手的核心在于确保两端都能正确初始化各自的序列号以及验证彼此的存在。 - 四挥手中的额外两是因为即使某一边想要结束对话,另一边仍有可能还有尚未送达的信息等待传递出去的缘故。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值