本文主要是介绍为什么http请求要3次握手与4次挥手?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
https://www.zhihu.com/question/67772889
链接:https://www.zhihu.com/question/67772889/answer/257170215
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
因为HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议.
建立TCP连接时会发生:三次握手(three-way handshake)
firefox > nginx [SYN] 在么
nginx > firefox [SYN, ACK] 在
firefox > nginx [ACK] 知道了
关闭TCP连接时会发生:四次挥手(four-way handshake)
firefox > nginx [FIN] 我要关闭连接了
nginx > firefox [ACK] 知道了,等我发完包先
nginx > firefox [FIN] 我也关闭连接了
firefox > nginx [ACK] 好的,知道了
几个报文的标识的解释:
SYN: synchronization(同步)
ACK: acknowledgement(确认:告知已收到)
FIN: finish(结束)
在HTTP/1.1中,keep-alive能够复用TCP连接,减少TCP三次握手的次数,从而提升性能.
结合到PHP编程中,拿Swoole引擎内置的异步HTTP服务器来说说:
调用 $res->end() 将结束HTTP请求,但不会关闭HTTP连接,因为Swoole支持keep-alive.
调用 $serv->close($res->fd) 将关闭HTTP连接.
这种ack确认机制在应用逻辑开发上也是很有用的,比如你用PHP+Swoole开发一个即时通讯软件,要确保不丢消息,要做到:
A <=> Server <=> B
A发送消息给B后,如果A在指定时间内没有收到Server的消息通知,那么A就要超时重发. 正常情况下,Server收到A的消息后推送给B,B收到消息后通知Server,Server再通知A. 当然,A的超时重发可能会导致B收到重复的消息,所以B接受消息时要进行去重.
如果要考察HTTP,我觉得问下HTTP请求/响应报文的组成可能会更好.
HTTP请求报文组成:请求行+请求头+请求体
HTTP响应报文组成:响应行+响应头+响应体
请求行: 请求方法(HEAD/GET/POST) + 请求URL + HTTP协议版本
响应行: HTTP协议版本 + 状态码 + 状态码描述
请求头: 比如客户端的Cookie和User-Agent就放在这里.
响应头: 比如服务器的Set-Cookie和Server信息就放在这里.
请求体: 比如客户端POST的数据就放在这里(对比:GET的数据放在请求行的URL里).
响应体: 比如服务器返回的HTML和JSON数据就放在这里.
curl -I http://mysite
curl这样发起的HTTP请求的请求方法(request_method)就是HEAD,可以这样查看:
PHP-FPM: header("请求方法: $_SERVER['REQUEST_METHOD']");
Swoole: $res->header('请求方法', $req->server['request_method']);
要么你记错了,要么你的面试官是个假的
3次握手,4次挥手是针对TCP连接来说的,HTTP协议本身不关注这块
3次握手,用来保障通讯双方有通信的基础
4次挥手,用来保障通讯双方可以安全的回收TCP通信的系统资源
假设2个人要相互确认对方已经收到自己的消息需要几步:
server: 嘿你在吗?
you: hei 我在,
server : 好的我发消息了,
server---->you
server: 嘿我发完了,
you: 好的,我收完了
server: 好的,我关连接了.
you:好的.我也关连接了
这篇关于为什么http请求要3次握手与4次挥手?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!