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