HTTP协议:作为www服务器和浏览器之间的标准

http协议百度百科给的定义

百度百科

http协议作为应用层的协议。不能和其他传输层的协议搞混淆。

想要弄清http协议,就从浏览器输入网址开始,现在一步一步梳理下里面的过程。

  1. 首先输入url:以http://www.163.com 为例 , url(统一资源定位符)
  2. 浏览器会将www.163.com 这个域名发送给DNS服务器,让它解析成我们计算机网络熟悉的ip地址。
  3. 因为http协议是基于TCP协议的,TCP协议处于传输层,所以首先需要建立TCP连接。
  4. 建立TCP连接,三次握手必不可少。之前的TCP的blog中有提到,目前http协议出在1.1中,默认是开启了keep-alive的,这样的机制是保证tcp建立连接后,可以在多次请求中复用
  5. 建立了连接后,浏览器就发送http请求,请求的格式如下:
    在这里插入图片描述
    注: http报文分为三部分;1. 请求行 2. 请求的首部 3. 正文实体

请求行: url就是我们输入的http://www.163.com 版本为HTTP 1.1 这里说的方法有一下几种类型
最常用的就是GET: 就是去服务器获取一些资源,对于访问网页来说,获取的资源就是一个页面。至于返回什么有服务器来确定,现在经常是json字符串。
另一种类型叫POST: 是主动给服务器一些信息,而不是获取,格式也常见是json格式,常见的场景就是提交信息,比如提交自己的用户名、在购物网站中提交的购物信息啊等等
还有一种类型是PUT: 就是向指定资源位置上传内容。但是http服务器往往不允许上传文件的,因为也是不安全的。所以PUT和POST就成了传给服务器东西的方法。
(PUT和POST的区别: POST往往是用来创建资源的,而PUT往往是用来修改资源的)
还有一个类型是DELETE: 就是删除资源的,我们需要删除其中一个资源时,就需要用DELETE了。
首部字段:
首部是key value ,通过冒号分隔。这里面往往包含一些非常重要的字段。
例如: Accept-charset ,表示客户端可以接收的字符串,是用来防止另外字符串传过来。
还有, Content-Type是指正文格式。例如当我们进行post请求时,如果正文格式时json,那么这个值应该设置为json
还有一个是缓存,为什么呢?因为有的网页里面显示的图片资源很大,加载需要很长时间,那么每次访问刷新的话,都需要加载很长时间就会导致用户体验感非常低,而对服务器压力很高。所以在高并发场景下,都需要有个接入层,将这些静态资源请求拦在外面,看下面的架构图:

在这里插入图片描述
说明一下: 其中的DNS,CDN这个先不讲,有兴趣的可以看其他文章,现在主要是讲Nginx ,这个是如何处理http协议的?,对于静态资源,有一层Vanish缓存层,当缓存层过期的时候,才会访问到真正的Tomcat应用集群。
在http头里面,cache-control 是用来控制缓存的,当客户端发送的请求中包含max-age指令时,如果判定的缓存层中,资源缓存时间比指定时间数值小,那么客户端可以接受缓存的资源;当指定max-age值为0, 那么缓存层通常需要将请求转发给应用集群。

  1. 到这里之后,已经拼好了http请求的报文格式,这时候,浏览器就会将它发送给下一层传输层,这个就不需要我们操心了。
  2. 下面谈谈http请求的发送:http协议的基于TCP协议的,因此它会用面向连接的方式发送请求,通过stream二进制流的方式发送对方。到了TCP层后,它会把二进制流变成一个报文段发送给服务器。
  3. 在TCP层发送报文时候,都需要对方回复一个ACk,保证报文的可靠送达,如果没有可靠送达根据TCP的机制,会有重传机制的,这个全是TCP层干的
  4. TCP层发送报文的时候,都需要加上自己的地址(源地址)和想要访问的页面(目的地址),将这两个IP放到里面,交给IP层处理。
  5. 然后IP层查看目的地址和自己是否在同一个局域网,如果是,就直接用ARP协议(将目的地址请求对应的MAC地址),然后将源MAC和目标MAC地址放入到MAC头中,在发送就行;如果不是在同一局域网中,就需要发送到网关,还是需要ARP协议获取网关的MAC地址,然后重复上面的操作,发送出去。
  6. 网关收到相关的包后,根据路由协议,找到下一跳路由器,然后一跳一跳的找,直达目的地址在自己的某一个出口的局域网中,就可以在这个局域网中发送ARP,获得这个目标地址的MAC地址,将包发送出去
  7. 目标机器发现MAC地址符合后,就将包收起来,发现IP地址符合,根据IP头中的协议项,知道自己上一层是TCP协议,于是解析TCP的头,里面有序列号,需要看序列包是不是我要的,如果是就放入缓存中,然后返回一个ACK,如果不是就丢弃。
  8. TCP头里面有端口号,HTTP的服务器正在监听这个端口号,于是目标机器号自然就知道是不是HTTP服务器这个进程的包,于是就将包发给HTTP服务器。HTTP服务器的进程看到,就知道这个请求是请求的是一个网页,于是将网页发送给客户端。
  9. HTTP返回的构建
    下图是HTTP1.1 的
    在这里插入图片描述
    状态码反应HTTP请求的结果。常见的有一下结果: 200: 代表这请求成功。 404: 就是服务端无法相应这个请求。等等。
    接下来返回首部的key-value
    这里面的额Retry-After ,告诉客户端应该在多长时间后再次尝试一下。503 : 代表着服务暂时不再和这个值配合使用。
    这返回的头部里面也有Content-type 表示返回的html还是json。
    1. 然后构造好了HTTP报文后,接下来就是将这个报文发送出去。还是交给socket发送,交个TCP层,让TCP层将返回的HTML,然后发送。
    2. 接下来就是将按照上面的逻辑反过来走一遍。这大概就是一个HTTP请求的完整过程。

下面分析一下HTTP2.0 和HTTP1.1 的区别:
1.1的版本是在应用层一纯文本的形式进行通信,每次的通信都要带完整的HTTP头,而且不考虑pipeline模式的话,每次的过程想上面的的一来一回,效率可想而知了,这样的话不可能实现微利爱的高并发。
2.0版本在1.1上做了更改。2.0版本会对HTTP头进行一定的压缩,将原来每次携带大量的key-value在两端建立一个索引表,对相同的头只发送索引表中的索引。
另外2.0 协议中将一个TCP连接中,分成的多个流,多个流在客户端和服务端两头发送。
2.0版本还将所有的传输信息分割为更小的消息和帧,并对她们采用二进制编码。常见的有Header帧,用于传输Header内容,并且会开启一个信的流。再就是Data帧,用来传输正文实体,多个帧属于同一个流。

2.0 这样的形式,客户端可以将多个请求分到不同的流中,然后将请求的内容拆成帧,进行二进制传输,这些帧可以散乱的发送,到了之后,然后根据每个帧的首部重新组装,并且还可以根据优先级,根据优先级可以优先处理哪个流的数据。这样在http中请求中,优化了1.1的公安兵法能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值