HTTP版本
到目前为止总共出现了4个版本的HTTP协议,
1991年是HTTP 的0.9版本,这个版本的HTTP协议只支持GET方法,也就是说不能向服务器提交数据。
1996年,HTTP1.0 可以支持POST方法了。这个版本到目前应用已经很少了。该版本有一个问题,它不支持虚拟主机。一个IP只能建一个网站。
1999年,HTTP1.1 开始支持虚拟主机。一个域名就可以建立一个网站,而不需要固定的IP了。支持虚拟主机之后,互联网开始发生比较大的发展。
1.1版本正式开始支持链接的复用。
在1.1版本之前,一个请求要创建一个链接,一个链接只能请求一个资源。比如说请求一个html文件,那么之后这个链接就关闭了。
但是一个网站会有多个资源文件。这样请求每个文件都是需要重新再去创建链接了。在所有资源都加载完毕之后,网站才会正常的显示出来。而建立链接是比较耗时的。
在HTTP1.1之前,显示一个网页是需要建立多个链接的。但是在HTTP1.1开始,就可以建立一个链接,这个链接在请求完毕所需要的HTTP文件之后不关闭,继续请求JS、CSS、图片等文件。
HTTP1.1用了很多年,从1999年一直到2015年。现在也有很多网站都依然在使用http1.1。
从2015年开始出来http2,现在越来越多的网站,开始使用http2了。http2和http1有了更多的区别。
我们来看一下http的通讯过程
客户端和服务端建立好链接之后,先发送请求报文(蓝色),
第一行表示GET方法,GET后面跟的是资源地址,像这里一个反斜杠/ 表示请求的是根目录。继续往后就是HTTP的版本号 1.1版本。第一行就是固定的,表示方法、资源、版本号。
第二行开始就是请求的头信息了。头信息可以有任意多行。
Host这一行表示的是访问哪个域名,在HTTP1.1里面,是根据域名找对应的网站的,所以Host这一行是必须的。
后续的Connection:close,表示这个请求完毕之后,链接就要关闭了。我不再需要复用它了。
下面红色部分就是Response返回的信息了,
第一行也是固定的版本号,状态码和状态码简短的含义。
第二行开始是响应头,一直到响应头结束后有一个空行。
那么在空行之后,就是Response的Body部分了。Body部分的内容,要在前面的类型里面去指定,比如前面的Content-Type: text/html
上述就是一个简短的http的通讯过程。
在这里无论是请求还是响应都有一个Connection 这是在HTTP1.1版本开始增加进来的。这个connection除了close之外,也有keepalive,其含义就是这次请求之后,不要关闭链接,下次还是可以继续使用这个链接来请求别的内容。
一些例子🌰
我们可以看一下上面的第三行, User-Agent 里面的信息是可以在程序里面自己指定的。所以,如果有人写一个程序而不是使用浏览器来访问,也是可以冒充任何一个浏览器的。所以这个信息可靠性比较低。
server中获取的哪些信息是绝对可信的?
IP:这里的ip是没办法造假的。因为它是通过TCP的socket链接取到的。如果这个是个假的ip,那么是返不回去信息的,也就是客户端接收不到信息。但是这个IP并不一定是客户端的真实IP,因为中间有可能过代理,也有可能过类似NAT这种网络地址转换的服务器。这些都有可能会造成IP地址的变动。
实际上我们从网上可以看到有很多卖代理服务器的,所以这个IP在某些时候也不能完全相信的。
Header: 在上面的例子中我们其实可以看到,cookie,user-agent 这些都是我们自己写的。所以肯定是不能完全相信的。我们可以冒充任何一个浏览器。
Body部分:建议是服务器再做一次校验。因为完全可以写个程序绕过前端JS校验。
URL中的 query string 更不可信了,我们可以很容易的更改。