HTTP系列篇之请求与响应

Posted 前端面试修仙之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP系列篇之请求与响应相关的知识,希望对你有一定的参考价值。

1、HTTP 请求报文与响应报文格式

请求报文由请求行、请求头部、空行、请求数据组成。


http请求响应
  • 请求行由请求方法字段、URL字段和HTTP协议版本等3个字段组成,它们用空格分隔。

    「GET /index.html HTTP/1.1」

  • 请求头由关键字/值对组成,每行一对,关键字和值用英文冒号':'分隔。

    「User-Agent: 产生请求的浏览器类型。」

    「Accept:客户端可识别的内容类型列表。」

  • 最后一个请求头之后是一个空行,发送回车符或换行符,通知服务器以下不再有请求头

  • 请求数据在post方法中使用,与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

响应报文由状态行、响应头部、 空行、响应正文组成。

  • 状态行:包含HTTP版本、状态码、状态码的原因短语
  • 响应首部字段
  • 响应内容实体
  • 空行

「PS:HTTP-Version Status-Code Reason-Phrase CRLF」

「其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。」

「在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。」

2、HTTP/1.1 有什么优缺点

优点:

1.支持持久连接,在一个tcp连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。

2.允许客户端不用等待上一次请求结果的返回,就可以发出下一次请求,但服务器端必须按照接收请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。

4.提供了与身份认证,状态管理和cache缓存等机制相关的请求头和响应头。

缺点:

1.队头阻塞

在HTTP/1.1下,如果使用一个连接去请求一个域名下有很多资源,则必须经过发起请求-等等响应-再发起请求这样的过程。在请求应答的过程中,如果出现任何问题包括服务端响应、网络等问题,那么剩下的所有处理都会被阻塞在上次请求应答之后,这就是 “队头阻塞” 问题。即使浏览器客户端会对单个域名开启最多6个socket连接(这个也要跟具体的浏览器来区分比如Firefox是6个,Chrome则是24个)来分发请求,但是每个连接下仍然会受到 “队头阻塞” 的影响。

2.拥塞窗口

我们已知HTTP协议之下TCP的支撑,那么TCP成功的关键不是因为它高效而是最可靠的协议之一,这中间有个 “拥塞窗口” 的概念:在接收方确认数据包之前,发送方可以发出的TCP包的数量。比如 拥塞窗口 被指定为1 那么发送方发出1个数据包之后只有接收方确认了这个包,才能发送下一个。那么网络应该怎么才能知道 这个窗口的大小被指定多少合适呢,TCP还有一个概念叫 “慢启动”,形象化的比喻就好比在一间黑暗的屋子,当我们碰到桌子或者凳子的时候就会调整换个方向,慢启动也是这样的原理来调整拥塞窗口的大下。在这样的机制下,比如要发送请求一个大小为2M的html页面,在数据包设置为最大值1460字节,拥塞窗口为4,也就是一次发送5840字节的情况下,就需要9次往返才能传输整个页面。可以说HTTP/1.1是低效的利用了TCP。

3.臃肿的消息首部

HTTP消息首部被用来描述资源信息,或者是客户端和服务器的行为,自定义专有的首部可以加上 “X-” 前缀。另外cookie也属于消息首部的范畴。在HTTP/1.1中虽然提供gzip压缩机制,但是对于消息首部却无法压缩,虽然这些内容比正常请求的内容资源小的多,但也是不能被忽略的,如果计算上cookie里面的内容,几千个字节是很正常的。尤其是在低带宽或者高拥堵的链路下,就会发生类似 “体育馆效应” 的问题,成千上万人同一时间出现在同一地点,迅速耗尽无线蜂窝网络带宽。这个时候如果能压缩请求首部将其变得更小,那么就能缓解带宽压力,降低系统的总负载。

基于以上我们已知的影响HTTP性能的指标以及我们列出的HTTP/1.1协议下的特点,我们平时都是「怎么优化这些网络请求响应的呢」。

主要有以下几种方法:

「1、DNS查询优化」

「2、优化TCP连接」

「3、避免重定向」

「4、客户端缓存」

「5、压缩和代码极简化」

「6、避免阻塞 CSS/JS」

「7、图片优化」

---------------

