1、HTTP--应用层协议

  1. 是超文本传输协议,用于从www服务器传输超文本到本地浏览器的传输协议。
  2. 传输的数据是没有加密的,是明文。

①请求/响应报文

由请求行、请求头、请求数据组成
图片说明

②通用首部字段(请求报文与响应报文都会使用的首部字段)

  • Date:创建报文时间
  • Connection:连接的管理(Connection: keep-alive/close表示简历长连接还是短连接,是否关闭连接)
  • Cache-Control:缓存的控制
  • Transfer-Encoding:报文主体的传输编码方式

③请求首部字段(请求报文会使用的首部字段)

  • Host:请求资源所在服务器(主机和端口号,它通常从HTTP URL中提取出来的)
  • Accept:可处理的媒体类型(如果服务器无法返回该类型的数据,服务器应该返回一个406错误(not acceptable))
  • Accept-Charset:可接收的字符集
  • Accept-Encoding:可接受的内容编码(通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate))
  • Accept-Language:可接受的自然语言

    ④响应首部字段(响应报文会使用的首部字段)

  • Accept-Ranges:可接受的字节范围
  • Location:令客户端重新定向到的URI
  • Server:HTTP服务器的安装信息

    ⑤实体首部字段(请求报文与响应报文的的实体部分使用的首部字段)

  • Allow:资源可支持的HTTP方法
  • Content-Type:实体主类的类型
  • Content-Encoding:实体主体适用的编码方式
  • Content-Language:实体主体的自然语言
  • Content-Length:实体主体的的字节数
  • Content-Range:实体主体的位置范围,一般用于发出部分请求时使用

⑥常用的HTTP方法有哪些?

  • GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
  • POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
  • PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。(put自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不用)
  • HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
  • DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。(不带验证机制)
  • OPTIONS:查询相应URI支持的HTTP方法。
  • PATCH:对资源进行部分修改(PUT也可以用于修改资源,但只能完全替代,PATCH允许部分修改)
  • CONNECT:要求在与代理服务器通信时建立隧道,使用SSL和TLS协议把通信内容加密后经网络隧道传输
  • TRACE:追踪路径(通常不用,易收到XST攻击)

补充一点小知识:URL和URI的区别

URI---统一资源标识符
用来唯一识别一个资源(web上可用的每种资源都是通过URI定位的)
URL---统一资源定位器
是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何定位这个资源。

⑦ HTTP 状态码

---1XX(临时响应):表示临时响应并需要请求者继续执行操作的状态代码

  • 100(继续):请求者应当继续提出请求
  • 101(切换协议):请求者要求服务器切换协议

---2XX(成功):表示成功处理了请求的状态代码

  • 200(成功)
  • 201(已创建):请求成功并且服务器创建了新资源
  • 202(已接受):服务器已接受请求,但尚未处理
  • 203(非授权信息):服务器已成功处理了请求,但返回信息可能来自另一来源
  • 204(无内容):服务器成功处理了请求,但没有返回任何内容
  • 205(重置内容):服务器成功处理了请求,但没有返回内容,要求请求者重置内容
  • 206(范围请求):表示客户端进行了范围请求,响应报文包含由Content-Range指定范围的实体内容

