TCP的三次握手和四次分手

本文详细解析了TCP协议的三次握手过程,包括建立连接的步骤和原理;同时,介绍了TCP的四次分手流程,解释了其在断开连接时的作用和意义。

      TCP的传输机制有三次握手大家都很熟悉,但是三次握手中TCP协议都干了些什么呢?还有TCP的四次分手也都分别干了些什么呢?
位码是Tcp的标志位,标识有:SYN(建立联机)、ACK(确认)、PUSH(传送)、FIN(结束)、URG(紧急)。
Sequence Number(顺序号码) Acknowledge(确认号码)


     TCP 三次握手流程:
第一次握手:主机A发送位码为SYN=1,随机产生一个Sequence Number=1234567的数据到服务器B,主机B由SYN=1得知,A要求建立联机。
第二次握手:主机B收到请求后要确认消息,向A发送Ack Number=(主机A的Seq+1),SYN=1,ACK=1,随机产生Seq=7654321的包。
第三次握手:主机A收到后检查Ack Number是否正确,即是否是第一次发送的Seq Number+1,以及ACK是否为1;若正确,主机A再发送Ack Number=(主机B的Seq+1),ACK=1,主机B收到确认Seq值,Ack=1,则建立连接成功。
     至此完成了三次握手

     


      TCP的四次分手流程:
1.客户端A发送一个FIN,用来关闭客户A到服务器B的数据传输
2.服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1.
3.服务器B关闭与客户端A的连接,发送一个FIN给客户端A
4.客户端A发回一个ACK确认报文,并将确认序号设置为收到的序号加1.

     TCP的分手过程中将发送FIN的动作与接收ACK的动作分开,主要是因为当B收到FIN报文时,有可能B正在给A传送数据,服务器B必须等数据传输结束后才响应FIN报文。

### TCP三次握手过程详解 TCP协议通过三次握手来建立可靠连接,其目的是为了确保双方能够正常接收发送数据。以下是具体的三次握手过程: 1. **第一次握手** 客户端向服务器发起连接请求,发送一个SYN(同步序列号)包,并将自己的初始序列号`Seq=Client_ISN`放入该包中[^1]。此时客户端进入`SYN_SENT`状态。 2. **第二次握手** 服务器接收到客户端的SYN包后,返回一个 SYN-ACK 包作为应答。这个包包含了两个部分的信息:一是确认客户端的SYN包已被成功接收,二是告知自己的初始序列号`Seq=Server_ISN`[^1]。此时服务器进入`SYN_RCVD`状态。 3. **第三次握手** 客户端再次发送一个 ACK 包给服务器,表示自己已经收到了服务器发来的 SYN-ACK 包并认可了它的序列号。至此,客户端服务器都完成了彼此之间的初始化工作,正式进入了`ESTABLISHED`状态,可以开始传输数据[^1]。 这种机制的主要作用在于防止因网络延迟等原因造成的旧有连接请求被错误处理的情况发生,从而提高通信的安全性稳定性[^2]。 --- ### TCP四次挥手原理说明 相比起建立连接时较为简单的三次握手操作,断开连接则需要经历四个阶段才能完全结束一次完整的会话流程,这就是所谓的“四次挥手”。具体如下所示: 1. **第一次挥手** 主动关闭方(通常是客户端)发送一条FIN标志位的数据段通知被动关闭方希望终止当前对话关系;与此同时还会附带有一个随机产生的序号值用于后续验证身份之用[^2]。 2. **第二次挥手** 接收到了来自对方提出的结束提议之后,另一侧回应以包含相同编号字段在内的纯确认消息即仅带有ACK标记而不携带任何实际负载内容的消息回传回去表明接受这一决定但暂时还不能立刻切断线路因为可能还有未读取完毕的数据残留其中所以继续保持半开放模式以便继续完成剩余事务处理直到彻底清理干净为止[^2]。 3. **第三次挥手** 当最初提出分手建议的那一边发现之前所期待的一切都已经妥善安排妥当没有任何遗留问题存在之时便会再一次单独发出另一个纯粹由FIN构成的通知信号宣告即将真正意义上的退出整个交互进程[^2]。 4. **第四次挥手** 对面看到这条最终决裂声明以后同样按照惯例给予最后一次单纯形式上的批准回复也就是仅仅标注上相应匹配号码再加上唯一标识符组成的简单结构体而已标志着整条链路正式解体回归自由浮动待命状况准备迎接新一轮挑战或者干脆处于闲置备用状态等待命令调遣[^2]。 值得注意的是,在特殊场景下如果某一方刚好在准备发送最后一个 FIN 数据帧的同时正好也接收到了对面传过来的那个同样的指令的话就可以把这两个动作合并起来只算作是一步骤执行即可形成所谓简化版本——三步告别法[^2]。 ```python def tcp_handshake(): """ Simulate the process of a three-way handshake. """ # Client sends SYN to Server syn_sent = {"type": "SYN", "seq_num": generate_random_seq()} # Server responds with SYN-ACK syn_ack_received = {"type": "SYN-ACK", "ack_num": syn_sent["seq_num"] + 1, "seq_num": generate_random_seq()} # Client acknowledges receipt and connection is established ack_sent = {"type": "ACK", "ack_num": syn_ack_received["seq_num"] + 1} return f"Connection Established! {syn_sent}, {syn_ack_received}, {ack_sent}" def tcp_wave_goodbye(): """ Simulate the four-way wave goodbye (connection termination). """ # First side initiates by sending FIN fin_initiated = {"type": "FIN"} # Second side receives and replies with ACK ack_response = {"type": "ACK", "ack_num": increment_sequence(fin_initiated.get("seq_num"))} # After some time... final_fin = {"type": "FIN"} # Final farewell ultimate_ack = {"type": "ACK", "ack_num": increment_sequence(final_fin.get("seq_num"))} # Last confirmation return f"Goodbye Process Completed! {fin_initiated}, {ack_response}, {final_fin}, {ultimate_ack}" ``` 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值