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

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

三次握手、四次挥手

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

  • 第一次:客户端向服务端发送消息,此信息主要确定的是服务端是否处于运行状态,传输内容包括(标识为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三次握手(Three-way Handshake)是建立TCP连接时的关键步骤,其目的是确保通信双方的发送接收能力正常,并协商初始化序列号确认号,以保证后续数据传输的可靠性。具体过程如下: 1. **第一次握手**:客户端发送一个SYN标志位为1的报文段(SYN=1),并指定一个初始序列号(Sequence Number=x)。客户端进入SYN_SENT状态,表示请求建立连接。 2. **第二次握手**:服务器接收到SYN报文后,会回应一个SYN-ACK报文段(SYN=1, ACK=1),其中ACK是对客户端SYN的确认(Acknowledgment Number=x+1),同时服务器也会发送自己的初始序列号(Sequence Number=y)。 3. **第三次握手**:客户端收到SYN-ACK后,向服务器发送一个ACK报文段(ACK=1),确认服务器的SYN(Acknowledgment Number=y+1),连接正式建立[^3]。 通过三次握手,客户端服务器可以互相确认彼此的发送接收能力是否正常,并交换序列号确认号信息,为后续数据传输做好准备。三次握手的设计还有效防止了已经失效的连接请求突然传送到服务器的情况,从而避免资源浪费错误[^5]。 ### TCP四次挥手的过程详解 TCP四次挥手(Four-way Wavehand)是断开TCP连接的过程,其主要目的是确保连接断开时所有数据都能完整传输,并释放相关资源。具体过程如下: 1. **第一次挥手**:客户端发送一个FIN标志位为1的报文段(FIN=1),表示自己已经没有数据要发送了,请求断开连接。客户端进入FIN_WAIT_1状态。 2. **第二次挥手**:服务器接收到FIN后,会发送一个ACK报文段(ACK=1)作为响应,确认客户端的FIN请求(Acknowledgment Number=Sequence Number+1)。服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。 3. **第三次挥手**:服务器完成数据传输后,也会发送一个FIN报文段(FIN=1),表示自己准备断开连接。服务器进入LAST_ACK状态。 4. **第四次挥手**:客户端接收到服务器的FIN后,发送一个ACK报文段(ACK=1)作为确认,进入TIME_WAIT状态。服务器收到ACK后,连接正式关闭。客户端在等待一段时间(通常是2MSL,Maximum Segment Lifetime)后,确认服务器收到了ACK,最终关闭连接[^2]。 四次挥手的设计确保了通信双方都能安全地关闭连接,避免了数据丢失或重复传输的问题。 ### TCP连接建立与断开的关键机制 - **防止失效连接请求**:三次握手可以防止已失效的连接请求突然传送到服务器,从而避免资源浪费。如果采用两次握手,客户端发送的旧请求可能在网络中延迟后到达服务器,导致服务器误认为客户端要重新建立连接[^5]。 - **全双工通信的关闭**:由于TCP是全双工通信协议,连接的每一方都需要独立关闭发送方向的数据流。因此,在四次挥手中,客户端服务器各自发送FINACK,确保双向连接都能正确关闭。 ### 示例代码:TCP连接的建立与断开 以下是一个简单的Python示例,展示如何使用`socket`库建立断开TCP连接: ```python import socket # 创建客户端socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接到服务器 server_address = ('localhost', 8080) client_socket.connect(server_address) print("已建立连接") # 发送数据 client_socket.sendall(b'Hello, server!') # 关闭连接 client_socket.close() print("已关闭连接") ``` 在服务器端,可以使用以下代码监听连接并处理客户端的请求: ```python import socket # 创建服务器socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址端口 server_address = ('localhost', 8080) server_socket.bind(server_address) # 开始监听 server_socket.listen(1) print("等待连接...") # 接受连接 client_socket, client_address = server_socket.accept() print(f"连接来自: {client_address}") # 接收数据 data = client_socket.recv(1024) print(f"收到数据: {data}") # 关闭连接 client_socket.close() print("已关闭连接") ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值