---3XX(重定向):表示要完成请求,需要进一步操作

  • 300(多种选择):针对请求,服务器可执行多种操作;
  • 301(永久移动):请求的网页已永久移动到新位置;
  • 302(临时移动):服务器目前从不同的位置的网页响应请求,用get请求;
  • 304(未修改):自从上次请求后,请求的网页未修改过(对应于If-Match,If-Modified,If-Node-Match,If-Range,If-Unmodified-S***rong>

---4XX(请求错误):表示请求可能出错,妨碍了服务器的处理

  • 400(错误请求):服务器不理解请求的语法;
  • 401(未授权):请求要求身份验证;
  • 403(禁止):服务器禁止请求;
  • 404(未找到):服务器找不到请求的网页;

---5XX(服务器错误):表示服务器在尝试处理请求时发生内部错误;

  • 500(服务器内部错误):服务器运到错误,无法完成请求;
  • 502(错误网关):服务器作为网关或代理,从上游服务器收到无效响应;
  • 503(服务不可用):服务器目前无法使用;
  • 504(网关超时):服务器作为网关或代理,但是没有及时从上游服务器收到请求。

⑧HTTP缺点

  1. 使用明文进行通信,内容可能会被窃听;
  2. 不验证通信方的身份,通信方的身份有可能遭遇伪装;
  3. 无法证明报文的完整性,报文有可能遭篡改。

⑨Http缓存

1、判断是否过期->强缓存/2
2、 if-None-Match到浏览器,判断是否和ETag相同-》协商缓存/3
3、if-Not-Defined
强缓存:expires和cache-control
协商缓存:ETag和if-none-Match

2、 HTTPS

https是由http和ssl协议来对http歇息传输的数据进行加密处理的。比http的安全性高。
用户与SSL进行https连接,SSL和服务端进行http连接

HTTPS的工作原理

  1. 客户端通过https通信时的步骤:
  2. 客户使用https的url访问服务器,要求服务器建立ssl连接。
  3. 服务器接收请求之后,把证书(包含公钥)传输给客户。
  4. 客户端和服务器端开始协商ssl链接的安全等级(加密等级)
  5. 协商完成后,客户端浏览器建立会话秘钥,并用网站的公钥加密会话秘钥,传输给服务器端。
  6. 服务器端通过自己的私钥解密出会话秘钥
  7. 服务器通过会话秘钥加密

① HTTPS的优点

  1. 可以认证用户和服务器,确保服务器发送到正确的客户机和服务器
  2. 用了ssl协议,比http协议安全,可以防止数据在传输过程中不被窃取、改变、确保数据的完整性。

② HTTPS的缺点

  1. 握手阶段比较费时,因为还多ssl的连接
  2. https没有http高效,增加数据开销
  3. SSL证书要钱
  4. SSL证书要绑定IP。消耗大。

http的风险:

窃听风险(eavesdropping):第三方可以获知通信内容。
篡改风险(tampering):第三方可以修改通信内容。
冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS 协议是为了解决这三大风险而设计的,希望达到:

所有信息都是加密传播,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备身份证书,防止身份被冒充。

③ HTTPS加密方式

  1. 使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key,从而保证安全性;
  2. 获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率。

3、HTTP和HTTPS区别

  1. 端口不同,HTTP是80,HTTPS是443
  2. http是超文本传输协议,是明文,没有加密。https是有安全性的ssl加密传输协议
  3. https需要ca证书,费用高。
    • ca是数字证书认证机构。服务器的运营人员向ca提出公开密钥的申请,ca判别身份后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入证书中绑定在一起。
    • 进行https通信时,服务器会把证书发给客户端,客户端取得其中的公开密钥之后,就使用数字签名进行验证,如果验证通过,就可以开始通信。
  4. http连接无状态。https可以进行身份认证,比http协议安全。

4、 面试常考题

1.(必考)浏览器输入一个地址url。到页面展示中间经历了哪些东西?

  1. 浏览器输入一个url地址,检查url地址是否合法
  2. 查看是否有缓存,(浏览器缓存->系统缓存->路由器缓存),如果有则直接显示,没有则继续
  3. 查询DNS服务器,得到服务器的ip地址(DNS解析)
  4. 发送http请求前先发送tcp请求(三次握手)
  5. 握手成功后,浏览器向服务器发送http请求
  6. 服务器收到请求,返回相应的数据
  7. 浏览器收到http响应之后根据这个html数据构建dom树,在本地窗口渲染并显示网页。且如果此响应可以缓存,则存入缓存。
  8. 当浏览器页面被关闭时,终止HTTP会话并关闭连接。

2.HTTP中GET与POST的区别?

  1. GET从指定的资源请求数据,POST向指定的资源提交要被处理的数据;
  2. GET请求有长度限制,而POST没有;
  3. GET的安全性较差,而POST比GET更安全(为什么不安全?因为get的数据会在url显示,会被暴露)
  4. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留;
  5. GET请求能被缓存、收藏为书签,而POST不能;
  6. GET请求只能进行url编码,而POST支持多种编码方式
  7. GET数据在URL中对所有人都是可见的,而POST数据不会显示在URL中;
  8. GET和POST本质上就是TCP连接,但GET产生一个TCP数据包,而POST产生两个TCP数据包。(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)。而对于POST请求。浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

3.什么是Http协议无状态协议?怎么解决Http协议无状态协议?

  • 无状态协议对于事务处理没有记忆能力。当客户端一次HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个”老用户“。
  • 可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。

4. HTTP优化方案

详细请看:https://blog.csdn.net/gao_yu_long/article/details/79754541
负载均衡技术通过设置虚拟服务器IP(VIP),将后端多台真实服务器的应用资源虚拟成一台高性能的应用服务器,通过负载均衡算法,将大量来自客户端的应用请求分配到后端的服务器进行处理。负载均衡设备持续的对服务器上的应用状态进行检查,并自动对无效的应用服务器进行隔离,实现了一个简单、扩展性强、可靠性高的应用解决方案。解决了单台服务器处理性能不足,扩展性不够,可靠性较低的问题。

  1. TCP连接复用:TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能;而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。
  2. 内容缓存:将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
  3. 压缩:将文本数据进行压缩,减少带宽
  4. SSL加速(SSL Acceleration):使用SSL协议对HTTP协议进行加密,在通道内加密并加速
  5. TCP缓冲:通过采用TCP缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。
    详细请看:https://blog.csdn.net/gao_yu_long/article/details/79754541

5.HTTP 1.0, 1.1, 2.0的区别

长短连接

  • HTTP1.1之后默认支持长连接,如果要断开连接,需要使用Connection:close; HTTP1.1节省带宽,默认只发送header,如果服务器认为客户端有权限进行连接请求服务器,则返回100, 否则返回401.如果客户端接收到100, 就把body传递给服务器。
  • HTTP1.1之前默认短连接,如果需要长连接,要用connection:keep-alive;

HTTP1.1版本新特性

  • 默认持久连接。节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求
  • 管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应
  • 断点续传,实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输。

http2.0

  • http2.0是二进制
  • HTTP 2. 0多路复用(一个连接可以处理多个请求)
  • HTTP2.0 支持header压缩,在网络上传输会更快,要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输
  • 服务器推送:我们对HTTP2.0的服务器进行请求数据的时候, 服务器会顺便把一些客户端需要的资源一起推送到客户端,避免客户端再次创建连接发送请求到服务器获取

6.返回304状态码的流程,属于哪一种缓存机制

交互流程

1、客户端第一次请求服务端的某个地址时,服务端会在响应时携带 ETag 与 Last-Modified 响应头,
2、客户端下次再发送同一地址的请求时,会携带 If-None-Match 与 If-Modified-Since 请求头,而 If-None-Match 就是 ETag 的值,If-Modified-Since 就是 Last-Modified 的值,
3、这时服务端在接收请求后会获取请求头中的这两个值,然后进行比对,若资源没有更新,则响应 304 状态码,表示请求的资源没有更新,客户端可以从自己的缓存里获取,
4、若资源已更新,则响应 200 状态码,同第一次请求一样,又会在响应时携带新的 ETag 与 Last-Modified 响应头,之后同上逻辑循环。

ETag和If-None-Match

  • ETag 是属于 HTTP 1.1 属性,它是由服务器生成返回给前端,说白了,ETag 一般为资源的哈希值,即 ETag 就是服务器生成的一个标记,用来标识资源是否有变化的,且 ETag 的优先级高于 Last-Modified。

  • Etag:资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。

  • If-None-Match:当缓存过期时,发现资源具有Etage声明,则在请求头带上If-None-Match(值就是Etag)。服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。