计算机网络面试——HTTP篇

x33g5p2x  于2022-03-14 转载在 其他  
字(2.7k)|赞(0)|评价(0)|浏览(440)

一、概况
http是超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,默认情况下使用80端口。它使用tcp作为传输层协议,保证了数据传输的可靠性。
http是一个无状态的协议,http服务器不会保证关于用户的任何信息。
http协议存在两种连接,一种是持续连接, 另一种是非持续连接非持续连接是服务器必须为每一个请求建立和维护一个全新的连接。持续连接下,TCP连接默认不关闭,可以被多次请求复用。采用持续连接的好处是:避免每次建立TCP连接三次握手所花费的时间。在HTTP1.0以前使用的是非持续连接HTTP1.1以后默认采用的是持续的连接。目前对于同一个域,大多数浏览器支持同时建立6持续连接
二、HTTP请求报文
HTTP报文存在两种,一种是请求报文,另一种是响应报文。
HTTP请求报文的格式如下:

GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

http请求报文的第一行叫做请求行,后面的行叫做首部行。
请求行包含三个字段:方法字段,url字段和http版本字段
方法字段可以有几种不同的取值:GET, POST, HEAD, PUT和DELETE。一般get方法只被用来向服务器获取数据。POST方法被用来向服务器提交数据,通常会造成服务器资源的修改。HEAD请求和GET方法类似,但是返回的相应中,不包含请求对象,只是请求头。PUT方法用于上传文件到服务器,DELETE方法用于删除服务器上的对象。虽然请求方法有很多,但是更多表达式一种语义上的区别,并不是说POST能做的事情,GET就不可以做。
三、HTTP响应报文
http响应报文的格式如下所示

HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
  <body>Hello World</body>
</html>

http响应报文的第一行叫做状态行,后面的行是首部行,最后是实体主体。
状态行包含三个字段:协议版本字段状态码对应的状态信息
实体部分是报文的主要内容,它包含了所请求的对象。
常见的状态有:

1xx: 表示请求已经接受,仍然可以继续处理。
200:表示请求成功。
301:表示资源的永久重定向。
302:表示资源的临时重定向。
304:表示客户端资源是最新的,无需给出最新的响应。
400: 服务器不理解客户端请求的方法。
401:表示客户端需要认证。
403:表示服务器理解客户端请求,但是拒绝处理该请求。
404:请求资源不存在。
405:Method Not Allowed,http请求方法不允许。
500:服务器内部错误。
502:bad gateway,表示一个internet上一台服务器接受另一台服务器的无效请求,也就是网关错误。

四、首部行
首部可以分为四种首部,请求首部,响应首部,通用首部和实体首部。通用首部和实体首部在请求报文和响应报文中都可以设置,区别在于请求首部和响应首部。
常见的请求首部有

Accept: 可接收媒体资源的类型。
Accept-charset: 可接收的字符集。
Host:请求的主机名。

常见的响应首部:

Etag资源的匹配信息,
Location:客户端重定向的uri。

常见的通用首部

Cache-control: 控制缓存策略
Connection:管理持久连接。

常见的实体首部:

Content-Length: 实体主体的大小。
Expires: 实体主体的过期时间。
Last-Modified: 资源最后修改的时间。

五、HTTP1.1的缺点
HTTP1.1采用的是持久连接, 也就是多个HTTP请求可以共用一个TCP连接。此时就会出现一个问题,如果前面的请求没有完成,后面的请求就必须等待。如果前面的请求阻塞,就会形成对头阻塞的情况。为了避免这个问题,我们经常采用的措施是:1、减少请求的数量2、开启多个持久连接。这也就是雪碧图多个脚本合并的原因。
六、HTTP2.0
2009年,谷歌公开了自行研发的SPDY协议,主要解决HTTP/1.1效率不高的问题。这个协议在Chrome浏览器上证明可行以后,就被当做HTTP2.0的基础,主要都在HTTP2.0中得到继承。2015年,HTTP2.0发布。
HTTP/2中的主要新的特性
6.1、二进制协议
http2.0是一个二进制协议。在http1.1版本中,报文的头信息必须是文本(ASCLL),报文的数据体可以是文本也可以是二进制。HTTP2.0则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为,可以分为头信息帧数据帧
帧的概念是实现多路复用的基础。
6.2、多路复用:
http/2实现了多路复用,http2.0依然采用复用TCP连接, 但是在一个连接里,客户端和服务器都可以同时发送多个请求和回应,而且不用按照顺序一一发送,这样就避免了对头阻塞的问题。
6.3、头信息压缩
http2.0实现头信息压缩,由于http1.0协议不带有状态,每次请求都必须携带所有信息,导致存在很多的信息都是重复的,比如cookieuser agent,一模一样的内容,每次请求都必须携带上,这样浪费很多的宽带,也影响速度。
http2.0对这一点进行了优化,引入头部信息压缩。一方面,头信息可以使用gzip压缩或者compress压缩后再发送,另一方面,客户端和服务端共同维护一个头信息表,所有的字段都会存入表中,生成一个索引,以后就不用发送相同的字段了,只发送索引号就行了,这样就能提高速度了。
6.4、服务器推送
http2.0允许服务器未经允许向客户端推送资源,这就叫服务器推送。使用服务器推送,提前给客户端推送必要的资源,这样就可以减少一些延迟时间。这里需要注意的是http2.0下服务器推送的是静态资源,和websocket等方式向客户端推送计时数据是不一样的。
七、HTTP2.0协议的缺点
因为HTTP2.0使用多路复用技术,一般来说在同一个域名下只需要使用一个TCP连接,由于多个数据流使用同一个tcp连接,遵守同一个流量控制和拥塞控制。只要数据流遭遇到拥塞就会导致后面的数据无法发送。HTTP2.0出现这样的问题的原因在于TCP协议的问题。

相关文章