← 返回笔记
book12 min read

《图解 HTTP》

《图解 HTTP》

这篇笔记包含 MDX 无法直接解析的旧 Markdown 语法。

原文内容仍然保留在文件中,可以逐步清理为标准 MDX。

# 《图解 HTTP》

最近阅读完图解 http,扫盲了一次 http 基础,在此写一下总结。

## 了解 web 及网络基础

### TCP/IP 架构

| 协议层     | 协议 | 描述                                       |
| ---------- | ---- | ------------------------------------------ |
| 应用层     | http | 生成基于目标服务器的 http 请求报文         |
| 传输层     | tcp  | 为了方便通信,将 http 请求报文分割成报文段 |
| 网络层     | ip   | 搜索对方的地址,一边中转一边传送           |
| 数据链路层 | 网络 | 处理请求                                   |

## 简单的 http 协议

http 是无状态的协议。

### 请求报文

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成。

### 响应报文

响应报文是由协议版本、状态码、状态码短语、可选的响应首部字段以及实体主体构成。

### 常用的请求方法

- GET 获取资源。
- POST 传输实体的主体。
- PUT 传输文件。
- HEAD 获得报文首部(类似 get,不返回报文实体)。
- DELETE 删除文件。
- OPTIONs 询问支持的方法。
- TRACE 追踪路径(让服务器将之前的请求通信返回给客户端)。
- CONNECT 要求用隧道协议连接代理(主要使用 SSL)。

### 持久化链接

持久连接 keep-live,串行输入,第二个请求需等待第一个请求响应完才能执行。

| 持久链接示例  |
| ------------- |
| 建立 TCP 连接 |
| 请求 1----->  |
| <-----响应 1  |
| 请求 2----->  |
| <-----响应 2  |
| 关闭 TCP 连接 |

管线化,多个请求可同时发出,不需等待。

| 管线化示例    |
| ------------- |
| 建立 TCP 连接 |
| 请求 1----->  |
| 请求 2----->  |
| <-----响应 1  |
| <-----响应 2  |
| 关闭 TCP 连接 |

## http 报文内的 http 信息

### http 报文

| http 报文     |
| ------------- |
| 报文首部      |
| 空行(CR+LF) |
| 报文主体      |

## 返回结果的 http 状态码

- 200 OK 请求成功。
- 204 No Content 请求处理成功,但没有资源返回。
- 206 Partial Content 请求到资源的一部分。
- 301 Move Permanently 永久重定向。
- 302 Found 临时重定向。
- 303 See Other 临时重定向,采用 get 方法。
- 304 Not Modified 没有改变。
- 307 Temporary Redirect 临时重定向,采用之前的方法,不会强制使用 get 方法。
- 400 Bad Request 请求报文中存在语法错误。
- 401 Unauthorized 发送的请求需要有认证信息。
- 403 Forbidden 请求的资源被服务器拒绝。
- 404 Not Found 没有找到对应资源。
- 500 Internal Server Error 服务器端报错。
- 503 Service Unavaliable 服务器超负载或在维护。

## 与 http 协作的 web 服务器

### 通信数据转发程序

代理:

转发客户端请求到服务器,或转发服务器响应到客户端。

网关:

转发服务器通讯的服务器,可以处理请求,客户端不易察觉,可冒充服务器。可使用非 http 协议通讯。

隧道:

与服务器建立一条通讯线路,确保安全通信。

## http 首部

首部字段

为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等。

请求报文首部:方法,uri,http 版本,请求首部字段,通用首部字段,实体首部字段。

响应报文首部:http 版本,状态码,响应首部字段,通用首部字段,实体首部字段。

### 通用首部字段

| 首部字段          | 描述                                                   |
| ----------------- | ------------------------------------------------------ |
| CaChe-Control     | 控制缓存机制                                           |
| Connection        | 控制不再转发的首部字段,管理持久连接                   |
| Date              | 创建 http 报文的时间                                   |
| Trailer           | 事先说明报文主体后包含的首部字段                       |
| Transfer-Encoding | 传输报文采用的编码方式                                 |
| Upgrade           | 检测 http 协议以及其他协议是否可使用更高的版本进行通信 |
| Via               | 追踪客户端和服务器之间的请求和响应报文的传输路径       |
| Warning           | 告知客户缓存相关的问题警告                             |

### 请求首部字段

