03.http请求完整过程

165 阅读10分钟

当用户在浏览器中输入了网址回车之后,网络协议都做了哪些工作?

  1. 首先浏览器应用程序要解析出域名
  2. 根据域名获取对应的IP地址,首先从浏览器缓存中中查看,比如
1          chrome://net-internals/#events

如果没有就从本机解析文件hosts(/etc/hosts)查看,还没有就从dns域名服务器层层解析
3. 拿到IP地址以后,浏览器发起与服务器的三次握手
4. 建立tcp连接之后,开始组装请求报文,发送报文
5. 服务器收到报文请求之后,解析请求报文,返回响应数据
6. 浏览器收到响应之后,开始渲染页面
7. 浏览器拿到想要的数据了,通过四次挥手关闭tcp连接关闭

常见的状态码

1XX 提示信息

100 continue 继续请求
101 switching protocol 切换协议,服务器应客户端要求,升级协议,只能低到高

2XX 请求成功

200 success 请求成功 常用于post get请求
201 created 成功创建资源
202 accepted 成功接受请求,但是还不确定这个请求是否能够成功的被处理完。这个请求可能会也可能不会被执行,并且在处理发生时可能会被拒绝,这些都不确定。在http这种无状态的协议中,也是没办法稍后再发送当前全球结果的异步响应;所以发送请求的客户端稍后可能会使用其他方式来取得这个请求的响应结果,或者是服务器以一种其他方式来通知客户端结果,比如邮件。
203 Non-Authoritative Information 非权威认证信息,通常是因为代理服务器响应给客户端的某些信息和源服务器的不匹配 204 not-content 无内容 服务器处理请求成功,但是没有任何要响应的内容。一般是用put请求更新某个资源成功后,服务器会返回此响应。
一般这两种情况是等价的:

    HTTP/2 204 No Content
    HTTP/2 200 OK
    Content-Length:0

205 reset content 表示服务器成功的处理了客户端的请求,要求客户端重置它发出请求时的文档视图,和204类似,也不返回任何内容。
206 partial COntent 是当客户端请求使用了Range头部,服务器回复的响应,表示只响应了部分内容。

3XX 重定向

300 Multiple Choices 表示这个请求拥有多种可能的响应。客户端或者代理服务器应该从中选择一个。
假如服务器可以提供一个优先选择,那么响应首部应该生成一个location首部。
301 Moved Permanently 永久重定向,表示资源已经被永久的移动到Location首部指定的url上了。
302 Found 表示资源已经被暂时移动到了Location指定的URL上,浏览器会重定向到这个url,但是搜索引擎不会对这个资源的连接进行更新。规范里,只有当原请求时get或者是head方式才会自动重定向。
303 see other 通常是put或者是post操作的返回结果,表示重定向链接指向的不是新上传的资源,而是另一个页面。
304 not modified 表示无需再次传输请求内容,可以使用缓存内容。客户端首部有if-None=Match/if-Modified-Sine,客户端缓存了这个请求资源但不确定这个资源是不是最新版本的时候,就会发送一个条件请求,请求的首部if-Modified-Since的值是上次请求返回的响应头last-Modified值,if-None-Match请求头的知识上次返回的ETag(标记url对象是否改变)响应头的值,服务器根据这两个请求头判断缓存的资源是否为最新,如果是最新就返回304状态码,响应体无内容。
307 Temporary Redirect 临时重定向,表示请求的资源暂时的被移动到响应的Location首部所指向的URL上。 如果重定向的原请求不是get或者head方法,那么浏览器一定不能自动的进行重定向,即便location有url,也不会重定向

301和302是http1.0规范的内容,是不允许处对象的时候改变请求method的,实际上许多浏览器在实现的时候会改变method,这时候就会出现规范和实现不一致的情况。303、307是1.1出现的规范。
302、303、307都是基于http1.1兼容1.0规范和实现的差异性;

  1. 303运行重定向时改变请求的method
  2. 307则不允许改变请求的method
  3. 303响应不能被缓存

4XX 客户端错误

