HTTP协议、【HTTP请求、响应格式】及一次HTTP请求的完整过程_http协议完成一次请求-程序员宅基地

技术标签: 协议  测试  SpringMVC  http  状态码  计算机常识  

补入这篇博客,内容很全
补入此博客

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)。

User Agent:目前理解HTTP请求头中的User Agent属性是用于服务器获取浏览器版本,以判断是否支持一些技术(例如框架)。比如有的浏览器支持框架,则服务器会根据User Agent识别出该浏览器,并向浏览器发送含有框架的页面;若不支持,则服务器向浏览器发送无框架的页面——【自己查阅资料的原话:网站管理员探测user agent,对Mozilla浏览器发送含有框架的页面,对非Mozilla浏览器发送没有框架的页面】。

HTTP协议工作原理

通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及响应请求而返回的内容,如文件、错误消息、或者其它信息。

HTTP协议工作流程:
第一步:建立TCP/IP连接,客户端与服务器通过Socket三次握手进行连接。
第二步:客户端向服务端发起HTTP请求(即请求行?例如:POST/login.html http/1.1)。
第三步:客户端发送请求头部、请求内容,最后会发送一空白行,标示客户端请求完毕。
第四步:服务器做出应答,表示对于客户端请求的应答(即状态行?例如:HTTP/1.1 200 OK)。
第五步:服务器向客户端发送响应头部信息,发送一空白行,表示应答头信息发送完毕。随后以Content-type要求的数据格式,发送响应正文给客户端。
第六步:服务端关闭TCP连接,如果服务器或者客户端的Connection:keep-alive,则客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接。

一次HTTP请求的完整过程

  1. 浏览器根据域名解析IP地址
  2. 浏览器通过IP地址与WEB服务器建立一个TCP连接
  3. 浏览器给WEB服务器发送一个HTTP请求
  4. 服务器端响应HTTP请求,浏览器得到服务器响应的内容,比如HTML页面代码
  5. 浏览器解析HTML代码,并请求HTML代码中的资源
  6. 关闭该TCP连接,浏览器对页面进行渲染呈现给用户

浏览器根据域名解析IP地址

浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址。查找过程依次如下:

  1. 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应且未过期的条目。如果有,则解析到此结束。

google浏览器查看自身DNS缓存,访问网址chrome://net-internals/#dns待学“访问网址后该怎么做”

  1. 操作系统缓存:如果上一步没有找到对应的条目,浏览器会搜索操作系统自身的DNS缓存,如果找到没有过期的对应条目,则停止搜索,解析到此结束。

查看操作系统自身的DNS缓存,以Windows系统为例,命令提示行输入ipconfig /displaydns进行查看

  1. hosts文件:如果上一步没有找到对应条目,浏览器就会尝试读取操作系统本地的文件,以windows系统为例,C:\Windows\System32\drivers\etc内的hosts文件

host文件,即C:\Windows\System32\drivers\etc\hosts

  1. 如果上一步没有找到对应条目,向DNS服务器请求进行域名解析

本步骤更具体地说,浏览器就会发起一个DNS的系统调用,向本地配置的首选DNS服务器(一般是电信运营商提供的,也可以使用像Google提供的DNS服务器)发起域名解析请求。域名解析请求是通过UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是说,运营商的DNS服务器必须得提供给我们该域名的IP地址
 
(运营商的)DNS服务器在收到域名解析请求后

  1. 首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。
  2. ?路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。
  3. ?ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。
  4. 如果没有找到对应的条目,则有运营商的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地址,该进行一步的动作了。

浏览器通过IP地址与WEB服务器建立一个TCP连接

根据DNS服务器解析出的IP地址和默认端口号,与该服务器进行TCP连接中3次握手的前两次,来建立连接,(自认)即Jmeter的HTTP请求中的红框部分,如下图所示。
在这里插入图片描述

浏览器给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允许传输任意类型的数据对象。

请求头的各属性

在这里插入图片描述
Content-Type:由于HTTP协议只规定 POST 提交的数据必须放在消息主体(body)中,并没有规定数据必须使用什么编码方式。前后端交互时编码和解码就变的棘手,服务端通常是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式编码,再对body进行解析。常用的Content-Type编码方式有:

  • application/x-www-form-urlencoded 数据在发送到服务器之前,会将表单内的数据转换为键值对,比如,username=admin&password=123456,并将所有字符都会进行URL 转码。
  • multipart/form-data 数据将被编码为一条消息,以标签为单元,用分隔符分开,既可以上传键值对,也可以上传文件,通常用于上传二进制的文件。
  • application/json 用来告诉服务端消息主体是序列化后的 JSON 字符串,前端无法将表单的enctype属性指定为application/json,通常使用ajax的方式发送这种编码形式的请求。
请求数据

自认,“请求数据”表示该请求调用接口时传入的实参,如下图第三部分所示,即为本次请求要传入的实参。
在这里插入图片描述

服务器端响应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.5

X-Powered-By: PHP/5.2.5

Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Content-Length: 4393

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Content-Type: text/html; charset=utf-8
//空行 
<html>  							//响应正文

<head>

<title>HTTP响应示例<title>

</head>

<body>

Hello HTTP!

</body>

</html>

浏览器解析HTML代码,并请求HTML代码中的资源

浏览器拿到HTML文件后,开始解析HTML代码,遇到静态资源时,就向服务器端去请求下载。

关闭该TCP连接,浏览器对页面进行渲染呈现给用户

浏览器利用自己内部的工作机制,把请求到的静态资源和HTML代码进行渲染,呈现给用户。

HTTP请求的类型及其使用用途

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010804417/article/details/123638124

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签