HTTP协议:0.9 -> 1.0 -> 1.1

HTTP协议

《HTTP/2》
《HTTPS》

HTTP和TCP的关系:
HTTP是基于TCP的应用层协议,支持HTTP协议则一定支持TCP协议。

特点

  1. 无状态
  2. 无连接,但是1.0后可以通过心跳检测keep-alive

发展历程

HTTP 0.9:只有GET和HTML

HTTP 0.9HTTP协议最初的版本,极为简单,客户端请求方式只有GET一种,同时规定TCP连接建立后,服务器只能返回HTML格式的字符串。
服务器发送完毕,就关闭连接。

存在的问题:

  1. 请求方式过于简单,不能满足复杂的网络环境需要
  2. 只支持HTML格式
  3. 数据通用性支持不够,请求和响应报文没有固定的格式

HTTP 1.0:加入POST和HEAD、报文格式规范、不支持长连接

针对HTTP 0.9的问题,HTTP 1.0做出了如下改进:

  1. 新增POSTHEAD请求方式,丰富了浏览器与服务器交互的手段
  2. 支持任何格式的内容,包括图片、视频、二进制文件,而不局限于文字
  3. 规范化HTTP的报文格式,每次请求和响应都要带上一个HTTP header头信息必须是ASCII码),用于描述元数据
  4. 新增报错码缓存权限多字符集支持等功能

request请求报文格式

HTTP request 请求报文格式:请求头header + 请求体body

请求方式
  1. GET:获取资源
  2. POST:传输实体文本
  3. HEAD:获得报文头部

GET和POST的区别:
1.主要区别:GET只有header没有body,每次请求就把header发送过去,只产生一个TCP数据包;而POST会首先将header发送过去,然后才发送body,产生两个数据包。
2.GET会被浏览器缓存,而POST不会。
3.GET的URL长度有限制,而POST没有。
4.GET只支持ASCII字符参数,而POST没有限制。
5.GET参数通过URL传播,存在安全隐患,POST则通过body传输。

request header主要内容
  1. Accept:text/plain —— 声明自己接受什么样的数据格式
  2. Accept-Charset:utf-8 —— 编码格式
  3. Accept-Encoding:gzip,deflate —— 声明自己接受什么样的数据压缩格式
  4. Accept-Language:en-US
  5. Connection:keep-alive —— 心跳检测
  6. Content-Length:348
  7. Content-Typte:HTTP 1.0中规定除了header只能是ASCII码外,其他部分可以为任意格式,因此必须声明是什么格式的数据。如text/plain、application/x-www-form-urlencoded
  8. Date:Tue,15 Nov 1994 12:15:26 GMT
  9. Host
  10. User-Agent:Mozilla/5.0… —— 客户端信息,如果要使用爬虫,一般需要伪装
  11. Cookie:$Version=1;Skin=new;
request body

response响应报文格式

HTTP response 响应报文格式:响应头header + 响应体body

状态码
  1. 1xx_继续:【100:客户端应继续发送请求】
  2. 2xx_成功:【200:请求成功】
  3. 3xx_重定向:
1
2
3
【301 Moved Permanently:请求的资源已经永久移动位置】
【302 Found:重定向到临时URL,非永久性】
【304 Not Modified:请求的资源未更新】
  1. 4xx_客户端错误:
1
2
3
4
【400 Bad Request:非法请求】
【401 Unauthorized:请求未经授权】
【403 Forbidden:权限不足,禁止访问】
【404 Not Found:没有找到对应页面】
  1. 5xx_服务器错误:【500:服务器错误】、【504:网关错误】
response header主要内容
  1. Accept-Patch:text/example;charset=utf-8
  2. Cache-Control:max-age=3600
  3. Content-Encoding:数据压缩的方式,如gzip
  4. Last-Modified:Tue,15 Nov 1994 12:15:26 GMT
  5. Content-Language:da
  6. Content-Length:348(HTTP 1.1 加入)
  7. ETag:”…”
  8. Expires:Thu,01 Dec 1994 16:00:00 GMT
  9. Location:http://www.w3.org/pub/WWW/People.html —— 跳转,重定向
  10. Set-Cookie:UserID=yxl;Max-Age=3600;Version=1 —— 设置Cookie
  11. Status:200 OK —— 返回值状态码