400 Bad request 请求有语法错误或者是无效请求消息格式,或者是欺骗性请求路由。
401 Unauthorized 缺乏目标资源要求的身份验证凭证,会和www-Authenticate首部一起发送。
402 Payment Required 请求被保留。402 状态码被创建最初目的是用于数字现金或微型支付系统,表明客户端请求的内容只有付费之后才能获取。目前还不存在标准的使用约定,不同的实体可以在不同的环境下使用。
403 Forbidden 服务器有能力处理该请求,但拒绝授权访问。 404 Not Fount 服务器无法找到资源。 405 Method Not Allowed 不允许使用当前请求方法 406 Not Acceptable 服务器无法提供与accept-charset以及accept-language消息头指定的值相配的响应 407 Proxy Authenticaton Required 缺乏代理服务器要求的身份验证凭证。
408 request Timeout 表示服务器想要将使用的连接关闭,一些服务器会在空闲连接上发送此状态码,同时响应首部还会将Connection首部值设置为close,408意味着服务器已经决定将连接关闭了。
这类响应出现的比较频繁,源于一些浏览器——例如 Chrome, Firefox 27+, 或者 IE9 等——使用 HTTP 协议中的预连接机制来加速上网体验。同时应该注意到,某些服务器会直接关闭连接,而不发送此类消息。 409 Conflict 表示请求与服务器秒资源的当前状态相冲突。
冲突最可能发生在对PUT请求的响应中,如:上传文件的版本比服务器已存在的还要旧,就会导致冲突。 410 Gone 资源永久丢失
411 Length Required 请求报文缺少Content-Length字段。

5XX 服务器错误

500 Internal Server Error 表示服务器内部错误。 501 Not Implemented 请求的方法不被服务器支持(服务器必定会支持,不会返回这个状态码的方法只有GET和Head) 502 Bad Gateway 网关或者是代理服务器从上游服务器接收到的响应是无效的。
503 Service Unavailable 服务器停机维护或者超载。
504 Gateway Timeout 网关或者代理无法在规定时间内获得想要的响应。
505 服务器不支持请求使用的HTTP版本

请求方法

CONNECT

开启客户端与所请求资源之间的双向沟通的通道。可以用来创建隧道。是一个应用范围为点到点的方法

DELETE

用于删除指定资源

DELETE /file.html HTTP/1.1

此方法服务器可能会响应的状态码:

  • 状态码 202 表示请求的操作可能会成功执行,但是尚未开始执行。
  • 状态码 [204](No Content) 表示操作已执行,但是无进一步的相关信息。
  • 状态码 [200] (OK) 表示操作已执行,并且响应中提供了相关状态的描述信息。

GET

get请求应该只用于获取数据(实际上并不是)

GET /index.html

HEAD

请求资源的头部信息,这些信息与get请求返回的信息一致。使用场景:在下载大文件时,先确定资源的大小再决定是否要下载,以此来节约宽带资源。

OPTIONS

获取目的资源所支持的http方法,获取目的资源就是对特定url发此请求,整站资源就将url设置为“*”。

PATCH

用于对资源进行部分修改。也是不可以多次提交的的。和post类似。

POST

发送数据到服务器。content-type指定发送数据的类型。通常是由表单提交发起此请求。post请求连续调用多次可能会有副作用,比如,一个东西提交多次。

PUT

使用请求中的负载创建或者是替换目标资源。请求一次或者是多次都是可以的。

TRACE

感觉看得到的少,懒得去查了。

请求响应报文构成

请求报文:\

请求行请求方法 url 协议版本
请求首部
请求头通用首部
实体首部
主体要携带的数据

响应报文:\

开始行协议版本 状态码 短语
响应首部
响应头通用首部
实体首部
主体要携带的数据

常见首部字段

通用字段:请求报文和响应报文都会使用的字段。
请求首部字段:补充了请求的附加内容、客户端信息、响应内容优先级等信息。
响应首部字段:补充响应的附加内容、也会要求客户端附加额外的内容信息。
实体首部字段:针对实体部分,补充资源内容更新时间等和实体有关的信息。\

通用首部字段名说明
Catche-control控制缓存,单向的,在请求设置了,响应里不一定有
Connection控制网络连接在当前请求响应完成后是否继续保持连接,keep-alive,持久连接,后面还可以对同一个服务器进行请求
Date报文创建的日期和时间
Pragma效果和catche-control类似,是http1.0出的,只能兼容1.0和以后的浏览器
Upgrade升级协议
Via由代理服务器添加,适用于正向代理和反向代理,可以用来追踪消息转发情况,防止循环请求,以及识别在请求或响应传递链中消息发送者对于协议的支持能力
warning错误通知
Trailer
Transfer-Encoding指定响应给客户端的报文主体的编码格式,一般是出现在head请求的响应中,而head响应没有消息体,所以这个首部实际上是在回应head请求所应用的get请求的应答的值
请求首部说明
Accept用户代理可处理的媒体类型
Accept-Charset优先的字符集
Accept-Encoding优先的编码
Accept-Language优先的语言(自然语言)
AuthorizationWeb认证信息
Expect期待服务器的特定行为
From用户的电子邮箱地址
Host请求资源所在服务器
响应首部说明