android http 面试

概念

  • HTTP是应用层的协议,在TCP/IP协议接收到数据之后需要通过HTTP协议来解析才可以使用。

  • HTTP报文类型

    • 请求报文(request messaget)
    • 响应报文(response message)
  • HTTP报文结构

    • 首航:
      • 请求报文:包含方法(请求类型),URL和HTTP版本
      • 响应报文:包含HTTP版本,状态吗,简短的原因(可有可无)
    • 头部
      • 请求报文:保存一些键值对的属性,用冒号“:”分割。
      • 响应报文:保存一些键值对的属性,用冒号“:”分割。
    • 主体
      • 请求报文:主要保存POST类型的数据
      • 响应报文:保存页面要显示的结果
  • 请求报文首行方法包含:GET、HEAD、POST、PUT、DELETE等类型

  • 响应报首行状态码:

    • 1xx:信息性状态码;
    • 2xx:成功状态码,如200表示成功;
    • 3xx:重定向状态码,如301表示重定向;
    • 4xx:客户端错误状态码,如404表示没有找到请求的资源;
    • 5xx:服务端错误状态码,如500表示内部错误。
    • 另外,DNS协议的作用是将域名解析为IP。它作用在应用层。
  • http 缓存 Cache-Control

Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

  • no-cache:指示请求或响应消息不能缓存,实际上是可以存储在本地缓存区中的,只是在与原始服务器进行新鲜度验证之前,缓存不能将其提供给客户端使用。
  • no-store:缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会包含敏感信息。
  • max-age:缓存无法返回缓存时间长于max-age规定秒的文档,若不超规定秒浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。若同时还发送了max-stale指令,则使用期可能会超过其过期时间。
  • min-fresh:至少在未来规定秒内文档要保持新鲜,接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象。
  • max-stale:指示客户端可以接收过期响应消息,如果指定max-stale消息的值,那么客户端可以接收过期但在指定值之内的响应消息。
  • only-if-cached:只有当缓存中有副本存在时,客户端才会获得一份副本。
  • Public:指示响应可被任何缓存区缓存,可以用缓存内容回应任何用户。
  • Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理,只能用缓存内容回应先前请求该内容的那个用户。

在android中使用

参考:https://www.cnblogs.com/scetopcsa/p/3986736.html

  • HttpURLConnection
  • HttpClient

两种的实现方式为:

  1. Android客户端向服务器发出请求。
  2. 服务端接收请求并响应。
  3. 服务端返回数据给客户端。

HttpURLConnection

  • 继承于URLConnection类
  • 通过 openConection 方法创建,
  • 默认Get请求
  • 设置连接超时时间
  • 设置读取超时时间
  • post设置
  • 设置是否允许输出
  • 设置是否使用缓存
  • 设置请求方式
  • 是否自动执行http重定向

HttpClient

  • 易用性
  • 灵活性

面试题

HTTP协议的主要特点

  • 支持客户/服务器模式
  • 简单快速:客户向服务端请求服务时,只需传送请求方式和路径。
  • 灵活:允许传输任意类型的数据对象。由Content-Type加以标记。
  • 无连接:每次响应一个请求,响应完成以后就断开连接。
  • 无状态:服务器不保存浏览器的任何信息。每次提交的请求之间没有关联。

http非持续性和持续性

  • HTTP1.0默认非持续性;HTTP1.1默认持续性
  • 持续性: 浏览器和服务器建立TCP连接后,可以请求多个对象
  • 非持续性: 浏览器和服务器建立TCP连接后,只能请求一个对象

HTTP1.0、HTTP1.1 和 HTTP2.0 的区别

  • HTTP1.0和HTTP1.1的一些区别

    1. 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
    2. 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
    3. 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
    4. Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
    5. 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
  • 2012年google如一声惊雷提出了SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性,具体如下:

    1. 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
    2. 请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。
    3. header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
    4. 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
    5. 服务端推送(server push),采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。SPDY构成图:
      android http 面试
  • HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的),但是,HTTP2.0 跟 SPDY 仍有不同的地方,如下:

    1. HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
    2. HTTP2.0 消息头的压缩算法采用 HPACK http://http2.github.io/http2-spec/compression.html,而非 SPDY 采用的 DEFLATE https://blog.****.net/gohuge/article/details/80652274

管道机制

HTTP 1.1 引入了管道机制(Pipelining),即客户端可通过同一个TCP连接同时发送多个请求。如果客户端需要请求两个资源,以前的做法是在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求;而管道机制则允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。

多路复用

  • 然 HTTP 1.1 默认启用长TCP连接,但所有的请求-响应都是按序进行的(这里的长连接可理解成半双工协议。即便是HTTP 1.1引入了管道机制,也是如此)。复用同一个TCP连接期间,即便是通过管道同时发送了多个请求,服务端也是按请求的顺序依次给出响应的;而客户端在未收到之前所发出所有请求的响应之前,将会阻塞后面的请求(排队等待),这称为"队头堵塞"(Head-of-line blocking)。

  • TTP/2复用TCP连接则不同,虽然依然遵循请求-响应模式,但客户端发送多个请求和服务端给出多个响应的顺序不受限制,这样既避免了"队头堵塞",又能更快获取响应。在复用同一个TCP连接时,服务器同时(或先后)收到了A、B两个请求,先回应A请求,但由于处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分。HTTP/2长连接可以理解成全双工的协议。

android http 面试

Http https区别

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。

Http位于TCP/IP模型中的第几层?为什么说Http是可靠的数据传输协议?

在顶层,因为是tcp 就是可靠的,http 是基于tcp的

HTTP链接的特点

  • 支持客户/服务器模式
  • 简单快速:客户向服务端请求服务时,只需传送请求方式和路径。
  • 灵活:允许传输任意类型的数据对象。由Content-Type加以标记。
  • 无连接:每次响应一个请求,响应完成以后就断开连接。
  • 无状态:服务器不保存浏览器的任何信息。每次提交的请求之间没有关联。

TCP和UDP的区别

Socket建立网络连接的步骤

Tcp/IP三次握手,四次挥手

GET方式和POST方式区别

  • Post一般用于更新或者添加资源信息 Get一般用于查询操作,而且应该是安全和幂等的
  • Post更加安全 Get会把请求的信息放到URL的后面
  • Post传输量一般无大小限制 Get不能大于2KB
  • Post执行效率低 Get执行效率略高

HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?

  • HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
  • HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
  • HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;

服务器推送到底是什么?

  • 服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。具体如下:
  • 普通的客户端请求过程:
    android http 面试
  • 服务端推送的过
    android http 面试