HTTP协议
超文本传输协议(HyperText Transfer Protocol,HTTP):一种无状态的,以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动
1.HTTP报文格式
HTTP 协议的请求报文和响应报文的结构基本相同,由三大部分组成:
起始行(start line):描述请求或响应的基本信息
头部字段集合(header):使用 key-value 形式更详细地说明报文
消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
2.请求行报文格式
请求方法:如 GET/HEAD/PUT/POST,表示对资源的操作;
请求目标:通常是一个 URI,标记了请求方法要操作的资源;
版本号:表示报文使用的 HTTP 协议版本。
3.响应行报文格式
版本号:表示报文使用的 HTTP 协议版本;
状态码:一个三位数,用代码的形式表示处理的结果;
状态码第一位数字决定了不同的响应状态
1 表示消息 1xx
100(客户端继续发送请求,这是临时响应):这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST的数据,如果不处理,客户端则不上传POST数据,如果处理,则POST上传数据。常用 于POST大数据传输。
101:服务器根据客户端的请求切换协议,主要用于websocket或http2升级
2 表示成功 2xx
200(成功):请求已成功,请求所希望的响应头或数据体将随此响应返回
201(已创建):请求成功并且服务器创建了新的资源
202(已创建):服务器已经接收请求,但尚未处理
203(非授权信息):服务器已成功处理请求,但返回的信息可能来自另一来源
204(无内容):服务器成功处理请求,但没有返回任何内容
205(重置内容):服务器成功处理请求,但没有返回任何内容
206(部分内容):服务器成功处理了部分请求,一般用来做断点续传,或者是视频文件等大文件的加载
3 表示重定向 3xx
表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向
300(多种选择):针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择
301(永久移动):请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置(永久重定向会缓存。新域名替换旧域名,旧的域名不再使用时,用户访问旧域名时用301就重定向到新的域名)
302(临时移动):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求(临时重定向不会缓存,常用 于未登陆的用户访问用户中心重定向到登录页面)
303(查看其他位置):请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
304:协商缓存,告诉客户端有缓存,直接使用缓存中的数据,返回页面的只有头部信息,是没有内容部分
305 (使用代理):请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理
307 (临时重定向):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
4 表示请求错误 4xx
代表了客户端看起来可能发生了错误,妨碍了服务器的处理
400(错误请求):服务器不理解请求的语法
401(未授权):请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
403(禁止):服务器拒绝请求--告诉客户端禁止访问该站点或者资源,如在外网环境下,然后访问只有内网IP才能访问的时候则返回
404(未找到):服务器找不到请求的网页
405(方法禁用):禁用请求中指定的方法
406(不接受):无法使用请求的内容特性响应请求的网页
407(需要代理授权):此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理
408(请求超时):服务器等候请求时发生超时
5 表示服务器错误 5xx
表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生
500(服务器内部错误):服务器遇到错误,无法完成请求
501(尚未实施):服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码
502(错误网关):服务器作为网关或代理,从上游服务器收到无效响应
503(服务不可用):服务器目前无法使用(由于超载或停机维护)--服务器停机维护时,主动用503响应请求或 nginx 设置限速,超过限速,会返回503
504(网关超时):服务器作为网关或代理,但是没有及时从上游服务器收到请求
505(HTTP 版本不受支持):服务器不支持请求中所用的 HTTP 协议版本
原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因
4.HTTP 头字段
头部字段是 key-value 的形式,key 和 value 之间用“:”分隔,最后用 CRLF 换行表示字段结束。比如前后分离时经常遇到的要与后端协商传输数据的类型“Content-type:
application/json”,这里 key 就是“Content-type”,value 就是“application/json”。HTTP 头字段非常灵活,不仅可以使用标准里的 Host、Connection 等已有头,也可以任意添加自定义头,这就给 HTTP 协议带来了无限的扩展可能。
头字段注意事项
字段名不区分大小写,字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”(有的服务器不会解析带“_”的头字段)。字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
字段的顺序是没有意义的,可以任意排列不影响语义;
字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。
5.常用头字段
HTTP 协议中有非常多的头字段,但基本上可以分为四大类:
请求字段:请求头中的头字段;如Host,Referer。
响应字段:响应头中的头字段,如:Server;
通用字段:在请求头和响应头里都可以出现,如 Content-type,Connection ;
6.HTTP请求的完整过程
当用户在浏览器输入网址回车之后
1. 首先干活的是 浏览器应用程序,他要解析出 URL中的域名
2. 根据域名获取对应的ip地址,首先从浏览器缓存中查看,如下可以查看浏览器中域名对应ip的解析
chrome://net‐internals/#events
如果没有则从本机域名解析文件hosts(/etc/hosts)中查看,还没有则从LDNS(Localdnsserver)、Rootserver域名服务器、国际顶级域名服务商的DNS 的层层
解析
3. 拿到IP地址后,浏览器就可以发起 与服务器的三次握手
4. 握手建立之后,就开始组装http请求报文,发送报文
5. 服务器收到请求报文之后开始,请求报文解析,生成响应数据,发送响应数据
6. 浏览器收到响应之后,开始渲染页面