区块链技术博客
www.b2bchain.cn

Http 速查求职学习资料

D0b2wT.gif

本文介绍了Http 速查求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

Android 面试进阶指南目录

计算机网络

  1. http 速查

Android

  1. 唠唠任务栈,返回栈和启动模式
  2. 唠唠 Activity 的生命周期
  3. 扒一扒 Context
  4. 为什么不能使用 Application Context 显示 Dialog?
  5. OOM 可以被 try catch 吗?
  6. Activity.finish() 之后十秒才回调 onDestroy ?

本文永久更新地址: https://blog.csdn.net/sunluyao_/article/details/109267554

可能你在面试中不一定会遇到 http 相关的问题,但这的确应该是每一个程序员的基本功。如果这些基本概念你都答错了,一定不会给面试官留下一个好印象。

分享一篇躺在我本地文档库很久的笔记,内容总结自 《图解 HTTP》、《图解 TCP/IP》、《HTTP 权威指南》 等等,大家可以把本文当做 http 的复习大纲,也可以当做一个速查笔记。目录如下:

  • 什么是 HTTP ?
  • HTTP 版本
  • URI、URL、URN
  • 报文格式
  • 请求方法
  • 状态码
  • 报文首部

什么是 HTTP ?

HTTP(HyperText Transfer Protocol,超文本传输协议) 是客户端和服务器端之间的一种数据传输协议。

协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的 CPU 以及不同的操作系统组成的计算器之间,只要遵循相同的协议就能够实现通信。

HTTP 属于 OSI 参考模型中的 应用层协议 。其他应用层协议还有 SMTPFTPTELNET/SSHSNMP

HTTP 通常被译为超文本传输协议,但这种译法并不严谨。严谨的译名应该为 “超文本转移协议”。但是前移译法已经约定俗成。

HTTP 版本

  • HTTP/0.9

    HTTP 的 1991 原型版本称为 HTTP/0.9 。这个协议有很多严重的设计缺陷,只用于和老客户端的交互。HTTP/0.9 只支持 GET 方法,不支持多媒体内容的 MIME 类型、各种 HTTP 首部,或者版本号。HTTP/0.9 定义的初衷是为了获取简单的 HTML ,很快就被 HTTP/1.0 代替了。

  • HTTP/1.0

    1.0 是第一个得到广泛使用的 HTTP 版本。HTTP/1.0 添加了版本号、各种 HTTP 首部、一些额外的方法,以及对多媒体对象的处理。

    其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

    但是 1.0 版本的工作方式是每次 TCP 连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立 TCP 连接,就是不支持 keep-alive 。

  • HTTP/1.1

    1.1 是目前主流的 HTTP 协议版本,重点校正了 HTTP 设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。

    最大的变化就是引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive ,一个 TCP 连接允许多个 HTTP 请求。

  • HTTP/2.0

    HTTP/2.0 是 HTTP 协议自 1999 年 HTTP/1.1 发布后的首个更新,主要基于 SPDY 协议,在不改动HTTP语义、方法、状态码、URI 及首部字段的情况下,大幅度提高了Web 性能 。它具有如下特点:

    • 二进制传输。HTTP/1.x 版本采用的是文本格式
    • 多路复用。解决旧版本的对头阻塞(Head of line blocking) 问题,一个 TCP 连接中存在多个流,即可以发送多个请求
    • header 压缩。减小 header 大小
    • 服务器 Push。服务端可以在客户端某个请求后,主动推送其他资源

