第14讲 | HTTP协议:看个新闻原来这么麻烦

HTTP协议,是每个人上网用的第一个协议。

当你在浏览器输入http://www.163.com,这其实是个URL,叫统一资源定位符。统一是说访问网络资源都按照这种统一的格式。http表示使用HTTP协议,www.163.com是一个域名,表示互联网的某个位置。正是因为它是统一的,当你输入这个URL时,浏览器才直到怎么去统一处理。

HTTP请求的准备

浏览器将www.163.com的域名发给DNS服务器,服务器返回这个域名的IP地址。

HTTP协议基于TCP协议,所以使用这个IP地址建立TCP连接,即所谓的三次握手。

目前使用的HTTP协议版本大多是1.1。1.1的协议默认开启了Keep-Alive,这样建立的TCP连接,可以在多次请求中复用。

HTTP请求的构建

建立连接之后,浏览器就要发送HTTP请求。

格式像这样:

HTTP的报文分三大部分。第一部分时请求行,第二部分是请求的首部,第三部分是正文实体。

第一部分:请求行

请求行中的URL,就是http://www.163.com,版本为HTTP 1.1。方法有几种类型。

访问网页最常用的是GET方法,GET就是去服务器获取一些资源。

POST方法,它主动告诉服务器一些信息,而不是获取,告诉服务器的内容一般放在正文里,正文有各种各样的格式,最常见的格式是JSON。例如,客户端要把“我是谁?我要买啥?买多少”的信息告诉服务器就是用这个方法。

PUT方法,向服务器的指定位置上传新内容。PUT和POST稍有不同,POST是用来创建一个资源的,PUT是用来修改资源的。

DELETE方法,用来删除资源的。

第二部分:首部字段

首部是key value,通过冒号分隔。

例如,Accept-Charset,表示客户端可以接收的字符集,防止传过来别的字符集,从而产生乱码。

Content-Type,表示正文格式,例如我们POST请求时,正文是JSON格式,这个值就设置为JSON。

HTTP经常要用到缓存,例如浏览一个商品的详情,里面有商品的价格、图片、库存等信息。商品的图片一般不会频繁变动,库存会根据购买情况经常改变。如果图片很大,而库存数据非常小,那么每次跟新数据的时候要更新包括图片在内的整个页面,对于服务器的压力会很大。

HTTP头里面,Cache-control是用来控制缓存的。

If-Modified-Since也是关于缓存的字段。如果服务器的资源在某个时间之后更新了,那么客户端下载最新的资源。

HTTP请求的发送:

HTTP协议基于TCP,使用面向连接的方式发送,通过strem二进制流的方式发送给对方。到了TCP层,把二进制流变成一个个报文段发送给服务器。

HTTP返回的构建:

格式如下(HTTP1.1):

状态码反应HTTP请求的结果,200意味着成功,404表示服务端无法响应。短语会具体描述一下状态码的含义。

接下来时首部的key value。

Retry-After表示,告诉客户端应该在多长时间再次尝试一下。

Content-Type表示返回的格式,可以HTML,也可以是JSON。

构造好了返回的HTTP报文,接下来就是将报文发出去,还是交给socket发送。

HTTP2.0

HTTP1.1在应用层以纯文本的形式进行通信,每次通信都带完整的HTTP头,实时性和并发性存在问题。

HTTP2.0对HTTP的头进行压缩,HTTP2.0还将一个TCP连接切分成多个流,每个流有自己的ID,流可以是客户端发送到服务端,也可以是服务端发送到客户端。

HTTP2.0将所有的传输信息分隔成更小的消息和帧,并采用二进制编码格式。Header帧传输首部内容,Data帧传输正文实体,多个Data帧属于同一个流。

根据这两种机制,HTTP2.0的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。这些帧可以乱序发送,然后根据每个帧首部的流标识重新组织,并且可以根据优先级,决定优先处理哪个流的数据。

例如我们的一个页面要发送三个独立的请求,一个获取css,一个获取js,一个获取图片jpg。如果使用HTTP1.1就是串行的,如果使用HTTP2.0就可以在一个连接里通过发送多个请求和回应,且不用按照顺序一一对应。

HTTP2.0将三个请求变成三个流,将数据分成帧,乱序发送到一个TCP连接中。

HTTP2.0解决了HTTP1.1队首阻塞问题,同时不需要通过HTTP1.x的pipeline机制用多条TCP连接实现并行请求与响应;减少了TCP连接数对服务器性能的影响,同时将页面的多个数据通过已给数据连接进行传输,加快页面的传输速度。

QUIC协议

HTTP2.0协议虽然增加了并发性,但还是有问题。它基于TCP协议,TCP协议在处理包是是有严格顺序的。

Google的QUIC基于UDP,看下它是怎么玩的:

机制一:自定义连接机制

TCP连接是通过四元组标识的,即源IP、源端口、目的IP、目的端口。一旦其中一个元素发生变化,需要断开重连。在移动互联情况下,当手机信号不稳定时,都会导致重连,即进行三次握手,导致时延。

基于UDP就可以在QUIC自己的逻辑里维护连接的机制,不再以四元组标识,而是以一个64位的随机数作为ID来标识。所以当IP或端口变化时,只要ID不变,就不需要重连。

机制二:自定义重传机制

TCP为了保证可靠性,使用序号和应答机制,来解决顺序问题和丢包问题。

任何一个序号的包都要在一定的时间内应答,否则超时重发。超时时间怎么定合适呢? 它是通过采样往返时间RTT不断调整。

但是TCP的超时采样不准确。QUIC的超时采样相对准确。

机制三:无阻塞的多路复用

同一条QUIC连接上可以创建多个stream,来发送多个HTTP请求。QUIIC基于UDP,一个连接上的多个stream之间没有依赖。假如stream2丢了一个UDP包,后面跟着stream3的一个UDP包,虽然stream2需要重传,但是stream3无需等待。

机制四:自定义流量控制

QUIC的通过window_update告诉对端它可以接收的字节数。QUIC的窗口适应自己的多路复用机制,不但在一个连接上控制窗口,还在一个连接中每个stream控制窗口。

小结

  • HTTP协议虽然很常用,也很复杂,重点记住GET、POST、PUT、DELETE这几个方法,以及重要的首部字段;
  • HTTP2.0通过头压缩、分帧、二进制编码、多路复用等技术提升性能;
  • QUIC协议通过基于UDP自定义的类似TCP的连接、重试、多路复用、流量控制技术,进一步提升性能。

思考题:

1. QUIC除了上面提到的四种机制,还有哪些机制?

2. 我们讲了如何基于HTTP浏览网页,如果要传输比较敏感的银行卡信息,怎么办?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值