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 各种协议
- TCP/IP 是网络世界最常用的协议,HTTP 通常运行在 TCP/IP 提供的可靠传输基础上;
- DNS 域名是 IP 地址的等价替代,需要用域名解析实现到 IP 地址的映射;
- URI 是用来标记互联网上资源的一个名字,由“协议名 + 主机名 + 路径”构成,俗称 URL;
- HTTPS 相当于“HTTP+SSL/TLS+TCP/IP”,为 HTTP 套了一个安全的外壳;
- 代理是 HTTP 传输过程中的“中转站”,可以实现缓存加速、负载均衡等功能。
HTTP网络分层模型
- TCP/IP 分为四层,核心是二层的 IP 和三层的 TCP,HTTP 在第四层;
- OSI 分为七层,基本对应 TCP/IP,TCP 在第四层,HTTP 在第七层;
- OSI 可以映射到 TCP/IP,但这期间一、五、六层消失了;
- HTTP 利用 TCP/IP 协议栈逐层打包再拆包,实现了数据传输,但下面的细节并不可见。
- 小结:由操作系统负责处理的就是四层或者四层一下;需要应用程序(自己编写代码)负责处理的就是七层。
域名和DNS
- 域名使用字符串来代替 IP 地址,方便用户记忆,本质上一个名字空间系统;
- DNS 就像是我们现实世界里的电话本、查号台,统管着互联网世界里的所有网站,是一个“超级大管家”;
- DNS 是一个树状的分布式查询系统,但为了提高查询效率,外围有多级的缓存;
- 使用 DNS 可以实现基于域名的负载均衡,既可以在内网,也可以在外网。
HTTP 协议请求 - 应答
- HTTP 协议基于底层的 TCP/IP 协议,所以必须要用 IP 地址建立连接;
- 如果不知道 IP 地址,就要用 DNS 协议去解析得到 IP 地址,否则就会连接失败;
- 建立 TCP 连接后会顺序收发数据,请求方和应答方都必须依据 HTTP 规范构建和解析报文;
- 为了减少响应时间,整个过程中的每一个环节都会有缓存,尽量实现快速返回;
HTTP报文结构
- HTTP 由“起始行 + 头部 + 空行 + 实体”组成,简单地说就是“header+body”;
- HTTP 报文可以没有 body,但必须要有 header;
- 请求头由“请求行 + 头部字段”构成,响应头由“状态行 + 头部字段”构成;
- 请求行有三部分:请求方法,请求目标和版本号;状态行也有三部分:版本号,状态码和原因字符串;
HTTP报文请求方法
- 请求方法是客户端发出的、要求服务器执行的、对资源的一种操作;请求方法是对服务器的“指示”,真正应如何处理由服务器来决定;
- 最常用的请求方法是 GET 和 POST,分别是获取数据和发送数据;
- HEAD 方法是轻量级的 GET,用来获取资源的元信息;PUT 基本上是 POST 的同义词,多用于更新数据;
网址URI
- URI 是用来唯一标记服务器上资源的一个字符串,通常也称为 URL;
- URI 通常由 scheme、host:port、path 和 query 四个部分组成,有的可以省略;
- scheme 叫“方案名”或者“协议名”,表示资源应该使用哪种协议来访问;host:port”表示资源所在的主机名和端口号;path 标记资源所在的位置;query 表示对资源附加的额外要求;
- 在 URI 里对“@&/”等特殊字符和汉字必须要做编码,否则服务器收到 HTTP 报文后会无法正确处理。
响应状态码
- 响应报文 = 响应头(状态行+头字段) + 响应体
- 状态行 = Version(HTTP协议版本号) + 状态码 + Reason(原因短语)
- 状态码在响应报文里表示了服务器对请求的处理结果;
- 状态码是十进制的三位数,分为五类,从 100 到 599;
- 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
- 2××:成功,报文已经收到并被正确处理;
- 3××:重定向,资源位置发生变动,需要客户端重新发送请求;
- 4××:客户端错误,请求报文有误,服务器无法处理;
- 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 基本特点
- HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能;
- HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达;
- HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据;
- HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求;
- 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 传输大文件
- 压缩 HTML 等文本文件是传输大文件最基本的方法;
- 分块传输可以流式收发数据,节约内存和带宽,使用响应头字段“Transfer-Encoding: chunked”来表示;
- 范围请求可以只获取部分数据,即“分块请求”,实现视频拖拽或者断点续传,使用请求头字段“Range”和响应头字段“Content-Range”,响应状态码必须是 206;
HTTP 重定向和跳转
- 重定向是服务器发起的跳转,要求客户端改用新的 URI 重新发送请求,通常会自动进行,用户是无感知的;
- 301/302 是最常用的重定向状态码,分别是“永久重定向”和“临时重定向”;
- 响应头字段 Location 指示了要跳转的 URI,可以用绝对或相对的形式;
HTTP的 Cookie
- 背景:HTTP 是“无状态”。服务器没有状态差异,可以很容易地组成集群,缺点就是无法支持需要记录状态的事务操作。
- HTTP 协议是可扩展,引入 Cookie 技术,主要用于身份识别,实现有状态的会话事务。
- 流程:用户(浏览器)第一次访问服务,服务器创建独特身份标识,格式"key=value"放进Set-Cookie字段,随响应报文返给用户(浏览器)。浏览器收到响应报文,保存其中响应报文,下次请求把此值放进Cookie字段发往服务器。这次服务器通过Cookie字段,识别出用户。
- Cookie属性(挑重点)
- 有效期:“Expires”和“Max-Age”属性。同时拥有以“Max-Age”为准
- 作用域(发给指定服务器和URI用对应的Cookie):“Domain”和“Path”指定了 Cookie 所属的域名和路径,浏览器在发送 Cookie 前会从 URI 中提取出 host 和 path 部分,对比 Cookie 的属性。
- 安全性:“HttpOnly”告诉浏览器,此 Cookie 只能通过浏览器 HTTP 协议传输。
- “SameSite”可以防范“跨站请求伪造”(XSRF)攻击,设置成“SameSite=Strict”可以严格限定 Cookie 不能随着跳转链接跨站发送,而“SameSite=Lax”则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。
- “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 的握手
- HTTPS 协议会先与服务器执行 TCP 握手,然后执行 TLS 握手,才能建立安全连接;
- 握手的目标是安全地交换对称密钥,需要三个随机数,第三个随机数“Pre-Master”必须加密传输,绝对不能让黑客破解;
- “Hello”消息交换随机数,“Key Exchange”消息交换“Pre-Master”;
- “Change Cipher Spec”之前传输的都是明文,之后都是对称密钥加密的密文。
HTTP/2
- HTTP 协议取消了小版本号,所以 HTTP/2 的正式名字不是 2.0;
- HTTP/2 使用“HPACK”算法压缩头部信息,消除冗余数据节约带宽;
- HTTP/2 的消息不再是“Header+Body”的形式,而是分散为多个二进制“帧”;
- HTTP/2 使用虚拟的“流”传输消息,解决了困扰多年的“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率;
- HTTP/2 必须先发送一个“连接前言”字符串,然后才能建立正式连接;
- HTTP/2 废除了起始行,统一使用头字段,在两端维护字段“Key-Value”的索引表,使用“HPACK”算法压缩头部;
- HTTP/2 把报文切分为多种类型的二进制帧,报头里最重要的字段是流标识符,标记帧属于哪个流;
- 流是 HTTP/2 虚拟的概念,是帧的双向传输序列,相当于 HTTP/1 里的一次“请求 - 应答”;
CDN (内容分发网络)-加速网络服务
- 背景:C专门为解决“长距离”上网络访问速度慢而诞生的一种网络应用服务。
- CDN解释:CDN 的最核心原则是“就近访问”,CDN 投入了大笔资金,部署了大量拥有高存储高带宽的节点,构建了一个专用网络。CDN 就要“分发”源站的“内容”,利用缓存代理技术,使用“推”或者“拉”的手段,把源站的内容逐级缓存到网络的每一个节点上。用户在上网,访问离他“最近的”一个 CDN 节点(边缘节点“edge node”),其实就是缓存了源站内容的代理服务器。
- CDN 构建了全国、全球级别的专网,让用户就近访问专网里的边缘节点,降低了传输延迟,实现了网站加速;
- GSLB 是 CDN 的“大脑”,使用 DNS 负载均衡技术,智能调度边缘节点提供服务;
- 缓存系统是 CDN 的“心脏”,使用 HTTP 缓存代理技术,缓存命中就返回给用户,否则就要回源。
WebSocket:沙盒里的TCP
- HTTP 的“请求 - 应答”模式不适合开发“实时通信”应用,效率低,难以实现动态页面,所以出现了 WebSocket;
- WebSocket 是一个“全双工”的通信协议,相当于对 TCP 做了一层“薄薄的包装”,让它运行在浏览器环境里;
- WebSocket 使用兼容 HTTP 的 URI 来发现服务,但定义了新的协议名“ws”和“wss”,端口号也沿用了 80 和 443;
- WebSocket 使用二进制帧,结构比较简单,特殊的地方是有个“掩码”操作,客户端发数据必须掩码,服务器则不用;
- WebSocket 利用 HTTP 协议实现连接握手,发送 GET 请求要求“协议升级”,握手过程中有个非常简单的认证机制,目的是防止误连接。
posted on 2022-04-22 17:21 betterLearing 阅读(88) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?