三次握手和四次挥手图解_HTTP,TCP协议,三次握手四次挥手

TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”

tcp三次握手

第一步,client发送syn到server发起握手

第二步,server收到syn后回复syn+ack给client

第三步,client收到syn+ack后,回复server一个ack标识收到server的syn+ack (此时client的48287端口的连接已经是已建立的)

bbc2d3746792f09b9668ccb81ac9a6a0.png

握手的核心目的是告知对方seq(绿框是client的初始seq,蓝色框是server 的初始seq),对方回复ack(收到的seq+包的大小),这样发送端就知道有没有丢包了。

断开连接的四次挥手

  • 第一步: client主动发送fin包给server
  • 第二步: server回复ack(对应第一步fin包的ack)给client,表示server知道client要断开了
  • 第三步: server发送fin包给client,表示server也可以断开了
  • 第四部: client回复ack给server,表示既然双发都发送fin包表示断开,那么就真的断开吧

为什么握手三次,挥手四次?

看起来挥手的时候多一次,主要是收到第一个fin包后单独回复了一个ack包,如果能回复fin+ack那么四次挥手也就变成三次了。

博主理解:之所以绝大数时候我们看到的都是四次挥手,是因为收到fin后,知道对方要关闭了,然后OS通知应用层要关闭啥的,这里应用层可能需要做些准备工作,有一些延时,所以先回ack,准备好了再发fin 。 握手过程没有这个准备过程所以可以立即发送syn+ack。

### HTTP协议三次握手过程详解 #### 1. 初始状态 在三次握手开始前,客户端处于 `CLOSE` 状态,而服务器则监听端口并等待连接请求,此时服务器的状态为 `LISTEN`[^3]。 #### 2. 第一次握手 (SYN) 当客户端希望与服务器建立连接时,会发送一个带有同步标志位 (`SYN`) 的数据包给服务器。此数据包还包含了一个随机初始化序列号 `ISN_Client`,用于后续的数据传输确认机制。客户端在此之后进入 `SYN_SENT` 状态。 ```plaintext Client -> Server: SYN, ISN_Client ``` #### 3. 第二次握手 (SYN+ACK) 服务器收到客户端发来的 `SYN` 数据包后,会返回一个同时设置 `SYN` `ACK` 标志位的数据包作为回应。这个数据包不仅包含了自身的初始序列号 `ISN_Server`,还会通过 `ACK` 字段告知客户端其已接收到了来自客户端的序列号加一后的值 `(ISN_Client + 1)`。这样做的目的是为了验证双方之间的网络连通性可靠性。完成这一步骤后,服务器进入了 `SYN_RCVD` 状态。 ```plaintext Server -> Client: SYN, ACK(ISN_Client + 1), ISN_Server ``` #### 4. 第三次握手 (ACK) 最后,客户端再次向服务器发送一个仅设置了 `ACK` 标志位的数据包来确认整个连接已经成功建立,并且该数据包中的 `ACK` 值等于服务器所发出的初始序列号加一 `(ISN_Server + 1)`。至此,客户端切换到 `ESTABLISHED` 状态;与此同时,由于服务器收到了最终的确切反馈,它也会随之转变为 `ESTABLISHED` 状态,标志着完整的 TCP 连接构建完毕。 ```plaintext Client -> Server: ACK(ISN_Server + 1) ``` 以上即为标准意义上的TCP三次握手流程描述,在HTTPS场景下虽然涉及加密操作但并不改变上述基本原理[^1]。 ```python # Python模拟简单的三次握手逻辑示意代码 class State: def __init__(self): self.state = 'CLOSE' def syn_sent(state_obj, isn_client): state_obj.state = 'SYN_SENT' return f'SYN sent with sequence number {isn_client}.' def syn_ack_received(state_obj, isn_server, ack_value): if int(ack_value) == isn_client + 1 and state_obj.state == 'SYN_SENT': state_obj.state = 'SYN_RCVD' return f'ACK received correctly ({int(isn_server)+1}). Sending back my own SYN & ACK...' else: raise Exception('Error during second handshake step.') def final_ack_sent(state_obj, ack_value): if int(ack_value) == isn_server + 1 and state_obj.state == 'SYN_RCVD': state_obj.state = 'ESTABLISHED' return 'Connection established!' else: raise Exception('Final acknowledgment failed.') state_machine = State() print(syn_sent(state_machine, 100)) print(syn_ack_received(state_machine, 200, 101)) print(final_ack_sent(state_machine, 201)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值