为什么http请求要3次握手与4次挥手?

2024-09-04 11:08
文章标签 http 请求 握手 挥手

本文主要是介绍为什么http请求要3次握手与4次挥手?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.zhihu.com/question/67772889

作者:eechen
链接: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']);

编辑于 2017-11-09
90 ​7 条评论
​分享
​收藏 ​感谢 收起
14 人赞同了该回答

要么你记错了,要么你的面试官是个假的

3次握手,4次挥手是针对TCP连接来说的,HTTP协议本身不关注这块

3次握手,用来保障通讯双方有通信的基础

4次挥手,用来保障通讯双方可以安全的回收TCP通信的系统资源

编辑于 2017-11-07
14 ​2 条评论
​分享
​收藏 ​感谢
29 人赞同了该回答

假设2个人要相互确认对方已经收到自己的消息需要几步:

server: 嘿你在吗?

you: hei 我在,

server : 好的我发消息了,


server---->you


server: 嘿我发完了,

you: 好的,我收完了

server: 好的,我关连接了.

you:好的.我也关连接了


这篇关于为什么http请求要3次握手与4次挥手?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135854

相关文章

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,