参考资料 : 【快速入门系列】一篇文章让你入门HTTP2.0](https://segmentfault.com/a/1190000016656529)

URI、URL、URN

URI,Uniform Resource Identifier ,统一资源标识符 。用来唯一标识并定位资源。它是一个通用的概念,由两个主要的子集 URL 和 URN 构成。

URL,Uniform Resource Locator ,统一资源定位符 。URL 描述了一台特定服务器上某资源的特定位置。我们常见的各种网址就是典型的 URL ,一般遵循通用语法:

协议类型://服务器地址[:端口号]/路径

以我的个人博客的关于页面为例,https://luyao.tech/s/me ,协议类型是 http ,服务器地址是 luyao.tech ,资源路径是 /s/me

URN , Uniform Resource Name , 统一资源名 。与 URL 使用资源路径定位不同,URN 使用特定内容的唯一名称来定位,与资源位置无关,这样就可以将资源四处搬移。但是从 URL 转换到 URN 是一项巨大的工程,目前为止并没有多大进展。

报文格式

请求报文

<method> <request-URL> <version> <headers>  <entity-body>

Http 速查

请求报文

响应报文

<version> <status> <reason-phase> <headers>  <entity-body>

Http 速查

响应报文

请求方法

GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。不修改服务器数据。支持 1.0、1.1 版本 。

POST 方法用来向服务器传输数据,会增加或者修改服务器数据。要传输的数据写在 body 中。支持 1.0、1.1 版本 。

PUT 方法会向服务器写入文档。它的语义就是让服务器用请求的 body 部分来创建一个由所请求的 URL 命名的新文档,如果已存在,就代替它。支持 1.0、1.1 版本 。

HEAD 方法与 GET 类似,但是服务器只会返回首部,不会返回 body 。支持 1.0、1.1 版本 。 可以:

  • 在不获取资源的情况下了解资源的情况(比如,判断其类型)
  • 通过查看响应中的状态码,查看资源是否存在
  • 通过查看首部,测试资源是否被修改

DELETE 方法用于删除指定资源。支持 1.0、1.1 版本 。

OPTIONS 方法请求 Web 服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。仅支持 1.1 版本 。

TRACE 方法可以让服务器将之前的请求通信返回给客户端。客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改/篡改的。主要用于诊断。仅支持 1.1 版本 。

CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容
加密后经网络隧道传输。仅支持 1.1 版本 。

状态码

1xx ,信息性状态码

状态码 原因短语 含义
100 Continue 收到了请求的起始部分,客户端应该继续请求
101 Switching Protocols 服务端正根据客户端的指示将协议切换成 Update 首部列出的协议

2xx,成功状态码

状态码 原因短语 含义
200 OK 服务器已成功处理请求
201 Created 对那些要服务器创建对象的请求来说,资源已创建完毕
202 Accepted 请求已接受,但服务器尚未处理
203 Non-Authoritative Information 服务器已将事务成功处理,只是实体首部包含的信息不是来原始服务器,而是来自资源的副本
204 No Content 响应报文包含一些首部和一个状态行,但不包含实体的主体内容
205 Reset Content 主要用于浏览器,意思是浏览器应该重置当前页面上的所有 HTML 表单
206 Partial Content 部分请求成功

206 表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

3xx,重定向状态码

状态码 原因短语 含义
300 Multiple Choices 客户端请求一个实际指向多个资源的 URL 时会返回这个状态码,这个代码和一个选项表一起返回,供用户进行选择
301 Moved Permanently 永久性重定向。请求的 URL 已移走,响应的 Location 首部应该包含资源现在的 URL
302 Found 临时重定向。客户端应该使用 Location 首部给出的 URL 来临时定位资源,将来的请求仍应使用老的 URL
303 See Other 由于请求对应的资源存在着另一个 URL,应使用 GET 方法定向获取请求的资源
304 Not Modified 客户端发送附带条件的请求时,服务器资源未改变,可直接使用客户端未过期的缓存
305 Use Proxy 必须通过代理来访问资源,代理的位置由 Location 首部给出
307 Temporary Redirect 临时重定向,与 302 有相同的含义

304 中附带条件的请求是指采用 GET 方法的请求报文中包含 If-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-Since 中任一首部。

对于 HTTP/1.1 客户端,用 307 状态码取代 302 状态码进行临时重定向,307 会遵照浏览器标准,不会从 POST 变成 GET。这样服务器可以将 302 状态码保留起来,为 HTTP/1.0 客户端使用。很多现存的浏览器会将 302 响应视为 303 响应,并且使用 GET 方法访问在 Location 中规定的 URL,而无视原来的请求方法。

4xx,客户端错误状态码

状态码 原因短语 含义
400 Bad Request 请求报文中存在语法错误
401 Unauthorized 在客户端获取资源访问权之前,需要进行身份认证。响应中必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询用户信息
402 Payment Required 未使用,预留
403 Forbidden 请求被服务器拒绝
404 Not Found 服务器无法找到请求的资源
405 Method Not Allowed 发起的请求中带有所请求的 URL 不支持的方法。响应中应包含 Allow 首部,以告诉客户端请求的资源可以使用哪些方法
406 Not Acceptable 客户端可以指定一些参数爱说明希望接受哪些类型的实体,服务器没有资源与客户端可接受的 URL 相匹配时使用此状态码
407 Proxy Authentication Required 与 401 类似,但用于需要进行资源认证的代理服务器
408 Request Timeout 如果客户端完成其请求时花费的时间太长,服务器可以返回此状态码关闭连接
409 Conflict 请求可能在资源上引发一些冲突。响应中应该包含描述冲突的主体
410 Gone 与 404 类似,只是服务器曾经拥有过此资源
411 Length Required 服务器要求请求报文中包含 Content-Length 首部
412 Precondition Failed 客户端发起了条件请求,且其中一个条件失败了的时候使用
413 Request Enity Too Large 客户端发送的实体主体部分比服务器能够或者希望处理的要大
414 Request URI Too Long 客户端诉所发请求中的 URL 比服务器能够或者希望处理的要长
415 Unsupported Media Type 服务器无法理解或无法支持客户端所发实体的内容类型
416 Requested Range Not Satisfiable 请求报文所请求的是指定资源的某个范围,而此范围无效或无法满足
417 Expectation Failed 请求报文的 Expect 首部包含了一个期望,但服务器无法满足此期望

5xx,服务器错误状态码

状态码 原因短语 含义
500 Internal Server Error 服务器在执行请求时发生了错误
501 Not Implemented 客户端发起的请求超出了服务器的能力范围(比如不支持的请求方法)
502 Bad Gateway 作为代理或网关使用的服务器遇到了来自响应链中上游的无效响应
503 Service Unavailable 服务器暂时无法为请求提供服务。如果事先得知恢复需要的时间,最好写入 Retry-After 首部返回给客户端
504 Gateway Timeout 与 408 类似,只是这里的响应来自一个网关或者代理,它们在等待另一服务器对其请求进行响应时超时了
505 HTTP Version Not Supported 服务器收到的请求使用了它无法或不愿支持的协议版本

报文首部

HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔。

首部字段名: 字段值

HTTP 首部字段根据实际用途被分为以下 4 种类型:通用首部字段请求首部字段响应首部字段实体首部字段

通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

Cache-Control

控制缓存的工作机制。

指令 含义
public 其他用户也可以利用缓存
private 对特定用户提供资源缓存服务
no-cache 并不是不缓存,缓存会向源服务器进行有效期确认后处理资源,防止从缓存中返回过期的资源
no-store 不缓存,暗示请求或响应中包含机密信息
max-age = [秒] 当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。
min-fresh = [秒] 要求缓存服务器返回至少还未过指定时间的缓存资源。当指定 min-fresh 为 60 秒后,过了 60 秒的资源都无法作为响应返回了
max-stale = [秒] 如果指令未指定参数值,那么无论经过多久,客户端都会接收响应; 如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。
only-if-cached 只有缓存中有副本存在时,客户端才会获取一份副本
must-revalidate 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效
proxy-revalidate 要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性
no-transform 无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。可以防止缓存或代理压缩图片等类似操作

Connection

Connection 首部有两个作用,控制不再转发给代理的首部字段和管理持久连接。

应用程序收到带有 Connection 首部的报文后,会删除报文中所有在 Connection 首部列表中出现过的首部。主要用于代理网络环境,这样服务器或其他代理就可以指定不应传递的逐跳首部了。

HTTP/1.1 版本的默认连接都是持久连接。为此, 客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close

HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。为此, 如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定 Connection 首部字段的值为 Keep-Alive

Date

创建 HTTP 报文的日期和时间

Pragma

Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。规范定义的形式唯一,如下所示 :

Pragma: no-cache

表示客户端要求所有的中间服务器不返回缓存的资源。

Trailer

如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以使用 Trailer 列出位于报文末端的首部。

Transfer-Encoding

规定了传输报文主体时采用的编码方式。HTTP/1.1 的传输编码方式仅对分块传输编码有效。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Cache-Control: public, max-age=604800
Content-Type: text/javascript; charset=utf-8
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive
cf0 ←16进制(10进制为3312)
…3312字节分块数据…
392 ←16进制(10进制为914)
…914字节分块数据…
0

分别被分成 3312 字节和 914 字节大小的分块数据 。

Android 面试进阶指南目录

计算机网络

  1. http 速查

Android

  1. 唠唠任务栈,返回栈和启动模式
  2. 唠唠 Activity 的生命周期
  3. 扒一扒 Context
  4. 为什么不能使用 Application Context 显示 Dialog?
  5. OOM 可以被 try catch 吗?
  6. Activity.finish() 之后十秒才回调 onDestroy ?

本文永久更新地址: https://blog.csdn.net/sunluyao_/article/details/109267554

可能你在面试中不一定会遇到 http 相关的问题,但这的确应该是每一个程序员的基本功。如果这些基本概念你都答错了,一定不会给面试官留下一个好印象。

分享一篇躺在我本地文档库很久的笔记,内容总结自 《图解 HTTP》、《图解 TCP/IP》、《HTTP 权威指南》 等等,大家可以把本文当做 http 的复习大纲,也可以当做一个速查笔记。目录如下:

  • 什么是 HTTP ?
  • HTTP 版本
  • URI、URL、URN
  • 报文格式
  • 请求方法
  • 状态码
  • 报文首部

什么是 HTTP ?

HTTP(HyperText Transfer Protocol,超文本传输协议) 是客户端和服务器端之间的一种数据传输协议。

协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的 CPU 以及不同的操作系统组成的计算器之间,只要遵循相同的协议就能够实现通信。

HTTP 属于 OSI 参考模型中的 应用层协议 。其他应用层协议还有 SMTPFTPTELNET/SSHSNMP

HTTP 通常被译为超文本传输协议,但这种译法并不严谨。严谨的译名应该为 “超文本转移协议”。但是前移译法已经约定俗成。

HTTP 版本

  • HTTP/0.9

    HTTP 的 1991 原型版本称为 HTTP/0.9 。这个协议有很多严重的设计缺陷,只用于和老客户端的交互。HTTP/0.9 只支持 GET 方法,不支持多媒体内容的 MIME 类型、各种 HTTP 首部,或者版本号。HTTP/0.9 定义的初衷是为了获取简单的 HTML ,很快就被 HTTP/1.0 代替了。

  • HTTP/1.0

    1.0 是第一个得到广泛使用的 HTTP 版本。HTTP/1.0 添加了版本号、各种 HTTP 首部、一些额外的方法,以及对多媒体对象的处理。

    其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

    但是 1.0 版本的工作方式是每次 TCP 连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立 TCP 连接,就是不支持 keep-alive 。

  • HTTP/1.1

    1.1 是目前主流的 HTTP 协议版本,重点校正了 HTTP 设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。

    最大的变化就是引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive ,一个 TCP 连接允许多个 HTTP 请求。

  • HTTP/2.0

    HTTP/2.0 是 HTTP 协议自 1999 年 HTTP/1.1 发布后的首个更新,主要基于 SPDY 协议,在不改动HTTP语义、方法、状态码、URI 及首部字段的情况下,大幅度提高了Web 性能 。它具有如下特点:

    • 二进制传输。HTTP/1.x 版本采用的是文本格式
    • 多路复用。解决旧版本的对头阻塞(Head of line blocking) 问题,一个 TCP 连接中存在多个流,即可以发送多个请求
    • header 压缩。减小 header 大小
    • 服务器 Push。服务端可以在客户端某个请求后,主动推送其他资源

参考资料 : 【快速入门系列】一篇文章让你入门HTTP2.0](https://segmentfault.com/a/1190000016656529)

URI、URL、URN

URI,Uniform Resource Identifier ,统一资源标识符 。用来唯一标识并定位资源。它是一个通用的概念,由两个主要的子集 URL 和 URN 构成。

URL,Uniform Resource Locator ,统一资源定位符 。URL 描述了一台特定服务器上某资源的特定位置。我们常见的各种网址就是典型的 URL ,一般遵循通用语法:

协议类型://服务器地址[:端口号]/路径

以我的个人博客的关于页面为例,https://luyao.tech/s/me ,协议类型是 http ,服务器地址是 luyao.tech ,资源路径是 /s/me

URN , Uniform Resource Name , 统一资源名 。与 URL 使用资源路径定位不同,URN 使用特定内容的唯一名称来定位,与资源位置无关,这样就可以将资源四处搬移。但是从 URL 转换到 URN 是一项巨大的工程,目前为止并没有多大进展。

报文格式

请求报文

<method> <request-URL> <version> <headers>  <entity-body>

Http 速查

请求报文

响应报文

<version> <status> <reason-phase> <headers>  <entity-body>

Http 速查

响应报文

请求方法

GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。不修改服务器数据。支持 1.0、1.1 版本 。

POST 方法用来向服务器传输数据,会增加或者修改服务器数据。要传输的数据写在 body 中。支持 1.0、1.1 版本 。

PUT 方法会向服务器写入文档。它的语义就是让服务器用请求的 body 部分来创建一个由所请求的 URL 命名的新文档,如果已存在,就代替它。支持 1.0、1.1 版本 。

HEAD 方法与 GET 类似,但是服务器只会返回首部,不会返回 body 。支持 1.0、1.1 版本 。 可以:

  • 在不获取资源的情况下了解资源的情况(比如,判断其类型)
  • 通过查看响应中的状态码,查看资源是否存在
  • 通过查看首部,测试资源是否被修改

DELETE 方法用于删除指定资源。支持 1.0、1.1 版本 。

OPTIONS 方法请求 Web 服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。仅支持 1.1 版本 。

TRACE 方法可以让服务器将之前的请求通信返回给客户端。客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改/篡改的。主要用于诊断。仅支持 1.1 版本 。

CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容
加密后经网络隧道传输。仅支持 1.1 版本 。

状态码

1xx ,信息性状态码

状态码 原因短语 含义
100 Continue 收到了请求的起始部分,客户端应该继续请求
101 Switching Protocols 服务端正根据客户端的指示将协议切换成 Update 首部列出的协议

2xx,成功状态码

状态码 原因短语 含义
200 OK 服务器已成功处理请求
201 Created 对那些要服务器创建对象的请求来说,资源已创建完毕
202 Accepted 请求已接受,但服务器尚未处理
203 Non-Authoritative Information 服务器已将事务成功处理,只是实体首部包含的信息不是来原始服务器,而是来自资源的副本
204 No Content 响应报文包含一些首部和一个状态行,但不包含实体的主体内容
205 Reset Content 主要用于浏览器,意思是浏览器应该重置当前页面上的所有 HTML 表单
206 Partial Content 部分请求成功

206 表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

3xx,重定向状态码

状态码 原因短语 含义
300 Multiple Choices 客户端请求一个实际指向多个资源的 URL 时会返回这个状态码,这个代码和一个选项表一起返回,供用户进行选择
301 Moved Permanently 永久性重定向。请求的 URL 已移走,响应的 Location 首部应该包含资源现在的 URL
302 Found 临时重定向。客户端应该使用 Location 首部给出的 URL 来临时定位资源,将来的请求仍应使用老的 URL
303 See Other 由于请求对应的资源存在着另一个 URL,应使用 GET 方法定向获取请求的资源
304 Not Modified 客户端发送附带条件的请求时,服务器资源未改变,可直接使用客户端未过期的缓存
305 Use Proxy 必须通过代理来访问资源,代理的位置由 Location 首部给出
307 Temporary Redirect 临时重定向,与 302 有相同的含义

304 中附带条件的请求是指采用 GET 方法的请求报文中包含 If-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-Since 中任一首部。

对于 HTTP/1.1 客户端,用 307 状态码取代 302 状态码进行临时重定向,307 会遵照浏览器标准,不会从 POST 变成 GET。这样服务器可以将 302 状态码保留起来,为 HTTP/1.0 客户端使用。很多现存的浏览器会将 302 响应视为 303 响应,并且使用 GET 方法访问在 Location 中规定的 URL,而无视原来的请求方法。

4xx,客户端错误状态码

状态码 原因短语 含义
400 Bad Request 请求报文中存在语法错误
401 Unauthorized 在客户端获取资源访问权之前,需要进行身份认证。响应中必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询用户信息
402 Payment Required 未使用,预留
403 Forbidden 请求被服务器拒绝
404 Not Found 服务器无法找到请求的资源
405 Method Not Allowed 发起的请求中带有所请求的 URL 不支持的方法。响应中应包含 Allow 首部,以告诉客户端请求的资源可以使用哪些方法
406 Not Acceptable 客户端可以指定一些参数爱说明希望接受哪些类型的实体,服务器没有资源与客户端可接受的 URL 相匹配时使用此状态码
407 Proxy Authentication Required 与 401 类似,但用于需要进行资源认证的代理服务器
408 Request Timeout 如果客户端完成其请求时花费的时间太长,服务器可以返回此状态码关闭连接
409 Conflict 请求可能在资源上引发一些冲突。响应中应该包含描述冲突的主体
410 Gone 与 404 类似,只是服务器曾经拥有过此资源
411 Length Required 服务器要求请求报文中包含 Content-Length 首部
412 Precondition Failed 客户端发起了条件请求,且其中一个条件失败了的时候使用
413 Request Enity Too Large 客户端发送的实体主体部分比服务器能够或者希望处理的要大
414 Request URI Too Long 客户端诉所发请求中的 URL 比服务器能够或者希望处理的要长
415 Unsupported Media Type 服务器无法理解或无法支持客户端所发实体的内容类型
416 Requested Range Not Satisfiable 请求报文所请求的是指定资源的某个范围,而此范围无效或无法满足
417 Expectation Failed 请求报文的 Expect 首部包含了一个期望,但服务器无法满足此期望

5xx,服务器错误状态码

状态码 原因短语 含义
500 Internal Server Error 服务器在执行请求时发生了错误
501 Not Implemented 客户端发起的请求超出了服务器的能力范围(比如不支持的请求方法)
502 Bad Gateway 作为代理或网关使用的服务器遇到了来自响应链中上游的无效响应
503 Service Unavailable 服务器暂时无法为请求提供服务。如果事先得知恢复需要的时间,最好写入 Retry-After 首部返回给客户端
504 Gateway Timeout 与 408 类似,只是这里的响应来自一个网关或者代理,它们在等待另一服务器对其请求进行响应时超时了
505 HTTP Version Not Supported 服务器收到的请求使用了它无法或不愿支持的协议版本

报文首部

HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔。

首部字段名: 字段值

HTTP 首部字段根据实际用途被分为以下 4 种类型:通用首部字段请求首部字段响应首部字段实体首部字段

通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

Cache-Control

控制缓存的工作机制。

指令 含义
public 其他用户也可以利用缓存
private 对特定用户提供资源缓存服务
no-cache 并不是不缓存,缓存会向源服务器进行有效期确认后处理资源,防止从缓存中返回过期的资源
no-store 不缓存,暗示请求或响应中包含机密信息
max-age = [秒] 当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。
min-fresh = [秒] 要求缓存服务器返回至少还未过指定时间的缓存资源。当指定 min-fresh 为 60 秒后,过了 60 秒的资源都无法作为响应返回了
max-stale = [秒] 如果指令未指定参数值,那么无论经过多久,客户端都会接收响应; 如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。
only-if-cached 只有缓存中有副本存在时,客户端才会获取一份副本
must-revalidate 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效
proxy-revalidate 要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性
no-transform 无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。可以防止缓存或代理压缩图片等类似操作

Connection

Connection 首部有两个作用,控制不再转发给代理的首部字段和管理持久连接。

应用程序收到带有 Connection 首部的报文后,会删除报文中所有在 Connection 首部列表中出现过的首部。主要用于代理网络环境,这样服务器或其他代理就可以指定不应传递的逐跳首部了。

HTTP/1.1 版本的默认连接都是持久连接。为此, 客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close

HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。为此, 如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定 Connection 首部字段的值为 Keep-Alive

Date

创建 HTTP 报文的日期和时间

Pragma

Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。规范定义的形式唯一,如下所示 :

Pragma: no-cache

表示客户端要求所有的中间服务器不返回缓存的资源。

Trailer

如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以使用 Trailer 列出位于报文末端的首部。

Transfer-Encoding

规定了传输报文主体时采用的编码方式。HTTP/1.1 的传输编码方式仅对分块传输编码有效。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Cache-Control: public, max-age=604800
Content-Type: text/javascript; charset=utf-8
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive
cf0 ←16进制(10进制为3312)
…3312字节分块数据…
392 ←16进制(10进制为914)
…914字节分块数据…
0

分别被分成 3312 字节和 914 字节大小的分块数据 。

Android 面试进阶指南目录

计算机网络

  1. http 速查

Android

  1. 唠唠任务栈,返回栈和启动模式
  2. 唠唠 Activity 的生命周期
  3. 扒一扒 Context
  4. 为什么不能使用 Application Context 显示 Dialog?
  5. OOM 可以被 try catch 吗?
  6. Activity.finish() 之后十秒才回调 onDestroy ?

本文永久更新地址: https://blog.csdn.net/sunluyao_/article/details/109267554

可能你在面试中不一定会遇到 http 相关的问题,但这的确应该是每一个程序员的基本功。如果这些基本概念你都答错了,一定不会给面试官留下一个好印象。

分享一篇躺在我本地文档库很久的笔记,内容总结自 《图解 HTTP》、《图解 TCP/IP》、《HTTP 权威指南》 等等,大家可以把本文当做 http 的复习大纲,也可以当做一个速查笔记。目录如下:

  • 什么是 HTTP ?
  • HTTP 版本
  • URI、URL、URN
  • 报文格式
  • 请求方法
  • 状态码
  • 报文首部

什么是 HTTP ?

HTTP(HyperText Transfer Protocol,超文本传输协议) 是客户端和服务器端之间的一种数据传输协议。

协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的 CPU 以及不同的操作系统组成的计算器之间,只要遵循相同的协议就能够实现通信。

HTTP 属于 OSI 参考模型中的 应用层协议 。其他应用层协议还有 SMTPFTPTELNET/SSHSNMP

HTTP 通常被译为超文本传输协议,但这种译法并不严谨。严谨的译名应该为 “超文本转移协议”。但是前移译法已经约定俗成。

HTTP 版本

  • HTTP/0.9

    HTTP 的 1991 原型版本称为 HTTP/0.9 。这个协议有很多严重的设计缺陷,只用于和老客户端的交互。HTTP/0.9 只支持 GET 方法,不支持多媒体内容的 MIME 类型、各种 HTTP 首部,或者版本号。HTTP/0.9 定义的初衷是为了获取简单的 HTML ,很快就被 HTTP/1.0 代替了。

  • HTTP/1.0

    1.0 是第一个得到广泛使用的 HTTP 版本。HTTP/1.0 添加了版本号、各种 HTTP 首部、一些额外的方法,以及对多媒体对象的处理。

    其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

    但是 1.0 版本的工作方式是每次 TCP 连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立 TCP 连接,就是不支持 keep-alive 。

  • HTTP/1.1

    1.1 是目前主流的 HTTP 协议版本,重点校正了 HTTP 设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。

    最大的变化就是引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive ,一个 TCP 连接允许多个 HTTP 请求。

  • HTTP/2.0

    HTTP/2.0 是 HTTP 协议自 1999 年 HTTP/1.1 发布后的首个更新,主要基于 SPDY 协议,在不改动HTTP语义、方法、状态码、URI 及首部字段的情况下,大幅度提高了Web 性能 。它具有如下特点:

    • 二进制传输。HTTP/1.x 版本采用的是文本格式
    • 多路复用。解决旧版本的对头阻塞(Head of line blocking) 问题,一个 TCP 连接中存在多个流,即可以发送多个请求
    • header 压缩。减小 header 大小
    • 服务器 Push。服务端可以在客户端某个请求后,主动推送其他资源

参考资料 : 【快速入门系列】一篇文章让你入门HTTP2.0](https://segmentfault.com/a/1190000016656529)

URI、URL、URN

URI,Uniform Resource Identifier ,统一资源标识符 。用来唯一标识并定位资源。它是一个通用的概念,由两个主要的子集 URL 和 URN 构成。

URL,Uniform Resource Locator ,统一资源定位符 。URL 描述了一台特定服务器上某资源的特定位置。我们常见的各种网址就是典型的 URL ,一般遵循通用语法:

协议类型://服务器地址[:端口号]/路径

以我的个人博客的关于页面为例,https://luyao.tech/s/me ,协议类型是 http ,服务器地址是 luyao.tech ,资源路径是 /s/me

URN , Uniform Resource Name , 统一资源名 。与 URL 使用资源路径定位不同,URN 使用特定内容的唯一名称来定位,与资源位置无关,这样就可以将资源四处搬移。但是从 URL 转换到 URN 是一项巨大的工程,目前为止并没有多大进展。

报文格式

请求报文

<method> <request-URL> <version> <headers>  <entity-body>

Http 速查

请求报文

响应报文

<version> <status> <reason-phase> <headers>  <entity-body>

Http 速查

响应报文

请求方法

GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。不修改服务器数据。支持 1.0、1.1 版本 。

POST 方法用来向服务器传输数据,会增加或者修改服务器数据。要传输的数据写在 body 中。支持 1.0、1.1 版本 。

PUT 方法会向服务器写入文档。它的语义就是让服务器用请求的 body 部分来创建一个由所请求的 URL 命名的新文档,如果已存在,就代替它。支持 1.0、1.1 版本 。

HEAD 方法与 GET 类似,但是服务器只会返回首部,不会返回 body 。支持 1.0、1.1 版本 。 可以:

  • 在不获取资源的情况下了解资源的情况(比如,判断其类型)
  • 通过查看响应中的状态码,查看资源是否存在
  • 通过查看首部,测试资源是否被修改

DELETE 方法用于删除指定资源。支持 1.0、1.1 版本 。

OPTIONS 方法请求 Web 服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。仅支持 1.1 版本 。

TRACE 方法可以让服务器将之前的请求通信返回给客户端。客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改/篡改的。主要用于诊断。仅支持 1.1 版本 。

CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容
加密后经网络隧道传输。仅支持 1.1 版本 。

状态码

1xx ,信息性状态码

状态码 原因短语 含义
100 Continue 收到了请求的起始部分,客户端应该继续请求
101 Switching Protocols 服务端正根据客户端的指示将协议切换成 Update 首部列出的协议

2xx,成功状态码

状态码 原因短语 含义
200 OK 服务器已成功处理请求
201 Created 对那些要服务器创建对象的请求来说,资源已创建完毕
202 Accepted 请求已接受,但服务器尚未处理
203 Non-Authoritative Information 服务器已将事务成功处理,只是实体首部包含的信息不是来原始服务器,而是来自资源的副本
204 No Content 响应报文包含一些首部和一个状态行,但不包含实体的主体内容
205 Reset Content 主要用于浏览器,意思是浏览器应该重置当前页面上的所有 HTML 表单
206 Partial Content 部分请求成功

206 表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

3xx,重定向状态码

状态码 原因短语 含义
300 Multiple Choices 客户端请求一个实际指向多个资源的 URL 时会返回这个状态码,这个代码和一个选项表一起返回,供用户进行选择
301 Moved Permanently 永久性重定向。请求的 URL 已移走,响应的 Location 首部应该包含资源现在的 URL
302 Found 临时重定向。客户端应该使用 Location 首部给出的 URL 来临时定位资源,将来的请求仍应使用老的 URL
303 See Other 由于请求对应的资源存在着另一个 URL,应使用 GET 方法定向获取请求的资源
304 Not Modified 客户端发送附带条件的请求时,服务器资源未改变,可直接使用客户端未过期的缓存
305 Use Proxy 必须通过代理来访问资源,代理的位置由 Location 首部给出
307 Temporary Redirect 临时重定向,与 302 有相同的含义

304 中附带条件的请求是指采用 GET 方法的请求报文中包含 If-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-Since 中任一首部。

对于 HTTP/1.1 客户端,用 307 状态码取代 302 状态码进行临时重定向,307 会遵照浏览器标准,不会从 POST 变成 GET。这样服务器可以将 302 状态码保留起来,为 HTTP/1.0 客户端使用。很多现存的浏览器会将 302 响应视为 303 响应,并且使用 GET 方法访问在 Location 中规定的 URL,而无视原来的请求方法。

4xx,客户端错误状态码

状态码 原因短语 含义
400 Bad Request 请求报文中存在语法错误
401 Unauthorized 在客户端获取资源访问权之前,需要进行身份认证。响应中必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询用户信息
402 Payment Required 未使用,预留
403 Forbidden 请求被服务器拒绝
404 Not Found 服务器无法找到请求的资源
405 Method Not Allowed 发起的请求中带有所请求的 URL 不支持的方法。响应中应包含 Allow 首部,以告诉客户端请求的资源可以使用哪些方法
406 Not Acceptable 客户端可以指定一些参数爱说明希望接受哪些类型的实体,服务器没有资源与客户端可接受的 URL 相匹配时使用此状态码
407 Proxy Authentication Required 与 401 类似,但用于需要进行资源认证的代理服务器
408 Request Timeout 如果客户端完成其请求时花费的时间太长,服务器可以返回此状态码关闭连接
409 Conflict 请求可能在资源上引发一些冲突。响应中应该包含描述冲突的主体
410 Gone 与 404 类似,只是服务器曾经拥有过此资源
411 Length Required 服务器要求请求报文中包含 Content-Length 首部
412 Precondition Failed 客户端发起了条件请求,且其中一个条件失败了的时候使用
413 Request Enity Too Large 客户端发送的实体主体部分比服务器能够或者希望处理的要大
414 Request URI Too Long 客户端诉所发请求中的 URL 比服务器能够或者希望处理的要长
415 Unsupported Media Type 服务器无法理解或无法支持客户端所发实体的内容类型
416 Requested Range Not Satisfiable 请求报文所请求的是指定资源的某个范围,而此范围无效或无法满足
417 Expectation Failed 请求报文的 Expect 首部包含了一个期望,但服务器无法满足此期望

5xx,服务器错误状态码

状态码 原因短语 含义
500 Internal Server Error 服务器在执行请求时发生了错误
501 Not Implemented 客户端发起的请求超出了服务器的能力范围(比如不支持的请求方法)
502 Bad Gateway 作为代理或网关使用的服务器遇到了来自响应链中上游的无效响应
503 Service Unavailable 服务器暂时无法为请求提供服务。如果事先得知恢复需要的时间,最好写入 Retry-After 首部返回给客户端
504 Gateway Timeout 与 408 类似,只是这里的响应来自一个网关或者代理,它们在等待另一服务器对其请求进行响应时超时了
505 HTTP Version Not Supported 服务器收到的请求使用了它无法或不愿支持的协议版本

报文首部

HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔。

首部字段名: 字段值

HTTP 首部字段根据实际用途被分为以下 4 种类型:通用首部字段请求首部字段响应首部字段实体首部字段

通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

Cache-Control

控制缓存的工作机制。

指令 含义
public 其他用户也可以利用缓存
private 对特定用户提供资源缓存服务
no-cache 并不是不缓存,缓存会向源服务器进行有效期确认后处理资源,防止从缓存中返回过期的资源
no-store 不缓存,暗示请求或响应中包含机密信息
max-age = [秒] 当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。
min-fresh = [秒] 要求缓存服务器返回至少还未过指定时间的缓存资源。当指定 min-fresh 为 60 秒后,过了 60 秒的资源都无法作为响应返回了
max-stale = [秒] 如果指令未指定参数值,那么无论经过多久,客户端都会接收响应; 如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。
only-if-cached 只有缓存中有副本存在时,客户端才会获取一份副本
must-revalidate 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效
proxy-revalidate 要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性
no-transform 无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。可以防止缓存或代理压缩图片等类似操作

Connection

Connection 首部有两个作用,控制不再转发给代理的首部字段和管理持久连接。

应用程序收到带有 Connection 首部的报文后,会删除报文中所有在 Connection 首部列表中出现过的首部。主要用于代理网络环境,这样服务器或其他代理就可以指定不应传递的逐跳首部了。

HTTP/1.1 版本的默认连接都是持久连接。为此, 客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close

HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。为此, 如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定 Connection 首部字段的值为 Keep-Alive

Date

创建 HTTP 报文的日期和时间

Pragma

Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。规范定义的形式唯一,如下所示 :

Pragma: no-cache

表示客户端要求所有的中间服务器不返回缓存的资源。

Trailer

如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以使用 Trailer 列出位于报文末端的首部。

Transfer-Encoding

规定了传输报文主体时采用的编码方式。HTTP/1.1 的传输编码方式仅对分块传输编码有效。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Cache-Control: public, max-age=604800
Content-Type: text/javascript; charset=utf-8
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive
cf0 ←16进制(10进制为3312)
…3312字节分块数据…
392 ←16进制(10进制为914)
…914字节分块数据…
0

分别被分成 3312 字节和 914 字节大小的分块数据 。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Http 速查求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们