面试准备

一句话概述HTTP:

  • HTTP通常跑在TCP/IP协议栈之上

  • 依靠IP协议实现寻址和路由

  • TCP协议实现可靠数据传输

  • DNS协议实现域名查找

  • SSL/TLS协议实现安全通信

HTTP特点:

  • 一种请求/响应模式的协议

  • 超文本传输协议,允许传输文本、图片、音频等,传输的类型由Content-Type标记

  • 无状态,HTTP请求不具备保存之前发送过的请求或响应的功能,每一次请求都是独立无关的

  • 1.1 版引入了持久连接(Connection: keep-alive)

 

HTTP缺点:

  • 文明传输(不加密),内容可能被窃听(报文不使用二进制数据,而是文本形式)

  • 无法验证报文的完整性,内容可能被篡改(接收方没有办法确认对方发送过来的数据在中间有没有被篡改)

  • 不验证通信方的身份,有可能遭遇伪装(服务器只要收到了请求就会返回一个响应)

  • 队头阻塞 (同一个TCP长连接中,前一个请求没有得到响应,后面的请求就会被阻塞。HTTP/2中的多路复用解决了这个问题)

队头阻塞解决方案:

1.一是减少请求数,比如合并脚本和样式表、将图片嵌入CSS代码;

2.同时发起多个长连接,用数量来解决质量的问题,不能滥用,并发量太大,服务器压力很大;

3.域名分片,还是用数量来解决质量的思路,多开几个域名指向同一台服务器,这样实际长连接的数量就上去了;

 

HTTPS与HTTP区别:

  • Http/1.1(下面简称h1)数据传输可以是文本或者二进制,Http/2(简称h2)使用ssl加密传输协议,只能传输二进制,可以防止内容被窃听的风险;

  • h2复用TCP链接(多路复用),一个链接可以同时发送多个请求,而且不用按顺序一一对应,避免队头阻塞;

  • 完全不同的连接方式,端口也不一样,h1是80,h2是443;

  • h1是无状态的,h2是基于ssl + http协议构成,可进行加密、身份认证,比h1安全;

 

https:

  • 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
  • 数据完整性:内容传输经过完整性校验
  • 身份认证:第三方无法伪造服务端(客户端)身份

HTTP请求方法:

  • GET: 获取资源 (幂等)

  • POST: 创建或更新资源(非幂等)

  • PUT:  创建或更新资源本身(幂等)

  • PATCH: 对资源进行局部更新(非幂等)

  • DELETE: 删除资源 (幂等)

 

GET和POST的区别:

  • 从缓存的角度上说,GET会被浏览器主动缓存下来,但是POST不会;

  • 从参数的角度上说,GET一般放在URL上传递参数,大小有限制;POST可以放在请求体里,大小本质上无限制;

  • 从幂等的角度上说,GET是幂等的,而POST不是;

  • 不过据我了解的,其实GET和POST本质上都是TCP连接;

HTTP状态码:

2xx:

200:请求成功,通常返回的数据中带有响应体

3xx:

301:永久重定向,最新的URI为响应报文首部的 Location 字段。浏览器默认会做缓存

302:临时重定向,浏览器不做缓存;

303:临时重定向,明确表示客户端应该使用GET方法获取资源;

307: 临时重定向,请求方法和实体都不允许变动

304:表示请求的资源在服务器上并未发送改变,告诉请求者可以使用缓存;

4xx:

400:请求报文中存在语法错误。例如 JSON字符串用 null 当做key

401:用户认证失败。

403:请求资源被拒绝,原因是:比如法律禁止、信息敏感。

404:请求资源未找到,表示没在服务器上找到相应的资源。

5xx:
500: 后端服务器出错;
501:请求的功能还不支持
503:服务器内部处于超负载状态或进行停机

 

HTTP中的幂等:

一个方法是不是幂等,其实就是判断一个方法重复执行多次,产生的效果是不是一样的,如果是幂等的话,它本质上意味着成功执行请求的结果和它的执行次数无关。只有「POST」「PATCH」是非幂等的,其它都是幂等操作

 

request headers相关:

Accept :

浏览器端可以接受的媒体类型:*/*  所有类型,(一般都发这个);Accept: text/html  代表浏览器可以接受服务器回发的类型为 text/html;服务器无法返回text/html类型的数据,服务器应该返回一个406错误

Accept-Encoding:gzip,deflate 

声明浏览器支持的编码类型 :服务器中返回gzip压缩的网页,浏览器会自动解压缩,请求时添加对应的头,表明自己接受压缩后的数据

Connection:  keep-alive

当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

If-Modified-Since:

把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。

如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中

If-None-Match:

If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能

例如: If-None-Match: W/"3119-1437038474000"

 

Content-Type:

1. application/x-www-form-urlencoded: POST 提交数据的方式,原生Form表单提交,如果不设置 enctype 属性,默认为application/x-www-form-urlencoded 方式提交数据。提交的表单数据会转换为键值对并按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码;

2. multipart/form-data:Form 表单的 enctype 设置为multipart/form-data, 是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思,只有使用了multipart/form-data,才能完整的传递文件数据。

3. application/json:告诉服务端消息主体是序列化后的 JSON 字符串;

4. 其他不常见就略过.......

 

referer:

该Referer会告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。可以做防盗链、防止恶意请求等

参考:https://juejin.cn/post/6844903830916694030

 

 

原文地址:https://www.cnblogs.com/vs1435/p/13094775.html