HTTP协议
1、什么是http协议?
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。
2、HTTP通信过程
当我们在浏览器地址栏上输入要访问的URL后,浏览器会分析出URL上面的域名,然后通过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通信,而通信的协议就是HTTP协议。
我们可以把这个过程类比成一个电话对话的过程。当我们要打电话给某个人,首先要知道对方的电话号码,然后进行拨号。打通电话后我们会进行对话,当然要对话肯定需要共同的语言,如果一个人说国语,而另一个人说英语,那肯定不能进行沟通的。在本例中,电话号码相当于上面的IP地址,而共同语言相当于HTTP协议。
我们通过一个简单的图来阐述这个过程:
浏览器访问URL过程:
- 首先在浏览器中输入url
- 查找缓存:浏览器先查看浏览器缓存中-系统缓存-路由器缓存中是否有该地址页面,如果有则显示页面内容。如果没有则进行下一步。
● 浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
● 操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统, 获取操作系统的记录(保存最近的DNS查询缓存);
● 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
● ISP缓存:若上述均失败,继续向ISP搜索。 - DNS域名解析:浏览器向DNS服务器发起请求,解析该url中的域名对应的IP地址。DNS服务器是基于UDP的,因此会用到UDP协议;
- 建立TCP连接:解析出IP地址后,根据IP地址和默认80端口,和服务器建立TCP连接
- 发起HTTP请求:浏览器发起读取文件的HTTP请求,该请求报文作为TCP三次握手的第三次数据发送给服务器
- 服务器响应请求并返回结果:服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
- 关闭TCP连接:通过四次挥手释放TCP连接
- 浏览器渲染:客户端(浏览器)解析HTML内容并渲染出来,浏览器接收到数据包后的解析流程为:
● 构建DOM树:词法分析然后解析成DOM树(dom tree),是由dom元素及属性节点组成,树的根是document对象
● 构建CSS规则树:生成CSS规则树(CSS Rule Tree)
● 构建render树:Web浏览器将DOM和CSSOM结合,并构建出渲染树(render tree)
● 布局(Layout):计算出每个节点在屏幕中的位置
● 绘制(Painting):即遍历render树,并使用UI后端层绘制每个节点。 - JS引擎解析过程:调用JS引擎执行JS代码(JS的解释阶段,预处理阶段,执行阶段生成执行上下文,VO,作用域链、回收机制等等)
● 创建window对象:window对象也叫全局执行环境,当页面产生时就被创建,所有的全局变量和函数都属于window的属性和方法,而DOM Tree也会映射在window的doucment对象上。当关闭网页或者关闭浏览器时,全局执行环境会被销毁。
● 加载文件:完成js引擎分析它的语法与词法是否合法,如果合法进入预编译
● 预编译:在预编译的过程中,浏览器会寻找全局变量声明,把它作为window的属性加入到window对象中,并给变量赋值为’undefined’;寻找全局函数声明,把它作为window的方法加入到window对象中,并将函数体赋值给他(匿名函数是不参与预编译的,因为它是变量)。而变量提升作为不合理的地方在ES6中已经解决了,函数提升还存在。
● 解释执行:执行到变量就赋值,如果变量没有被定义,也就没有被预编译直接赋值,在ES5非严格模式下这个变量会成为window的一个属性,也就是成为全局变量。string、int这样的值就是直接把值放在变量的存储空间里,object对象就是把指针指向变量的存储空间。函数执行,就将函数的环境推入一个环境的栈中,执行完成后再弹出,控制权交还给之前的环境。JS作用域其实就是这样的执行流机制实现的。
3、什么是HTTP协议无状态协议?怎么解决HTTP协议无状态协议?
- 无状态协议对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息。
- 无状态协议解决办法:通过1、Cookie 2、通过Session会话保存。
4、HTTP协议有什么组成?
请求报文包含三部分:
● 请求行:包含请求方法、URI、HTTP版本信息
● 请求首部字段
● 请求内容实体 响应报文包含三部分:
● 状态行:包含HTTP版本、状态码、状态码的原因短语
● 响应首部字段
● 响应内容实体
5、HTTP协议中有那些请求方式?
● GET: get请求是用来获取数据的,只是用来查询数据,不对服务器的数据做任何的修改,新增,删除等操作。
● POST:post请求一般是对服务器的数据做改变,常用来数据的提交,新增操作。
● PUT: put请求与post一样都会改变服务器的数据,但是put的侧重点在于对于数据的修改操作,但是post侧重于对于数据的增加。
● DELETE:delete请求用来删除服务器的资源。
● HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
● OPTIONS:用来描述了目标资源的通信选项,返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
6、HTTP常见头部字段
- 常用标准请求头字段
请求头 | 说明 |
---|---|
Accept | 设置接受的内容类型 |
Accept-Charset | 设置接受的字符编码 |
Accept-Encoding | 设置接受的编码格式 |
Accept-Datetime | 设置接受的版本时间 |
Accept-Language | 设置接受的语言 |
Cache-Control | 设置请求响应链上所有的缓存机制必须遵守的指令 |
Cookie | 设置服务器使用Set-Cookie发送的http cookie |
Connection | 设置当前连接和hop-by-hop协议请求字段列表的控制选项 |
Content-Length | 设置请求体的字节长度 |
User-Agent | 用户代理的字符串值 |
- 常见标准响应头
响应头 | 说明 |
---|---|
Access-Control-Allow-Origin | 指定哪些站点可以参与跨站资源共享 |
Cache-Control | 告诉服务端到客户端所有的缓存机制是否可以缓存这个对象,单位是秒 |
Content-Encoding | 设置数据使用的编码类型 |
Content-Language | 为封闭内容设置自然语言或者目标用户语言 |
Content-Length | 响应体的字节长度 |
Content-Type | 设置响应体的MIME类型 |
Date | 设置消息发送的日期和时间 |
ETag | 特定版本资源的标识符,通常是消息摘要 |
Expires | 设置响应体的过期时间 |
Last-Modified | 设置请求对象最后一次的修改日期 |
Server | 服务器名称 |
Vary | 通知下级代理如何匹配未来的请求头已让其决定缓存的响应是否可用而不是重新从源主机请求新的 |
7、 HTTP响应状态码
7.1 HTTP Status Code 1xx 请求信息
这一组状态码表明这是一个临时性响应。此响应仅由状态行和可选的HTTP头组成,以一个空行结尾。由于HTTP/1.0未定义任何1xx状态码,所以不要向HTTP/1.0客户端发送1xx响应。
Http状态码 | Http Status Code | Http状态码含义中文说明 |
---|---|---|
100 | 100 Continue | 请继续请求 |
101 | 101 Switching Protocols | 请切换协议 |
102 | 102 Processing | 将继续执行请求 |
7.2 HTTP Status Code 2xx 成功状态
这一组状态码表明客户端的请求已经被服务器端成功接收并正确解析。
Http状态码 | Http Status Code | Http状态码含义中文说明 |
---|---|---|
200 | 200 OK | 请求成功 |
201 | 201 Created | 请求已被接受,等待资源响应 |
202 | 202 Accepted | 请求已被接受,但尚未处理 |
203 | 203 Non-Authoritative Information | 请求已成功处理,结果来自第三方拷贝 |
204 | 204 No Content | 请求已成功处理,但无返回内容 |
205 | 205 Reset Content | 请求已成功处理,但需重置内容 |
206 | 206 Partial Content | 请求已成功处理,但仅返回了部分内容 |
207 | 207 Multi-Status | 请求已成功处理,返回了多个状态的XML消息 |
208 | 208 Already Reported | 响应已发送 |
226 | 226 IM Used | 已完成响应 |
7.3 HTTP Status Code 3xx 重定向状态
这一组状态码表示客户端需要采取更进一步的行动来完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。
Http状态码 | Http Status Code | Http状态码含义中文说明 |
---|---|---|
300 | 300 Multiple Choices | 返回多条重定向供选择 |
301 | 301 Moved Permanently | 永久重定向 |
302 | 302 Found | 302 Found |
303 | 303 See Other | 当前请求的资源在其它地址 |
304 | 304 Not Modified | 请求资源与本地缓存相同,未修改 |
305 | 305 Use Proxy | 305 Use Proxy |
306 | 306 (已废弃)Switch Proxy | (已废弃)请切换代理 |
307 | 307 Temporary Redirect | 307 Temporary Redirect |
308 | 308 Permanent Redirect | 永久重定向,且禁止改变http方法 |
7.4 HTTP Status Code 4xx 客户端错误
这一组状态码表示客户端的请求存在错误,导致服务器无法处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。
Http状态码 | Http Status Code | Http状态码含义中文说明 |
---|---|---|
400 | 400 Bad Request | 请求错误,通常是访问的域名未绑定引起 |
401 | 401 Unauthorized | 需要身份认证验证 |
402 | 402 Payment Required | - |
403 | 403 Forbidden | 禁止访问 |
404 | 404 Not Found | 请求的内容未找到或已删除 |
405 | 405 Method Not Allowed | 不允许的请求方法 |
406 | 406 Not Acceptable | 无法响应,因资源无法满足客户端条件 |
407 | 407 Proxy Authentication Required | 要求通过代理的身份认证 |
408 | 408 Request Timeout | 请求超时 |
409 | 409 Conflict | 存在冲突 |
410 | 410 Gone | 资源已经不存在(过去存在) |
411 | 411 Length Required | 无法处理该请求 |
412 | 412 Precondition Failed | 请求条件错误 |
413 | 413 Payload Too Large | 请求的实体过大 |
414 | 414 Request-URI Too Long | 请求的URI过长 |
415 | 415 Unsupported Media Type | 415 Unsupported Media Type |
416 | 416 Range Not Satisfiable | 请求的范围无效 |
417 | 417 Expectation Failed | 无法满足的Expect |
418 | 418 I’m a teapot | 愚人节笑话 |
421 | 421 There are too many connections from your internet address | 连接数超限 |
422 | 422 Unprocessable Entity | 请求的语义错误 |
423 | 423 Locked | 当前资源被锁定 |
424 | 424 Failed Dependency | 当前请求失败 |
425 | 425 Unordered Collection | 未知 |
426 | 426 Upgrade Required | 请切换到TLS/1.0 |
428 | 428 Precondition Required | 请求未带条件 |
429 | 429 Too Many Requests | 并发请求过多 |
431 | 431 Request Header Fields Too Large | 请求头过大 |
449 | 449 | 请重试 |
451 | 451 Unavailable For Legal Reasons | 访问被拒绝(法律的要求) |
499 | 499 Client Closed Request | 客户端主动关闭了连接 |
7.5 HTTP Status Code 5xx 服务器错误状态
这一组状态码说明服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。
Http状态码 | Http Status Code | Http状态码含义中文说明 |
---|---|---|
500 | 500 Internal Server Error | 服务器端程序错误 |
501 | 501 Not Implemented | 服务器不支持的请求方法 |
502 | 502 Bad Gateway | 网关无响应 |
503 | 503 Service Unavailable | 服务器端临时错误 |
504 | 504 Gateway Timeout | 网关超时 |
505 | 505 HTTP Version Not Supported | 服务器不支持的HTTP版本 |
506 | 506 Variant Also Negotiates | 服务器内部配置错误 |
507 | 507 Insufficient Storage | 服务器无法存储请求 |
508 | 508 Loop Detected | 508 Loop Detected |
509 | 509 Bandwidth Limit Exceeded | 服务器带宽限制 |
510 | 510 Not Extended | 获取资源策略未被满足 |
511 | 511 Network Authentication Required | 需验证以许可连接 |
599 | 599 Network Connect Timeout Error | 网络连接超时 |