| 首部字段            | 描述                                                              |
| ------------------- | ----------------------------------------------------------------- |
| Accept              | 通知服务器,用户代理能够处理的媒体类型以及媒体类型的优先级        |
| Accept-Charset      | 通知服务器,用户代理支持的字符集以及字符集的优先级                |
| Accept-Encoding     | 通知服务器,用户代理支持的内容编码以及内容编码的优先级            |
| Accept-Language     | 通知服务器,用户代理能够处理的自然语言集,以及优先级              |
| Authorization       | 通知服务器,用户代理的认证信息                                    |
| Except              | 通知服务器,期望出现的某种特定行为,如服务器不理解,返回 417      |
| From                | 通知服务器,用户代理的电子邮箱                                    |
| Host                | 通知服务器,请求资源的主机名和端口号,用于一台服务器多个 web 服务 |
| If-Match            | 如果 Etag 一致时服务器才接受请求                                  |
| If-Modified-Since   | 如果资源更新了,则希望能处理请求                                  |
| If-None-Match       | 如果 Etag 不一致时服务器才接受请求                                |
| If-Range            | 范围请求                                                          |
| If-Unmodified-Since | 如果资源未更新,则希望处理请求                                    |
| Max-Forwards        | 没经过一层代理,字段值-1                                          |
| Proxy-Authorization | 告知服务器认证信息                                                |
| Range               | 范围请求                                                          |
| Referer             | 告知服务器请求的原始资源 URI                                      |
| TE                  | 告知服务器客户端能够处理响应的传输编码,以及优先级                |
| User-Agent          | 告知服务器客户端信息                                              |

### 响应首部字段

| 首部字段           | 描述                                            |
| ------------------ | ----------------------------------------------- |
| Accept-Ranges      | 告知客户端能否处理范围请求                      |
| Age                | 告知客户端,源服务器在多久之前创建了响应        |
| ETag               | 告知客户端实体标识                              |
| Location           | 将响应接收方引导至某个与请求 URI 位置不容的资源 |
| Proxy-Authenticate | 把由代理服务器所要求的认证信息发送给客户端      |
| Retry-After        | 告知客户端多久以后再次发送请求                  |
| Server             | 告知客户端服务器端信息                          |
| Vary               | 对缓存进行控制                                  |
| WWW-Authenticate   | 用于 http 访问认证                              |

### 实体首部字段

| 首部字段         | 描述                                             |
| ---------------- | ------------------------------------------------ |
| Allow            | 通知客户端能够支持的方法 Get,Head 等            |
| Content-Encoding | 告知客户端,服务器对实体的主体部分采用的内容编码 |
| Content-Language | 告知客户端,服务器对实体的主体部分使用的自然语言 |
| Content-Length   | 实体的主体部分的发小                             |
| Content-Location | 给出报文主体部分对应的 URI                       |
| Content-MD5      | 检查报文主体在传输过程中是否保持完整             |
| Content-Range    | 告知客户端返回的实体属于哪一部分                 |
| Content-Type     | 实体主体的媒体类型                               |
| Expires          | 告知客户端资源失效的日期                         |
| Last——modified   | 资源最终的修改时间                               |

## 确保 web 安全的 https

http 缺点

- 通信使用铭文,内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以有可能已遭篡改。

https

http+加密+认证+完整性保护 = https

对称加密,非对称加密。
https 慢,通信慢(加密解密耗时,http 通信部分变长)。

## 确认访问用户身份认证

| 认证方式       | 描述                               | 缺点                         |
| -------------- | ---------------------------------- | ---------------------------- |
| Basic 认证     | http 请求首部字段 Authorization    | 容易被窃听                   |
| Digest 认证    | 认证时加上质询码,降低窃听危险     |
| SSL 客户端认证 | 在客户端安装证书,以确保客户端身份 | 客户端必须安装证书,需要收费 |
| 基于表单认证   | Session+Cookie                     |

## 基于 http 的功能追加协议

### http 瓶颈

- 一条连接上只可发送一个请求。
- 请求只能从客户端开始。客户端不可以接收除响应意外的指令。
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大。
- 发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
- 可任意选择数据压缩格式。非强制压缩发送。

### 解决方案

- ajax(局部更新)。
- comet(长连接,耗费资源)。
- SPDY
- WebSocket

在 http 层和 SSL 层之间,增加 SPDY 会话层,用以实现:

- 多路复用(只适用于同一域名下)
- 赋予请求优先级
- 压缩 http 首部
- 推送功能
- 服务器提示功能

WebSocket:

- 不使用 http 协议,避免协议瓶颈。
- 推送功能。
- 减少通信量,首部信息小。

Http2:

- SPDY。
- Http Speed + Mobility。
- Network-Friendly Http Upgrade。

## 构建 web 内容的技术

- XML
- JSON

## web 的攻击技术

- XSS。
- SQL 注入攻击。
- OS 命令注入攻击(只要能调用 shell 函数的地方就存在被攻击的风险)。
- HTTP 首部注入攻击(增加空白行,篡改请求报文实体)。
- 目录遍历攻击(通过推测目录,获取本无权限获取的资源)。
- 远程文件包含漏洞(传递参数获取文件,可传递攻击者的文件)。
- 不正确的错误消息处理。
- 会话劫持(攻击者拿到用户会话 id 宠儿冒充用户)。
- 跨站点伪造请求 CSRF(通过设置陷阱,强制对已认证用户进行非预期的个人信息操作)。

[next-mdx-remote] error compiling MDX: Unexpected character `-` (U+002D) before name, expected a character that can start a name, such as a letter, `$`, or `_` More information: https://mdxjs.com/docs/troubleshooting-mdx