HTTP 连接:三次握手四次挥手!你真的了解吗?全新讲解,走出误区!不再害怕面试官...
Posted 魏小言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 连接:三次握手四次挥手!你真的了解吗?全新讲解,走出误区!不再害怕面试官...相关的知识,希望对你有一定的参考价值。
HTTP 连接:三次握手、四次挥手!你真的了解吗?全新讲解,走出误区!
在计算机编程中,网络可谓是主心骨之一,扛起了网络互通,连接万物的重任!其互通的关键 “ HTTP 连接 ” 是重中之重!那么征服 “ 三次握手、四次挥手 " ,是踏入计算机编程行业的敲门砖!
HTTP
只要你在网络冲浪🏄♀️,就一定见过 “ HTTP ” !
现在点开地址栏,网址前面出现的 http:// 就说明你此时此刻正在通过 HTTP 冲浪。
HTTP 到底是什么呢?
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。 ——百科
那么我们怎么建立 HTTP 连接呢?
作为一名软件开发,知晓建立/断开一 HTTP 连接需要进行 “ 三次握手、四次挥手 ”。现在市面上包括一些教科书上描述都不太准确,很容易让人进入误区。这里挨个分析连接过程,喜欢的同学可以关注,点赞,收藏!
四次挥手
一些资料中,有许多四次挥手—流图,但并不准确。这里贴上自己梳理的生图!
如下:
异同
上图和其它常见的版本存在些许差异:
- 无区分 Client、Server
HTTP 为无状态连接,连接两段并无区别,挥手过程双方都可主动进行触发!
「只是人们喜欢从主观出发,认为 发送请求 req 的为 Client 、返回响应 respose 的是 Server。」
比如在某些特殊访问时,Server 为了控制资源使用成本及效率,会对 Respose Header 写入字段 Connection :Closed ,将会在响应后主动放弃此连接!
- Connection 字段约束:告诉WEB服务器或者代理服务器,在完成本次请求的响应 后,该做什么
- close:断开连接,不要等待本次连接的后续请求了
- keep-alive:保持连接,等待本次连接的后续请求
- 在 Fin-Wait-2 状态后新增 Time-Wait 阶段
在 Node1 收到 FIN - response 后,不会立即断开连接,而是将设置 2 MSL 的定时器,进入到 Time-Wait 阶段。
整体挥手过程
下面详细描述下整体的过程:
- Node1 发起关闭连接的 FIN 信号后,进入到 Fin-Wait-1 阶段,等待 Node2 的 ACK、FIN 相应信号
- 在 Fin-Wait-1 状态中,Node1 只进行业务数据的接收、相应,不再进行数据的发送。若 Node2 长时间为响应,Node1 会进行重试,具体为 HTTP 默认重试策略,默认重试次数 tcp_orphan_retries 为 9 次,且每次间隔时长为上一次的 2 倍。Fin-Wait-1 阶段一般时长比较短,若超出配置约束时间还为响应,则成为孤儿连接,等待被重置回收。
- 在 Fin-Wait-1 状态中,Node1 只进行业务数据的接收、相应,不再进行数据的发送。若 Node2 长时间为响应,Node1 会进行重试,具体为 HTTP 默认重试策略,默认重试次数 tcp_orphan_retries 为 9 次,且每次间隔时长为上一次的 2 倍。Fin-Wait-1 阶段一般时长比较短,若超出配置约束时间还为响应,则成为孤儿连接,等待被重置回收。
- Node2 收到 Node1 的关闭信号后,进行 ACK 响应,响应之后,进入到 Close-Wait 状态,Node2 此时可以进行数据处理,处理遗留的事务「一般为关闭连接前未完成的约定事务」。
- Node1 收到 Node2 响应信号后,进入到 Fin-Wait-2 阶段,此阶段 Node1 不再进行重试策略,而是等待 Node2 处理未完成的事务。
- Node2 处理完事务之后,将发送 FIN 信号,告诉 Node1 已完成。此时 Node2 进入到 Last-Ack 阶段,等待最终的 Node1 响应关闭连接。
- Node1 收到 Node2 FIN 信号后,将发送 ACK 信号,告知 Node2 可以关闭了,随后进入到 Time-Wait 阶段。
- 此阶段,Node1 会设定一个时间长度为 2MSL 的定时器,当定时器在到时间点后,内核就会将该连接关闭。当连接尚未关闭的时候,又收到了对方发送过来的 FIN 请求(可能是发送出去的请求对方并未收到),或者收到 ICMP 请求(比如 ACK 数据报,在网络传输中出现了错误),该连接就会重新发送 ACK 请求,并重置定时器。
- 1、保证 ACK 信号被 Node2 收到,防止 Node2 重复发送 FIN 信号至主动关闭连接,无效的资源消耗。
- 2、等待该连接在网络上的所有报文都传输完毕。
- Node2 收到 Node1 的响应信号后,就进入到 Closed 状态,断开、释放连接。
- Node1 进入到 Closed 状态,断开、释放连接。
MSL 是Maximum Segment Lifetime,译为“报文最大生存时间”,任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
2MSL 就是一个报文一来一回的最大时间。
Q&A
1、为什么要先介绍 “ 四次挥手 ” 呢?
随性吧,知识没有先后,“ 三次握手 ” 可关注后续博文。
2、TCP 是 3 次握手与 4 次挥手,为什么不是 4 次握手呢?
可以理解为:握手过程中并不需要数据传输,因此将两次合并为一次。
3、HTTP 是应用层,下面的传输层有 TCP 和 UDP ,握手和挥手是 TCP ?
对,以上是基于 TCP。UDP 是点对点传输,无需进行连接,之间区别,可关注之前博文。
附录
大型编程项目中,建立外科手术型团队,拒绝一拥而上!
以上是关于HTTP 连接:三次握手四次挥手!你真的了解吗?全新讲解,走出误区!不再害怕面试官...的主要内容,如果未能解决你的问题,请参考以下文章