HTTP协议及一次【请求、响应】的完整过程
- HTTP协议简介
- HTTP协议工作原理
- 一次HTTP请求的完整过程
-
- 浏览器根据域名解析IP地址
- 浏览器通过IP地址与WEB服务器建立一个TCP连接
- 浏览器给WEB服务器发送一个HTTP请求
-
- HTTP协议-浏览器发送给服务器的HTTP请求的格式
-
- 请求行
-
- 请求方法
- 请求地址URI
- HTTP协议版本
- 请求头部
-
- 请求头部的各属性
- 请求数据
- 服务器端响应HTTP请求,向浏览器发送响应内容,比如HTML页面代码
-
- 状态行
-
- 状态码
-
- 重定向的请求代表当前功能还需要后续操作才能完成。
- 响应头部
- 响应正文
- 浏览器解析HTML代码,并请求HTML代码中的资源
- 关闭该TCP连接,浏览器对页面进行渲染呈现给用户
补入这篇博客,内容很全
HTTP协议简介 HTTP协议(Hyper Text Transfer Protocol,超文本传输协议,即传输文字、图片、音频、视频等超文本数据)是一种用于分布式、协作式和超媒体信息系统的应用层协议。为了更快地处理大量事务,确保协议的可伸缩性,HTTP协议被设计成了一种无状态协议,不保留之前一切的请求或响应报文的信息。HTTP协议也是万维网(WWW,World Wide Web)的数据通信的基础。
【比如,用户登录到一家购物网站,即使他点击进入该网站的其他页面后,也需要能继续保持登录状态。针对这一情况,网站为了能 够掌握是谁送出的请求,需要保存用户的状态】——这是否与http请求取样器中的keep alive有关。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管 理状态了。HTTP是一个客户端(用户)和服务器端(网站)请求和应答的标准,其定义了定义Web客户端如何向Web服务器请求Web页面,以及服务器如何把Web页面响应给客户端。【HTTP使用的是TCP/IP协议,而非UDP,(待确认)】。
HTTP协议中并没有规定必须使用TCP/IP或其支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。因为UDP是不可靠传输,所以上面那句话提到“HTTP使用的是TCP/IP协议,而非UDP”,自认。用户通过使用各种工具(网页浏览器、网络爬虫或者 “其它,比如Jmeter”)作为客户端,来发起一个HTTP请求到服务器的指定端口(默认端口为80)。这个客户端被称为用户代理程序(User Agent)。接受并响应该HTTP请求的服务器上,存储着各种用户需要的资源,比如HTML文件和图像。这个被用户请求的服务器被称为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
HTTP协议工作原理 通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及响应请求而返回的内容,如文件、错误消息、或者其它信息。User Agent
:目前理解HTTP请求头中的User Agent
属性是用于服务器获取浏览器版本,以判断是否支持一些技术(例如框架)。比如有的浏览器支持框架,则服务器会根据User Agent
识别出该浏览器,并向浏览器发送含有框架的页面;若不支持,则服务器向浏览器发送无框架的页面——【自己查阅资料的原话:网站管理员探测user agent,对Mozilla浏览器发送含有框架的页面,对非Mozilla浏览器发送没有框架的页面】。
HTTP协议工作流程:
第一步:建立TCP/IP连接,客户端与服务器通过Socket三次握手进行连接。
第二步:客户端向服务端发起HTTP请求(即请求行?例如:POST/login.html http/1.1)。
第三步:客户端发送请求头部、请求内容,最后会发送一空白行,标示客户端请求完毕。
第四步:服务器做出应答,表示对于客户端请求的应答(即状态行?例如:HTTP/1.1 200 OK)。
第五步:服务器向客户端发送响应头部信息,发送一空白行,表示应答头信息发送完毕。随后以Content-type要求的数据格式,发送响应正文给客户端。
第六步:服务端关闭TCP连接,如果服务器或者客户端的Connection:keep-alive,则客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接。
一次HTTP请求的完整过程
- 浏览器根据域名解析IP地址
- 浏览器通过IP地址与WEB服务器建立一个TCP连接
- 浏览器给WEB服务器发送一个HTTP请求
- 服务器端响应HTTP请求,浏览器得到服务器响应的内容,比如HTML页面代码
- 浏览器解析HTML代码,并请求HTML代码中的资源
- 关闭该TCP连接,浏览器对页面进行渲染呈现给用户
- 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应且未过期的条目。如果有,则解析到此结束。
google浏览器查看自身DNS缓存,访问网址chrome://net-internals/#dns
,待学“访问网址后该怎么做”。
- 操作系统缓存:如果上一步没有找到对应的条目,浏览器会搜索操作系统自身的DNS缓存,如果找到没有过期的对应条目,则停止搜索,解析到此结束。
查看操作系统自身的DNS缓存,以Windows系统为例,命令提示行输入ipconfig /displaydns
进行查看
- hosts文件:如果上一步没有找到对应条目,浏览器就会尝试读取操作系统本地的文件,以windows系统为例,
C:\Windows\System32\drivers\etc
内的hosts文件
host文件,即C:\Windows\System32\drivers\etc\hosts
- 如果上一步没有找到对应条目,向DNS服务器请求进行域名解析
本步骤更具体地说,浏览器就会发起一个DNS的系统调用,向本地配置的首选DNS服务器(一般是电信运营商提供的,也可以使用像Google提供的DNS服务器)发起域名解析请求。域名解析请求是通过UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是说,运营商的DNS服务器必须得提供给我们该域名的IP地址浏览器通过IP地址与WEB服务器建立一个TCP连接 根据DNS服务器解析出的IP地址和默认端口号,与该服务器进行TCP连接中3次握手的前两次,来建立连接,(自认)即Jmeter的HTTP请求中的红框部分,如下图所示。
(运营商的)DNS服务器在收到域名解析请求后
- 首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。
- ?路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。
- ?ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。
- 如果没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求:
①运营商的DNS(DNS服务器都内置13台根域的DNS的IP地址)首先会找根域的DNS的IP地址。
②根据找到的根域DNS地址,运营商的DNS就会向其发起请求(请问www.linux178.com这个域名的IP地址是多少啊?)
③根域DNS发现要查询的网址是一个顶级域com的一个域名,于是就告诉运营商的DNS,我不知道这个域名的IP地址,但是我知道com域的IP地址,你找它去。
④于是运营商的DNS就得到了com域的IP地址,随后向com域的IP地址发起了请求(请问www.linux178.com这个域名的IP地址是多少?)
⑤com域服务器告诉运营商的DNS,我不知道www.linux178.com这个域名的IP地址,但是我知道linux178.com这个域的DNS地址,你去找它去。
⑥于是运营商的DNS向linux178.com这个域名的DNS地址(这个一般就是由域名注册商提供的,像万网,新网等)发起请求(请问www.linux178.com这个域名的IP地址是多少?)这个时候linux178.com域的DNS服务器一查,“诶,果真在我这里”,于是就把找到的结果返回给了运营商的DNS服务器
⑦运营商的DNS服务器就拿到了www.linux178.com对应的IP地址,并返回给用户的Windows系统内核,内核再把结果返回给浏览器,最终浏览器拿到了www.linux178.com 对应的IP地址,该进行一步的动作了。
文章图片
浏览器给WEB服务器发送一个HTTP请求 TCP的3次握手的第三次,包括但不限于(自认)Jmeter的HTTP请求中的红框部分,如下图所示。
文章图片
HTTP协议-浏览器发送给服务器的HTTP请求的格式
一个HTTP请求报文由请求行(request line)、请求头部(headers)、请求数据(request body)和空行(blank line)4个部分组成,如下图右侧汉字标注所示。“空行”即下图中的“| 回车符 | 换行符|”,自认。
文章图片
以一次HTTP请求实例为例,如下图红色字体所示:
1
为请求行,2
为请求头部,3
为请求数据,三者之间使用“空行(| 回车符 | 换行符|)”间隔。文章图片
请求行 请求行分为三个部分:请求方法(的类型)、请求地址URI和HTTP协议版本,它们之间用空格分割。如上图红色自写1所示。
请求方法 请求地址URI 请求地址URL的组成为
<协议>://<主机>:<端口>/<路径>
,(自认)<路径>
即为URI,如下图所示(下图缺少了端口)。文章图片
HTTP协议版本 协议版本的格式为:
HTTP/主版本号.次版本号
,常用的有HTTP/1.0和HTTP/1.1。请求头部 为请求报文添加了一些附加信息,由键值对组成,每行一对,名和值之间使用冒号分隔,如下图中的
2
。 请求头部的最后,会有一个空行,表示请求头部结束,接下来为请求数据。文章图片
图中的
Content-Length
表示请求体里面的数据长度;Content-Type
表示正在传输的类型,HTTP允许传输任意类型的数据对象。请求头部的各属性
文章图片
请求数据 自认,“请求数据”表示该请求调用接口时传入的实参,如下图第三部分所示,即为本次请求要传入的实参。
文章图片
服务器端响应HTTP请求,向浏览器发送响应内容,比如HTML页面代码 HTTP响应报文由状态行(status line)、响应头部(headers)、响应正文(response body)和空行(blank line)4个部分组成。
文章图片
状态行
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,状态码(3位数字组成),以及【状态码描述(描述状态码的原因短语,是对状态码的简单描述)】,彼此由空格分隔,如上图所示。
文章图片
状态码
文章图片
状态代码的第一个数字代表当前响应的类型:
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
文章图片
重定向的请求代表当前功能还需要后续操作才能完成。 响应头部
文章图片
响应正文
HTTP/1.1 200 OK//状态行Date: Sun, 17 Mar 2013 08:12:54 GMT//响应头部Server: Apache/2.2.8 (Win32) PHP/5.2.5X-Powered-By: PHP/5.2.5Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3;
path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Length: 4393Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html;
charset=utf-8
//空行
//响应正文HTTP响应示例 Hello HTTP!
浏览器解析HTML代码,并请求HTML代码中的资源 浏览器拿到HTML文件后,开始解析HTML代码,遇到静态资源时,就向服务器端去请求下载。
关闭该TCP连接,浏览器对页面进行渲染呈现给用户 【测试|HTTP协议、【HTTP请求、响应格式】及一次HTTP请求的完整过程】浏览器利用自己内部的工作机制,把请求到的静态资源和HTML代码进行渲染,呈现给用户。
推荐阅读
- Appium Grid并发测试
- springmvc配置中,mapper一直依赖注入不进去的问题记录
- SpringMVC@RequestMapping注解
- java相关|一次线上http连接被拒绝问题的排查
- APP专项测试 | 内存及cpu
- springmvc搭建环境时报No mapping found for HTTP request with URI [/exam3/welcome] in DispatcherServlet with
- APP弱网测试
- 背单词app评估测试
- app 压力测试