HTTP——系统学习

名词定义

  • HTTP:超文本传输协议(Hyper Text Transfer Protocol)是一个简单的请求-响应协议。
  • CDN:内容分发网络(Content Delivery Network)
  • IP 协议:Internet Protocol,主要目的是解决寻址和路由问题,以及如何在两点间传送数据包。
  • TCP 协议:传输控制协议(Transmission Control Protocol),它位于 IP 协议之上,基于 IP 协议提供可靠的、字节流形式的通信,是 HTTP 协议得以实现的基础。
  • DNS:域名系统(Domain Name System),用有意义的名字来作为 IP 地址的等价替代,Domain Name 又称“主机名”。
  • URI:统一资源标识符(Uniform Resource Identifier),利用它可以唯一标记互联网上资源。
  • URL:统一资源定位符(Uniform Resource Locator),俗称“网址”,它是URI的一个子集。
  • HTTPS: HTTP over SSL/TLS,运行在SSL/TLS协议上的HTTP。相当于 HTTP + SSL/TLS + TCP/IP
  • SSL:Secure Socket Layer,当发展到3.0时被标准化,改名为TSL,即Transport Layer Security。
  • MAC地址(Media Access Control Address):又称局域网地址,可以唯一地标识一个网卡,也就同时标识了此网卡所属的设备。

HTTP 各种协议

  1. TCP/IP 是网络世界最常用的协议,HTTP 通常运行在 TCP/IP 提供的可靠传输基础上;
  2. DNS 域名是 IP 地址的等价替代,需要用域名解析实现到 IP 地址的映射;
  3. URI 是用来标记互联网上资源的一个名字,由“协议名 + 主机名 + 路径”构成,俗称 URL;
  4. HTTPS 相当于“HTTP+SSL/TLS+TCP/IP”,为 HTTP 套了一个安全的外壳;
  5. 代理是 HTTP 传输过程中的“中转站”,可以实现缓存加速、负载均衡等功能。

HTTP网络分层模型

  1. TCP/IP 分为四层,核心是二层的 IP 和三层的 TCP,HTTP 在第四层;
  2. OSI 分为七层,基本对应 TCP/IP,TCP 在第四层,HTTP 在第七层;
  3. OSI 可以映射到 TCP/IP,但这期间一、五、六层消失了;
  4. HTTP 利用 TCP/IP 协议栈逐层打包再拆包,实现了数据传输,但下面的细节并不可见。
  • 小结:由操作系统负责处理的就是四层或者四层一下;需要应用程序(自己编写代码)负责处理的就是七层。

域名和DNS

  1. 域名使用字符串来代替 IP 地址,方便用户记忆,本质上一个名字空间系统;
  2. DNS 就像是我们现实世界里的电话本、查号台,统管着互联网世界里的所有网站,是一个“超级大管家”;
  3. DNS 是一个树状的分布式查询系统,但为了提高查询效率,外围有多级的缓存;
  4. 使用 DNS 可以实现基于域名的负载均衡,既可以在内网,也可以在外网。

HTTP 协议请求 - 应答

  1. HTTP 协议基于底层的 TCP/IP 协议,所以必须要用 IP 地址建立连接;
  2. 如果不知道 IP 地址,就要用 DNS 协议去解析得到 IP 地址,否则就会连接失败;
  3. 建立 TCP 连接后会顺序收发数据,请求方和应答方都必须依据 HTTP 规范构建和解析报文;
  4. 为了减少响应时间,整个过程中的每一个环节都会有缓存,尽量实现快速返回;

HTTP报文结构

  1. HTTP 由“起始行 + 头部 + 空行 + 实体”组成,简单地说就是“header+body”;
  2. HTTP 报文可以没有 body,但必须要有 header;
  3. 请求头由“请求行 + 头部字段”构成,响应头由“状态行 + 头部字段”构成;
  4. 请求行有三部分:请求方法,请求目标和版本号;状态行也有三部分:版本号,状态码和原因字符串;

HTTP报文请求方法

  1. 请求方法是客户端发出的、要求服务器执行的、对资源的一种操作;请求方法是对服务器的“指示”,真正应如何处理由服务器来决定;
  2. 最常用的请求方法是 GET 和 POST,分别是获取数据和发送数据;
  3. HEAD 方法是轻量级的 GET,用来获取资源的元信息;PUT 基本上是 POST 的同义词,多用于更新数据;

