
00:00:00
外卖卷:非常划算 扫码领劵 省点小钱钱
文章发布较早,内容可能过时,阅读注意甄别。
HTTP 状态码是服务器对请求的响应结果,由三位数字组成,第一位数字定义了响应的类别。以下是一些最常见和重要的 HTTP 状态码:
1xx - 信息响应(Informational responses):表示请求已被接收,继续处理。
| 状态码 | 名称 | 描述 | 常见应用场景 |
|---|---|---|---|
| 100 | Continue | 客户端应继续发送请求 | 大文件上传前,客户端检查服务器是否接受请求 |
| 101 | Switching Protocols | 服务器已切换协议 | WebSocket 连接建立 |
2xx - 成功响应(Successful responses):表示请求已被成功接收、理解、接受。
| 状态码 | 名称 | 描述 | 常见应用场景 |
|---|---|---|---|
| 200 | OK | 请求成功,最常见的状态码 | 页面加载、API 请求成功 |
| 201 | Created | 请求已成功,并创建了新的资源 | 创建用户、提交文章等 POST 请求 |
| 202 | Accepted | 请求已接受处理,但处理尚未完成 | 异步处理,如排队任务 |
| 204 | No Content | 请求成功,但响应报文不含实体的主体部分 | 删除操作、PUT 更新后无新内容返回 |
| 206 | Partial Content | 客户端进行了范围请求,服务器成功执行了这部分的 GET 请求 | 文件断点续传、视频分段加载 |
3xx - 重定向(Redirection messages):表示需要采取进一步操作才能完成请求。
| 状态码 | 名称 | 描述 | 常见应用场景 |
|---|---|---|---|
| 301 | Moved Permanently | 永久重定向。资源已永久地移动到新 URI | 网站域名变更、HTTP 到 HTTPS 重定向 |
| 302 | Found | 临时重定向。资源临时地移动到新 URI | 临时页面调整、负载均衡 |
| 303 | See Other | 告知客户端使用 GET 方法访问另一个 URI 来获取资源 | POST 请求后,引导用户查看结果页面 |
| 304 | Not Modified | 协商缓存命中。资源未修改,客户端可使用缓存版本 | 浏览器缓存优化 |
| 307 | Temporary Redirect | 临时重定向。与 302 类似,但要求客户端继续使用相同的 HTTP 方法 | 临时页面调整(保留方法) |
| 308 | Permanent Redirect | 永久重定向。与 301 类似,但要求客户端继续使用相同的 HTTP 方法 | 域名变更(保留方法) |
4xx - 客户端错误(Client error responses):表示客户端发送的请求包含错误或无法完成。
| 状态码 | 名称 | 描述 | 常见应用场景 |
|---|---|---|---|
| 400 | Bad Request | 客户端请求有语法错误,不能被服务器理解 | 请求参数错误、格式不正确 |
| 401 | Unauthorized | 请求需要用户认证 | 访问受保护资源未提供认证信息 |
| 403 | Forbidden | 服务器已理解请求,但拒绝执行(通常是权限问题) | 无权访问、IP 被禁止 |
| 404 | Not Found | 请求的资源不存在。最常见的错误状态码 | URL 路径错误、资源已被删除 |
| 405 | Method Not Allowed | 请求方法(如 GET, POST)不被允许用于请求的资源 | 对不支持 POST 的接口发送 POST 请求 |
| 408 | Request Timeout | 客户端在服务器等待请求时,没有在允许的时间内完成发送请求 | 客户端网络问题,请求发送超时 |
| 409 | Conflict | 请求与服务器的当前状态冲突 | 并发修改冲突(如乐观锁)、资源已存在 |
| 413 | Payload Too Large | 请求的实体过大,服务器无法处理 | 上传文件过大 |
| 415 | Unsupported Media Type | 请求的媒体类型(Content-Type)不被服务器支持 | 发送了服务器不支持的 Content-Type |
| 429 | Too Many Requests | 客户端在给定时间内发送了太多请求(速率限制) | 短时间内大量请求,被服务器限流 |
5xx - 服务器错误(Server error responses):表示服务器在尝试处理请求时发生了错误。
| 状态码 | 名称 | 描述 | 常见应用场景 |
|---|---|---|---|
| 500 | Internal Server Error | 服务器遇到了一个意外情况,阻止其完成请求。最常见的服务器端错误 | 后端代码错误、服务器配置问题 |
| 501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 | 请求了服务器未实现的 API |
| 502 | Bad Gateway | 作为网关或代理工作的服务器收到了上游服务器的无效响应 | 网关与后端服务通信失败 |
| 503 | Service Unavailable | 服务器目前无法处理请求,通常是由于服务器过载或停机维护 | 服务器维护、流量高峰导致服务崩溃 |
| 504 | Gateway Timeout | 作为网关或代理工作的服务器未能及时从上游服务器或某些辅助服务器接收响应 | 网关等待后端服务响应超时 |
HTTP 请求由三个主要部分组成:
GET /index.html HTTP/1.1请求头 (Request Headers) 的类型
请求头包含各种元数据,用于描述请求的上下文。一些常见的请求头类型:
Connection: keep-alive (保持连接)Cache-Control: no-cache (不使用缓存)Host: www.example.com (请求的目标主机)User-Agent: Mozilla/5.0 (...) (客户端代理信息,通常是浏览器信息)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 (客户端可接受的媒体类型)Accept-Language: zh-CN,zh;q=0.8 (客户端可接受的语言)Accept-Encoding: gzip, deflate, sdch (客户端可接受的编码方式)Cookie: key=value (客户端发送给服务器的 Cookie)Referer: http://www.example.com/previous-page.html (请求的来源页面)Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== (认证信息,如 Basic Auth, Bearer Token)If-Modified-Since: Tue, 15 Nov 1994 12:45:26 GMT (用于条件请求,协商缓存)Content-Type: application/json (请求体的媒体类型)Content-Length: 123 (请求体的字节长度)请求体 (Request Body) 的类型
请求体用于承载客户端需要发送给服务器的数据。其类型主要由 Content-Type 请求头指定。常见的请求体类型包括:
application/x-www-form-urlencoded:
& 分隔,键和值之间用 = 连接,特殊字符会被编码。name=Alice&age=30method="POST" 且不指定 enctype 时的默认类型。multipart/form-data:
描述:用于提交包含文件(二进制数据)的表单。每个表单字段或文件都被分成独立的部分(part),用一个分隔符(boundary)隔开。
示例:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"
Alice
------WebKitFormFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="profile_picture"; filename="me.jpg"
Content-Type: image/jpeg
... (binary image data) ...
------WebKitFormBoundary7MA4YWxkTrZu0gW--场景:HTML 表单 method="POST" 且 enctype="multipart/form-data" 时,常用于文件上传。
application/json:
{"name": "Bob", "age": 25}text/plain:
Hello, this is plain text.application/xml 或 text/xml:
<user><name>Charlie</name><age>35</age></user>二进制数据 (Binary Data):
Content-Type 会是具体的媒体类型,如 image/jpeg, audio/mpeg, application/octet-stream (通用二进制流)。multipart/form-data 封装。GET 和 POST 是 HTTP 协议中最常用的两种请求方法,它们在语义、用途、数据传输方式、安全性等方面存在显著区别:
| 特性 | GET 请求 | POST 请求 |
|---|---|---|
| 语义/用途 | 获取/检索 资源。通常用于从服务器请求数据。 | 提交/创建/更新 资源。通常用于向服务器发送数据以进行处理。 |
| 幂等性 | 幂等:多次请求同一个 GET URL,只要资源未改变,结果都是相同的,不会对服务器状态造成副作用。 | 非幂等:多次提交相同的 POST 请求可能会导致不同的结果(例如,每次提交都会创建新的资源)。 |
| 安全性 | 不安全:不是指数据加密,而是数据以明文显示在 URL 中,容易被浏览器历史记录、服务器日志、代理服务器缓存。不适合传输敏感信息。 | 相对安全:数据放在请求体中,URL 中不显示,因此不会被浏览器历史记录、服务器日志直接记录,但数据本身也不是加密的。 |
| 可见性 | 参数通过 URL 的查询字符串 传输,在地址栏可见。 | 参数通过 请求体 传输,在地址栏不可见。 |
| 数据长度限制 | 有限制:URL 的长度通常有浏览器和服务器的限制(通常在 2KB - 8KB 之间)。 | 无限制:请求体的大小理论上没有限制,只受服务器处理能力和内存的限制。 |
| 缓存 | 可以缓存:浏览器和代理服务器可以缓存 GET 请求的响应,以提高性能。 | 不能缓存:POST 请求的响应默认不能被缓存。 |
| 历史记录/收藏 | 可以收藏/添加到书签:因为请求参数包含在 URL 中。 | 不能收藏/添加到书签:因为请求体中的数据不会被保存。 |
| 回退/刷新 | 回退和刷新页面无副作用。 | 回退或刷新页面时,浏览器通常会提示用户是否重新提交表单,因为重复提交可能导致副作用。 |
总结:
HTTP/1.0 是一个连接在每次请求/响应后都会关闭的协议。这意味着如果客户端请求了网页及其所有图片,它将为每个图片文件建立一个新的连接。
HTTP/2.0 是基于 SPDY 协议的,旨在解决 HTTP/1.x 的性能瓶颈。它引入了多项关键特性来提高 Web 性能。
主要区别:
多路复用(Multiplexing):
二进制分帧(Binary Framing):
头部压缩(Header Compression):
服务器推送(Server Push):
请求优先级(Request Prioritization):
连接管理:
总结表格:
| 特性 | HTTP/1.0 | HTTP/2.0 |
|---|---|---|
| 连接模型 | 短连接(每个请求新连接) | 长连接(单一连接多请求) |
| 传输方式 | 文本协议 | 二进制分帧 |
| 并发性 | 串行请求,队头阻塞 | 多路复用,并行请求,解决队头阻塞(应用层) |
| 头部开销 | 无压缩,重复发送 | HPACK 压缩,减少开销 |
| 服务器推送 | 不支持 | 支持 |
| 请求优先级 | 不支持 | 支持 |
| 性能 | 较低 | 较高 |
HTTP/3.0 是 HTTP/2.0 的演进版本,其最显著的变化是放弃了 TCP 协议,转而使用基于 UDP 的 QUIC (Quick UDP Internet Connections) 协议。
主要区别:
底层传输协议:
TCP 队头阻塞(Head-of-Line Blocking)的根本解决:
连接建立时间(握手延迟):
连接迁移(Connection Migration):
安全性:
总结表格:
| 特性 | HTTP/2.0 | HTTP/3.0 |
|---|---|---|
| 底层协议 | TCP | UDP (基于 QUIC) |
| 队头阻塞 | 应用层解决,但 TCP 层仍存在 | 根本解决(QUIC 的独立流) |
| 连接建立 | TCP + TLS 握手(2-3 RTT) | QUIC 握手(1-RTT,甚至 0-RTT) |
| 连接迁移 | 不支持(IP/端口改变需重连) | 支持(基于 Connection ID) |
| 安全性 | TLS 独立于 HTTP/2.0 实现 | QUIC 内置 TLS 1.3,默认加密 |
| 多路复用 | 支持(基于帧) | 支持(基于 QUIC 流) |
| 服务器推送 | 支持 | 支持 |
| 头部压缩 | HPACK | QPACK(基于 HPACK 改进,更适合乱序交付的 QUIC 流) |
| 应用场景 | 大部分 Web 服务 | 对延迟敏感、移动设备频繁切换网络的场景更优 |
HTTP 是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网数据通信的基础,以明文方式发送数据。
HTTPS 是 HTTP 的安全版本,通过在 HTTP 层和 TCP 层之间添加一个安全层(SSL/TLS),对通信数据进行加密,保证数据的完整性和隐私性。
主要区别:
安全性:
默认端口:
连接方式:
证书:
成本:
SEO(搜索引擎优化):
显示方式:
http://,并且可能会显示“不安全”的警告。https://,并伴随一个锁形图标,表示连接是安全的。SSL/TLS 握手过程简述(HTTPS 的核心):
总结表格:
| 特性 | HTTP | HTTPS |
|---|---|---|
| 安全性 | 明文传输,不安全 | 加密传输,安全(SSL/TLS) |
| 默认端口 | 80 | 443 |
| 证书 | 不需要 | 需要 SSL/TLS 证书 |
| 成本 | 低 | 相对高(证书费用,但有免费证书) |
| SEO | 不利 | 有利 |
| 速度 | 理论上略快(无加密解密开销) | 理论上略慢(加密解密和握手开销),但现代硬件影响很小 |
| 身份验证 | 无 | 服务器身份验证(通过证书) |
TCP 和 UDP 是互联网协议族中两种最主要的传输层协议。它们最核心的区别在于它们提供的服务特性不同:
| 特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
|---|---|---|
| 连接性 | 面向连接的协议:在数据传输前需要建立连接(三次握手),传输结束后需要释放连接(四次挥手)。 | 无连接的协议:数据传输前无需建立连接,直接发送数据报。 |
| 可靠性 | 可靠的:提供数据确认、重传、乱序重组、流量控制和拥塞控制机制,确保数据完整、有序、不重复地到达。 | 不可靠的:不提供数据确认、重传等机制。数据发出后,无法保证其是否到达、是否按序到达或是否重复。 |
| 顺序性 | 保证数据顺序:通过序列号保证数据包按发送顺序交付给应用层。 | 不保证数据顺序:数据包的到达顺序可能与发送顺序不同。 |
| 错误检测 | 通过校验和检测数据错误。 | 通过校验和检测数据错误。 |
| 流量控制 | 通过滑动窗口机制调节发送方发送速率,防止接收方被数据淹没。 | 不提供流量控制。 |
| 拥塞控制 | 通过慢启动、拥塞避免、快速重传、快速恢复等算法防止网络拥塞。 | 不提供拥塞控制。 |
| 传输速度 | 相对较慢,因为需要更多的开销(连接管理、确认、重传等)。 | 相对较快,因为没有连接管理和可靠性保障的开销,直接发送。 |
| 首部大小 | 较长,通常为 20 字节(无选项时)到 60 字节。 | 较短,固定为 8 字节。 |
| 应用场景 | 需要高可靠性、准确性和顺序性的应用,如: Web 浏览 (HTTP/HTTPS) 文件传输 (FTP) 电子邮件 (SMTP/POP3/IMAP) 远程登录 (SSH) | 对实时性要求高,允许少量数据丢失的应用,如: 实时音视频通信 (VoIP, Video Conferencing) 在线游戏 DNS 查询 SNMP (网络管理协议) |
总结:TCP 像打电话,需要先拨号建立连接,通话过程中确保信息传递无误;UDP 像寄明信片,写完就寄,不保证对方是否收到或收到多少张。
TCP 的三次握手是在客户端和服务器之间建立 TCP 连接的过程,其目的是为了初始化序列号并确认双方的发送和接收能力。
过程图示:
sequenceDiagram
participant Client
participant Server
Client->>Server: 1. SYN (seq=x)
Note over Client,Server: 客户端发送同步报文段,请求建立连接,并选择一个初始序列号 x。
Server->>Client: 2. SYN-ACK (seq=y, ack=x+1)
Note over Client,Server: 服务器接收到同步报文段,同意建立连接,并发送同步确认报文段,<br>选择自己的初始序列号 y,并确认收到客户端的 x (ack=x+1)。
Client->>Server: 3. ACK (ack=y+1)
Note over Client,Server: 客户端接收到服务器的同步确认报文段,发送确认报文段,<br>确认收到服务器的 y (ack=y+1)。
Note over Client,Server: 至此,TCP 连接建立成功,可以开始数据传输。详细步骤解释:
第一次握手 (SYN):
SYN=1 (表示这是一个同步报文段,请求建立连接)seq=x (客户端选择的初始序列号 ISN, Initial Sequence Number)SYN_SENT 状态。第二次握手 (SYN-ACK):
SYN=1 (表示这是一个同步报文段)ACK=1 (表示这是一个确认报文段)seq=y (服务器选择的初始序列号 ISN)ack=x+1 (确认收到客户端的 SYN 报文段,并期望收到客户端下一个序列号为 x+1 的数据)SYN_RCVD 状态。第三次握手 (ACK):
ACK=1 (表示这是一个确认报文段)seq=x+1 (这是客户端期望发送给服务器的下一个序列号)ack=y+1 (确认收到服务器的 SYN-ACK 报文段,并期望收到服务器下一个序列号为 y+1 的数据)ESTABLISHED 状态。ESTABLISHED 状态。至此,TCP 连接建立成功,双方可以开始进行数据传输。
为什么需要三次握手而不是两次?
最主要的原因是为了防止已经失效的连接请求报文段突然又传到服务器,从而导致服务器白白等待以及资源的浪费。
简而言之,三次握手确保了双方都确认了对方的收发能力,并且双方都为接下来的数据传输做好了准备。
TCP 主要用来解决在不可靠的网络环境中,提供可靠的、面向连接的端到端数据传输服务的问题。
具体来说,TCP 解决了以下几个核心问题:
可靠性问题:
连接管理问题:
流量控制问题:
拥塞控制问题:
数据分段和组装问题:
总结来说,TCP 解决了以下核心问题:
正是因为 TCP 解决了这些复杂的问题,才使得基于互联网的各种可靠应用(如网页浏览、文件传输、电子邮件等)成为可能。
TCP 连接是 全双工 的,所以关闭时需要双方分别关闭发送通道,采用 四次挥手。
第一次挥手:
客户端主动发送 FIN 报文,表示自己已经没有数据要发送了,请求关闭连接。此时客户端进入 FIN_WAIT_1 状态。
第二次挥手:
服务端收到 FIN 后,回复一个 ACK 确认报文,表示已经知道客户端要断开。此时服务端进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2。
第三次挥手:
服务端若数据发送完毕,也会发送 FIN 报文,表示可以断开连接。此时服务端进入 LAST_ACK 状态。
第四次挥手:
客户端收到 FIN 后,回复一个 ACK 报文,进入 TIME_WAIT 状态(等待 2MSL,确保服务端收到 ACK)。
服务端收到 ACK 后进入 CLOSED,客户端等待 2MSL 后也进入 CLOSED,连接彻底关闭。
关键点:
TIME_WAIT?防止最后一个 ACK 丢失,保证连接可靠释放。TCP 是双向的,就像两个人打电话:
所以要四次,确保双方都彻底说完。
TCP 是 面向字节流 的协议,没有消息边界,所以可能出现粘包和拆包:
粘包:多个小的数据包被 合并到一个 TCP 报文 里发送,接收方一次性读到多个数据。
原因:
拆包:一个大的数据包被拆分成多个 TCP 报文。接收方可能一次只读到部分数据。
原因:
解决方法:
\n)。TCP 传输就像往水管里倒水,没有边界:
解决办法就是在水里加“标记”,比如加固定长度、加分隔符,或者在开头写清楚“我这桶水有多大”。这样接收方就能分清楚消息的边界。
TCP 拥塞控制是防止过多数据注入网络导致拥塞,使用 拥塞窗口 cwnd 进行控制。
慢启动(Slow Start)
拥塞避免(Congestion Avoidance)
快速重传(Fast Retransmit)
快速恢复(Fast Recovery)
可以想象你开车上高速:
这样 TCP 就能既跑得快,又不把“高速公路”堵死。
TCP/IP 四层模型就是应用层、传输层、网络层、网络接口层,对应 OSI 七层的合并版本。
应用层(Application Layer)
传输层(Transport Layer)
网络层(Internet Layer)
网络接口层(Network Access Layer / Link Layer)
这三个都是会话管理机制,区别主要体现在存储位置、安全性和适用场景。
Cookie
Session
Token(例如 JWT)
DNS 解析
建立 TCP 连接
发起 HTTP 请求
服务器处理请求
服务器返回响应
浏览器解析渲染
页面显示
评论