「1、域名拆分」

「2、资源内联」

「3、资源合并」

「4、禁用cookie的域名」

「5、生成精灵图片」

3、相比 HTTP/1.1,HTTP/2 有哪些新特性

「1.多路复用」

HTTP2中的数据传输都是以最小单位帧去传输的,对某一个域名所有的请求和响应都在一个TCP连接上完成交互,而且数据没有大小的限制(突破了HTTP/1.1下面的单个包1460字节约1.5K的大小限制),只要带宽足够。而且这些发送的数据帧之间可以乱序,并行交错的请求和响应而且之间互不干扰,然后HTTP2内部再根据帧首部的流标识ID再进行重新组装。交互起来如下图所示:

4098122-18bc0b997756eb78.png

有了这样交错的传输带来的重要影响:

1、可以在一个套接字上交错地发送请求,请求之间互不影响;

2、可以在一个套接字上交错地发送响应,响应之间互不干扰;

所有请求和响应都无法相互阻塞。

3、消除不必要的延迟,从而减少页面加载的时间;

以上也就是常说的HTTP2的多路复用技术,通过客户端与服务端之间的一个socket连接通道,传输的内容不再必须是有序的,可以无序从上图就可以看出来,同时在HTTP/1.1下浏览器客户端受限于并发请求数(同一个域名并发数有限制)的问题也将迎刃而解。

「2.头部压缩」

HTTP/1.1下消息首部是不会被压缩的,但是在HTTP/2.2中这点被彻底改变了。利用了HPACK这种压缩的方式大大减少了网络传输过程中首部的体积大小。

假设客户端按照如下顺序发送请求首部:

Header1: dog

Header2: pig

Header3: cat

当客户端发起请求的时候,在首部数据块中会通过一张类似关系型数据表的形式存储,指定了首部内容和索引的对应关系,如下:

索引    首部名称      值

87       Header1     dog

88       Header2     pig

89       Header3     cat

当服务端收到这些请求的时候,也会同样创建一张类似这样的表。客户端发起下一次请求的时候,如果发现首部跟上次相同,此时客户端便可以直接发送首部索引值。如下:

87

88

89

服务器会查找先前的表格并把这些数字还原成索引对应的完整首部内容。HTTP2就是通过这样的方式对消息首部进行压缩的。在这种方式下节省了传输的内容大小提升了请求响应性能。

4、请简述 HTTPS 工作原理

HTTP协议由于是明文传送,所以存在三大风险:

「1、被窃听的风险:第三方可以截获并查看你的内容」

「2、被篡改的危险:第三方可以截获并修改你的内容」

「3、被冒充的风险:第三方可以伪装成通信方与你通信」

首先看看组成HTTPS的协议:HTTP协议和SSL/TLS协议。HTTP协议就不用讲了,而SSL/TLS就是负责加密解密等安全处理的模块,所以HTTPS的核心在SSL/TLS上面。整个通信如下:

1、浏览器发起往服务器的443端口发起请求,请求携带了浏览器支持的加密算法和哈希算法。

2、服务器收到请求,选择浏览器支持的加密算法和哈希算法。

3、服务器将数字证书返回给浏览器,这里的数字证书可以是向某个可靠机构申请的,也可以是自制的。

4、浏览器进入数字证书认证环节,这一部分是浏览器内置的TLS完成的

4.1 首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥。

4.2 用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性。签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。

4.3 浏览器生成一个随机数R,并使用网站公钥对R进行加密。

5、浏览器将加密的R传送给服务器。

6、服务器用自己的私钥解密得到R。

7、服务器以R为密钥使用了对称加密算法加密网页内容并传输给浏览器。

8、浏览器以R为密钥使用之前约定好的解密算法获取网页内容。

5、HTTP 和 HTTPS 的共同点和区别

HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

区别:

1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。



以上是关于HTTP系列篇之请求与响应的主要内容,如果未能解决你的问题,请参考以下文章

Linux从青铜到王者第十六篇:Linux网络基础第二篇之HTTP协议

重学springboot系列番外篇之RestTemplate

初入网络系列笔记HTTP请求和响应

网络协议系列之二:HTTP

网络协议系列之二:HTTP

网络协议系列之一:HTTP