网址URI

  1. URI 是用来唯一标记服务器上资源的一个字符串,通常也称为 URL;
  2. URI 通常由 scheme、host:port、path 和 query 四个部分组成,有的可以省略;
  3. scheme 叫“方案名”或者“协议名”,表示资源应该使用哪种协议来访问;host:port”表示资源所在的主机名和端口号;path 标记资源所在的位置;query 表示对资源附加的额外要求;
  4. 在 URI 里对“@&/”等特殊字符和汉字必须要做编码,否则服务器收到 HTTP 报文后会无法正确处理。

响应状态码

  • 响应报文 = 响应头(状态行+头字段) + 响应体
  • 状态行 = Version(HTTP协议版本号) + 状态码 + Reason(原因短语)
  1. 状态码在响应报文里表示了服务器对请求的处理结果;
  2. 状态码是十进制的三位数,分为五类,从 100 到 599;
  3. 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
  4. 2××:成功,报文已经收到并被正确处理;
  5. 3××:重定向,资源位置发生变动,需要客户端重新发送请求;
  6. 4××:客户端错误,请求报文有误,服务器无法处理;
  7. 5××:服务器错误,服务器在处理请求时内部发生了错误。

扩展:

  • 2××类状态码表示服务器收到并成功处理了客户端的请求,这也是客户端最愿意看到的状态码。

    • “200 OK”是最常见的成功状态码,表示一切正常,服务器如客户端所期望的那样返回了处理结果,如果是非 HEAD 请求,通常在响应头后都会有 body 数据。
    • “204 No Content”是另一个很常见的成功状态码,它的含义与“200 OK”基本相同,但响应头后没有 body 数据。所以对于 Web 服务器来说,正确地区分 200 和 204 是很必要的。
    • “206 Partial Content”是 HTTP 分块下载或断点续传的基础,在客户端发送“范围请求”、要求获取资源的部分数据时出现,它与 200 一样,也是服务器成功处理了请求,但 body 里的数据不是资源的全部,而是其中的一部分。
  • 3××类状态码表示客户端请求的资源发生了变动,客户端必须用新的 URI 重新发送请求获取资源,也就是通常所说的“重定向”,包括著名的 301、302 跳转。

    • “301 Moved Permanently”俗称“永久重定向”,含义是此次请求的资源已经不存在了,需要改用改用新的 URI 再次访问。
    • “302 Found”,曾经的描述短语是“Moved Temporarily”,俗称“临时重定向”,意思是请求的资源还在,但需要暂时用另一个 URI 来访问。
    • “304 Not Modified” 是一个比较有意思的状态码,它用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件”(即“缓存重定向”)。
  • 4××类状态码表示客户端发送的请求报文有误,服务器无法处理,它就是真正的“错误码”含义了。

    • “400 Bad Request”是一个通用的错误码,表示请求报文有错误,但具体是数据格式错误、缺少请求头还是 URI 超长它没有明确说,只是一个笼统的错误。
    • 403 Forbidden”实际上不是客户端的请求出错,而是表示服务器禁止访问资源。原因可能多种多样,例如信息敏感、法律禁止等。
    • 404 Not Found”可能是我们最常看见也是最不愿意看到的一个状态码,它的原意是资源在本服务器上未找到,所以无法提供给客户端。
    • 405 Method Not Allowed:不允许使用某些方法操作资源,例如不允许 POST 只能 GET;
    • 406 Not Acceptable:资源无法满足客户端请求的条件,例如请求中文但只有英文;
    • 408 Request Timeout:请求超时,服务器等待了过长的时间;
    • 409 Conflict:多个请求发生了冲突,可以理解为多线程并发时的竞态;
    • 413 Request Entity Too Large:请求报文里的 body 太大;
    • 414 Request-URI Too Long:请求行里的 URI 太大;
    • 429 Too Many Requests:客户端发送了太多的请求,通常是由于服务器的限连策略;
    • 431 Request Header Fields Too Large:请求头某个字段或总体太大;
  • 5××类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”。

    • “500 Internal Server Error”与 400 类似,也是一个通用的错误码。
    • “501 Not Implemented”表示客户端请求的功能还不支持。
    • “502 Bad Gateway”通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的。
    • “503 Service Unavailable”表示服务器当前很忙,暂时无法响应服务。503 响应报文里通常还会有一个“Retry-After”字段,指示客户端可以在多久以后再次尝试发送请求。

