TCP三次握手和四次挥手简述

本文详细介绍了TCP协议中的三次握手和四次挥手过程,解释了TCP为何比UDP更稳定,并探讨了HTTP1.0中的短连接与HTTP1.1中的长连接的区别及应用场景。

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

三次握手、四次挥手

三次握手:客户端与服务端传输数据

  • 第一次:客户端向服务端发送消息,此信息主要确定的是服务端是否处于运行状态,传输内容包括(标识为0,协议为syn)

  • 第二次:服务端向客户端发送消息,此信息主要是告诉客户端,服务器处于运行状态,传输内容包括(标识为0+1,协议为syn+ack)当客户端接收到此消息后,客户端与服务端就处于连接状态

  • 第三次:客户端向服务端发送数据包,传输内容包括(ack,标识为1,数据)

四次挥手:客户端与服务端断开连接

  • 第一次:客户端调用close方法,向服务端发送长度为0的消息,协议为FIN

  • 第二次:服务端向客户端发送确认消息(关闭连接消息)

  • 第三次:服务端调用close方法,通知客户端

  • 第四次:客户端向服务端发送确认消息,此时客户端与服务端断开连接

三次握手
三次握手

四次挥手
四次挥手

tcp比udp稳定的原因

  • tcp在建立连接时,需要客户端与服务端确认是否连接成功,如果没有连接成功,客户端还会想服务端发送确认消息,在建立连接后,每次客户端向服务端发送消息后,服务端都会向客户端发送确认收到的消息

  • 而upd,每次只会发送数据,而不管数据是否发送成功

udp传输数据

tcp的长连接与短连接

  • 长连接:在http1.0中,默认使用的是短连接,client请求server,会创建一次连接,访问结束就断开连接

  • 短连接:在http1.1中,默认使用的是长连接,client请求server,会先建立连接,(响应头的属性:connect:keep-alive)每次client访问server时,都会使用第一次创建的连接,当超过一定时间没有请求时,会断开连接,重新访问时,会再次创建连接,client主动调用close时,也会断开连接

长连接与短连接应用场景不同,各有优缺点,实际应用时,要根据具体场景来定

### 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}" ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值