前端必须掌握的知识之Http协议基础以及发展进程

686 阅读5分钟

简介

我们看一下MDN是如何介绍的:

HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
MDN说http是一种在客户端和服务器通过web进行数据交换的通讯协议。

七层协议.png
http协议在网络七层协议中处于应用层,其中http协议是依赖传输层的tcp/ip协议实现的。http在请求之前需要进行三次握手来创建tcp连接,在连接上进行http传输。

http的版本

最初的http协议是0.9版本,这个版本的请求方法只有一个get方法,没有header头信息,服务器发送完毕就关闭tcp连接。
Http1.0版本:新增了post、put方法和响应状态码以及header头信息,还有缓存等等。
Http1.1版本:持久连接(在以前的版本中客户端向服务器发送Http请求收到响应后就会关闭tcp连接,持久连接就意味着服务器响应完毕后,连接依旧开启)、pipeline(将多个请求一起发出,服务器一起响应回来,不过服务器需要按请求的顺序依次响应)、增加了host使得可以在服务器上开启多个服务。 Http2.0:数据以二进制的形式传输,在之前的版本数据是以字符串的形式传输,好处是在服务器不用按顺序响应数据而可以同时去响应。头信息压缩:在之前的版本头信息必须完整发送和返回,其中一些字段是以字符串形式保存,这样会耗费带宽,压缩之后就可以节省带宽。服务器推送功能:服务器可主动向客户端推送数据。

三次握手

tcp握手.png
http请求时基于tcp连接发送的,而创建tcp连接需要先进行三次握手来确保服务器收到了客户端开启连接的信息,以及客户端收到服务端的开启信息。为什么是三次而不是两次或者四次?如果只有两次,那么服务器返回给客户端同意开启连接的信息后,服务器不知道客户端是否收到就直接开启了连接端口,如果由于网络问题客户端没有收到,那么服务器就开启了无用连接,浪费资源。

URI、URL、URN

URI:统一资源标志符,资源在互联网上所在的地方,我们可以通过地址获得资源。 URI其实是包含URL和URN。
URL: 统一资源定位器。看个URL:user:pass@host.com:80/path?query=… 其中包括协议(http)、用户认证(user:pass@不过现在有别的方式了,把用户信息放在URL不是很安全)、域名(host.com会通过dns解析成ip并定位资源在互联网中的哪台机器上)、端口(80,端口负责找到资源所在服务器上的某一个web服务。一般我们通常使用URL的时候都不会写端口,但其实已经默认了为80端口)、路由(path,一个web服务可能存放了很多内容,可以通过路由找到某个内容)、搜索参数(请求的资源如何搜索、查找,现在的web服务用来传递参数)、哈希(hash是代表文档的某一个片段)。
URN:永久统一资源定位符。在资源移动之后还是能找到。

http报文格式

http是请求和响应的形式,请求方永远是主动的。

请求报文

起始行:请求方法(get用来获取数据、post用来提交数据、put更新数据、delete删除数据,这些只是语义化的写法,就算用post来获取数据也是完全可以的,只不过显得不规范)、路由(/test/hi-there.txt请求的域名是用来创建连接的时候使用,此时只需要知道请求的资源在服务器什么地方就可以了)、http版本(HTTP/1.0)。

响应报文

起始行:http版本(HTTP/1.0)、响应状态码(200表示响应成功)

HTTP code

100~199:表示http请求要继续进行; 200~299:表示请求是成功的; 300~399:表示重定向和缓存; 400~499:表示请求出现问题; 500~599:表示服务器的问题;
说一说常见的状态码:
200:请求处理成功;204:请求处理成功但资源没有返回;206表示请求范围资源响应报文里包含了请求的范围资源;301:永久重定向,表示资源已经被分配了新的地址;302临时重定向,表示资源已经被分配了新的地址只不过临时性的;304:该状态是服务器告诉客户端继续使用缓存资源即可;400:表示请求报文出现了语法错误;401:表示用户需要身份验证。403:没有访问权限;404:找不到请求的资源; 500:表示服务器处理请求的时候发生了错误;503:表示服务器出现超负载或者在进行停机维护;