HTTP 基本特点

  1. HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能;
  2. HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达;
  3. HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据;
  4. HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求;
  5. HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。

HTTP 数据类型和语言类型

  • 数据类型-头字段: 客户端 Accept <===> 服务器 Content-Type
    数据类型表示实体数据的内容是什么,使用的是 MIME type。常见类型:

    • text:文本格式的可读数据;如text/html、text/plain、text/css
    • image:即图像文件;如image/gif、image/jpeg、image/png
    • audio/video:音频和视频数据; audio/mpeg、video/mp4
    • application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。常见的有 application/json,application/javascript、application/pdf
  • 数据编码-头字段: 客户端 Accept-Encoding <===> 服务器 Content-Encoding
    数据编码表示实体数据的压缩方式。常见类型:

    • gzip:GNU zip 压缩格式,也是互联网上最流行的压缩格式;
    • deflate:zlib(deflate)压缩格式,流行程度仅次于 gzip;
    • br:一种专门为 HTTP 优化的新压缩算法(Brotli)。
  • 语言类型-头字段: 客户端 Accept-Language <===> 服务器 Content-Language
    语言类型表示实体数据的自然语言。常见类型:en-US(美式英语),en-GB(英式英语),zh-CN (汉语)。

  • 字符集-头字段: 客户端 Accept-Charset <===> 服务器 Content-Type
    字符集表示实体数据的编码方式。

  • 客户端需要在请求头里使用 Accept 等头字段与服务器进行“内容协商”,要求服务器返回最合适的数据;

HTTP 传输大文件

  1. 压缩 HTML 等文本文件是传输大文件最基本的方法;
  2. 分块传输可以流式收发数据,节约内存和带宽,使用响应头字段“Transfer-Encoding: chunked”来表示;
  3. 范围请求可以只获取部分数据,即“分块请求”,实现视频拖拽或者断点续传,使用请求头字段“Range”和响应头字段“Content-Range”,响应状态码必须是 206;

HTTP 重定向和跳转

  1. 重定向是服务器发起的跳转,要求客户端改用新的 URI 重新发送请求,通常会自动进行,用户是无感知的;
  2. 301/302 是最常用的重定向状态码,分别是“永久重定向”和“临时重定向”;
  3. 响应头字段 Location 指示了要跳转的 URI,可以用绝对或相对的形式;
  • 背景:HTTP 是“无状态”。服务器没有状态差异,可以很容易地组成集群,缺点就是无法支持需要记录状态的事务操作。
  • HTTP 协议是可扩展,引入 Cookie 技术,主要用于身份识别,实现有状态的会话事务。
  • 流程:用户(浏览器)第一次访问服务,服务器创建独特身份标识,格式"key=value"放进Set-Cookie字段,随响应报文返给用户(浏览器)。浏览器收到响应报文,保存其中响应报文,下次请求把此值放进Cookie字段发往服务器。这次服务器通过Cookie字段,识别出用户。
  • Cookie属性(挑重点)
  1. 有效期:“Expires”和“Max-Age”属性。同时拥有以“Max-Age”为准
  2. 作用域(发给指定服务器和URI用对应的Cookie):“Domain”和“Path”指定了 Cookie 所属的域名和路径,浏览器在发送 Cookie 前会从 URI 中提取出 host 和 path 部分,对比 Cookie 的属性。
  3. 安全性:“HttpOnly”告诉浏览器,此 Cookie 只能通过浏览器 HTTP 协议传输。
  4. “SameSite”可以防范“跨站请求伪造”(XSRF)攻击,设置成“SameSite=Strict”可以严格限定 Cookie 不能随着跳转链接跨站发送,而“SameSite=Lax”则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。
  5. “Secure”:表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。