缺点

  1. 不支持长连接:HTTP 1.0每个TCP连接只能发送一个请求,发送数据完毕,通道就关闭,不支持长连接,有的浏览器会在请求时加一个Connction: keep-alive的字段来要求服务器不要关闭连接,但这并不是标准字段。
  2. 缺少强制的host首部。
  3. 缓存的选择相当简陋。

HTTP 1.1:长连接、管道(队头堵塞)、分块传输、host

指导思想:REST风格,从之前的面向“文档”发展到面向“资源”,互联网上的数据都是一个个“资源”,通过GET/POST/DELETE…进行操作。通俗地来说就是HTTP + JSON

1.请求方式

  1. GET:获取资源
  2. POST:传输实体文本
  3. HEAD:获得报文头部
  4. PUT:传输文件
  5. DELETE:删除文件
  6. TRACE:追踪路径
  7. OPTIONS:询问支持的方式
  8. CONNECT:要求使用隧道协议连接代理,主要使用SSL(安全套接层)和TLS(传输层安全)协议将通信内容加密后通过网络隧道传输

2.默认长连接

HTTP 1.1后,所有连结都默认是长连接了,即TCP默认不关闭,不用特意声明Connection:keep-alive
客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接,但是标准的做法是客户端在最后一次请求中发送Connection:close明确要求服务器关闭连接

3.管道机制:一个连接多个请求

HTTP 1.1加入了管道机制,允许在一个连接中发送多个请求,但是,服务器响应的顺序必须和客户端请求的顺序保持一致

队头堵塞:
由于HTTP 1.1要求响应的顺序必须和请求的顺序一致,所以所有响应会加入一个队列中,只有前面的处理完了才能处理后面的,如果前面的响应特别慢,那么后面的响应就会堆积。

4.Content-Length

由于管道机制的引入使得在一个连接中能够发送多个报文,所以就必须要指明数据包是属于哪个回应的,在响应报文中加入Content-Length,声明回应的数据长度。

5.分块传输编码

使用Conten-Length的话,就意味着必须要知道数据的长度,必须要等到数据全部处理完毕才发送,这是十分耗时的,一般来说都会采用流模式——产生一块数据,就发送一块数据
只要在报文中加入Transfer-Encoding:chuncked则可启用分块传输模式,最后传一块大小为0的数据块,表示传输结束

6.host:指定服务器的域名

HTTP 1.1新增了host字段,指定服务器的域名,这样就可以将请求发往同一个服务器的不同网站

缺点

  1. 队头堵塞
  2. TCP利用率低
  3. 消息首部不支持压缩,严重消耗带宽
  4. 不支持socket优先级的设置

浏览器访问网页到显示发生了什么?

1.将URL加入请求队列

2.DNS解析:缓存 -> hosts -> 路由器 -> 递归查询DNS服务器

一般人会认为,我们输入网址,浏览器就会直接访问DNS服务器,拿到网址对应的IP,但其实不是这样的。

  1. 一般来说,浏览器会缓存DNS解析2-30分钟不等,所以输入网址后,浏览器会首先查看DNS缓存,如有DNS缓存,则直接返回IP,否则才执行下一步。
  2. 缓存中没有DNS解析,浏览器会查询系统hosts文件,如果找到直接返回IP,否则才执行下一步。
  3. 缓存hosts文件中都没有DNS解析,浏览器会查询路由器中的DNS缓存,如果找到直接返回IP,否则才会去访问DNS服务器
  4. 从根域名开始递归搜索DNS服务器,返回IP。

3.TCP连接:HTTPS / keep-alive & 多工

拿到IP地址后,浏览器会与IP地址对应的服务器建立TCP连接

  1. 如果服务器采用了HTTPS协议,那么需要先进行TLS协议握手。
  2. TCP三次握手建立连接。
  3. 如果服务器采用的是HTTP/1.0 keep-alive或是HTTP/1.1,那么TCP连接不会主动关闭,否则每次请求结束后就关闭TCP连接
  4. 如果采用的是HTTP/1.1,那么一个TCP连接内可以发送多个请求,但是响应顺序应该保持一致;如果采用的是HTTP/2则是全双工的。

4.页面渲染

浏览器发送请求后,等待服务器响应,关键资源接收到后,进行页面渲染,展示界面。

-------------本文结束感谢您的阅读-------------

本文标题:HTTP协议:0.9 -> 1.0 -> 1.1

文章作者:DragonBaby308

发布时间:2019年06月28日 - 14:15

最后更新:2020年01月25日 - 13:38

原始链接:http://www.dragonbaby308.com/http/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%