HTTPS之SSL/TLS

  • HTTPS出现背景:HTTP不安全,明文传输,任何人都能再链路中截取、修改或者伪造请求 / 响应报文,数据不具有可信性。

  • 通信安全 需满足条件:
    ① 机密性:对数据保密,只能由可行人访问;
    ② 完整兴(一致性):是指数据在传输过程中没有被窜改;
    ③ 身份认证:指确认对方真实身份,证明“你真的是你”;
    ④不可否认(不可抵赖):不能否认已经发生过的行为;

  • HTTPS 又称 “HTTP over SSL/TLS”,相对HTTP,多引入了一层SSL/TLS,且再HTTP下面,替代了TCP在HTTP下面。

  • SSL/TLS
    SSL(Secure Sockets Layer):安全套接层。后被改名为TLS(传输层安全 Transport Layer Security)
    TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术。

HTTPS之TLS 的握手

  1. HTTPS 协议会先与服务器执行 TCP 握手,然后执行 TLS 握手,才能建立安全连接;
  2. 握手的目标是安全地交换对称密钥,需要三个随机数,第三个随机数“Pre-Master”必须加密传输,绝对不能让黑客破解;
  3. “Hello”消息交换随机数,“Key Exchange”消息交换“Pre-Master”;
  4. “Change Cipher Spec”之前传输的都是明文,之后都是对称密钥加密的密文。

HTTP/2

  1. HTTP 协议取消了小版本号,所以 HTTP/2 的正式名字不是 2.0;
  2. HTTP/2 使用“HPACK”算法压缩头部信息,消除冗余数据节约带宽;
  3. HTTP/2 的消息不再是“Header+Body”的形式,而是分散为多个二进制“帧”;
  4. HTTP/2 使用虚拟的“流”传输消息,解决了困扰多年的“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率;
  5. HTTP/2 必须先发送一个“连接前言”字符串,然后才能建立正式连接;
  6. HTTP/2 废除了起始行,统一使用头字段,在两端维护字段“Key-Value”的索引表,使用“HPACK”算法压缩头部;
  7. HTTP/2 把报文切分为多种类型的二进制帧,报头里最重要的字段是流标识符,标记帧属于哪个流;
  8. 流是 HTTP/2 虚拟的概念,是帧的双向传输序列,相当于 HTTP/1 里的一次“请求 - 应答”;

CDN (内容分发网络)-加速网络服务

  • 背景:C专门为解决“长距离”上网络访问速度慢而诞生的一种网络应用服务。
  • CDN解释:CDN 的最核心原则是“就近访问”,CDN 投入了大笔资金,部署了大量拥有高存储高带宽的节点,构建了一个专用网络。CDN 就要“分发”源站的“内容”,利用缓存代理技术,使用“推”或者“拉”的手段,把源站的内容逐级缓存到网络的每一个节点上。用户在上网,访问离他“最近的”一个 CDN 节点(边缘节点“edge node”),其实就是缓存了源站内容的代理服务器。
  1. CDN 构建了全国、全球级别的专网,让用户就近访问专网里的边缘节点,降低了传输延迟,实现了网站加速;
  2. GSLB 是 CDN 的“大脑”,使用 DNS 负载均衡技术,智能调度边缘节点提供服务;
  3. 缓存系统是 CDN 的“心脏”,使用 HTTP 缓存代理技术,缓存命中就返回给用户,否则就要回源。

WebSocket:沙盒里的TCP

  1. HTTP 的“请求 - 应答”模式不适合开发“实时通信”应用,效率低,难以实现动态页面,所以出现了 WebSocket;
  2. WebSocket 是一个“全双工”的通信协议,相当于对 TCP 做了一层“薄薄的包装”,让它运行在浏览器环境里;
  3. WebSocket 使用兼容 HTTP 的 URI 来发现服务,但定义了新的协议名“ws”和“wss”,端口号也沿用了 80 和 443;
  4. WebSocket 使用二进制帧,结构比较简单,特殊的地方是有个“掩码”操作,客户端发数据必须掩码,服务器则不用;
  5. WebSocket 利用 HTTP 协议实现连接握手,发送 GET 请求要求“协议升级”,握手过程中有个非常简单的认证机制,目的是防止误连接。

posted on 2022-04-22 17:21  betterLearing  阅读(61)  评论(0编辑  收藏  举报