阅读 |《图解HTTP》

Posted on Mar 7, 2024

{\{< neodb "https://neodb.social/book/3BVOzAS5pkNSWDfRT5CMkn" >}\}

阅读笔记,讲得比较浅,结构有点散,但还是收获了一些

HTTP 协议

用于服务端和客户端之间的通信

// 请求报文:
// 请求方法 + uri + 协议版本 + [请求首部字段] + 内容实体
// 请求头 + 请求行 + 请求体,每一部分用换行符区分

GET /index.htm HTTP/1.1
Host:hackr.ip
  • HTTP 是一种无状态 stateless 协议,状态交给 cookie etc.

使用 cookie 进行状态管理,通过在请求、响应报文中添加 cookie 信息控制客户端的状态

  • cookie 产生于服务端,包含在发送给客户端的 header 里的 set-cookie 字段
  • 客户端根据 set-cookie 保存一段纯文本信息
  • 再次向服务端发请求时,请求报文会带上这个 cookicookie
  • 服务端接收到 cookie 和服务端记录对比,得到之前的状态信息

为 Cookie 服务的头部字段见 [[HTTP#Cookie 相关字段]]

用 Cookie 管理 Session(会话)

Set-Cookie:<Session-ID>

Ajax

解决 HTTP 的缺点:

  • 1 条链接上只能发一个请求
  • 头部未经压缩就发送,头部信息越多延迟越大
  • 请求只能从客户端开始,客户端不能接收响应以外的指令

核心 API:XMLHttpRequest 实现无刷新局部更新

HTTP 头部

通用头部字段

Cache-control:private,max-age:0,no-cache // 控制缓存
Collection:close // 断开连接
...

请求头部字段

User-Agent:Mozilla/5.0 // 将创建请求的浏览器和用户代理名称等信息发给服务端,写爬虫用
Accept: text/html // 通知服务端,用户代理能处理的数据类型/格式和q权重
Authorization:Basic
dWufaslngafaJFljfsl== // 通知服务端,用户代理的认证信息
// If-xxx 条件请求
If-Modified-Since:Thu,15 Apr 2004
00:00:00 GMT // 如果在指定日期之后,资源发生了更新,服务端才会接受请求,用于确认本地资源的有效性
Range:bytes=5000-10000
...

响应头部字段

Age:600 // 源服务器600s前创建了响应
Server:Apache/2.2.17(Unix) // 当前服务器上HTTP服务器的信息

实体头部字段

Content-Language:zh-CN
Content-Length:15000 // 实体主体的大小(字节)
Content-Type:text/html;charset=UTF-8 // 实体主体内对象的媒体类型
Set - Cookie // 响应头部字段
Cookie // 请求头部字段

其他头部字段

X - Frame - Options
X - XSS - Protection

HTTP/1.1 中的 7 种方法

GET

请求资源

POST

发送实体的主体 entity body

PUT

传输文件,类似 POST,但是没有验证机制,几乎不使用

获取报文首部,和 GET 一样,只是不返回报文主体部分

DELETE

删除文件,和 PUT 相反,同样的原因不推荐使用

OPTIONS

查询资源支持什么方法

  • INVITE
  • ACK
  • CANCEL

TRACE

服务端把接收到的请求报文再还给客户端,这样可以检查请求有没有/怎么样被加工篡改的

CONNECT

HTTP 报文

是多行数据构成的字符串文本

  • 报文 message
  • 实体 entity

请求报文

响应报文

多部分对象集合 Multipart

包含图片、文本、视频等多个不同类型的数据

multipart/form-data:上传 web 表单文件 multipart/byteranges:范围请求,允许服务端只发送 HTTP 消息的一部分到客户端;传输大媒体文件、断点续传时很有用

断点续传(获取部分内容的范围请求 Range Request)

  • 用首部字段 Range 指定资源的 byte 范围
  • 范围请求的对应状态码为 206,如果服务端无法响应范围请求,会返回 200 和完整的实体内容

例如:有一份 10000 字节的资源

GET /tip.jpg HTTP/1.1
Host: www.usagidesign.jp
// 返回5001-10000的部分
Range: bytes = 5001-10000
// 返回5001之后的全部
Range: bytes = 5001-

内容协商 content negotiation==i8n

根据浏览器的默认语言(en),返回一个 uri 的 en 页面

依据是请求报文中的一些首部字段:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商可以由服务端或客户端完成

HTTP 状态码

1-信息类 2-成功 3-重定向 4-客户端错误 5-服务端错误

Web 服务器

静态 web 服务器 Nginx

数据转发

  • 代理
    • 缓存代理 CDN
  • 网关:网关是一个概念,是协议转换器(把 HTTP 转换为其他协议)
  • 隧道

HTTPS

http 的缺点:

  • 明文传输
  • 不验证通信方的身份
  • 无法保证完整性(中间人攻击)

TCP

提供字节流服务(分割数据包)

three-way handshaking

TCP 的标志 flag:SYN、ACK

  • SYN 是发送端生成的(请求同步)
  • ACK 是接收端生成的(确认同步)

第一次握手:发送端发送请求(syn=j) 第二次握手:接收端返回 SYN、ACK 标志,告诉对方发送功能正常,自己的接收功能正常 第三次握手:发送端告诉接收端,你的收发功能都正常(响应能力),可以开始通信了

  • SYN blood 攻击:接到第 2 次握手后不回应第 3 次握手,服务器会发送 5 次请求然后丢弃请求。解决方法:cookie 记录恶意 ip、缩短服务器的等待时间

为什么不 2 次握手:如果是 2 次握手,客户端发送一次请求后网络中断,一段时间后这个废弃的请求到达服务器,服务器就会正常响应,建立一个无效的链接,增加了网络开销

DNS

应用层,把域名解析到 IP(联想:ARP)

URI/URL

URL 是 URI 的子集,url 一定是 uri,比如网址画 url 就是 uri,同时邮件地址、电话号码也是 uri

用户身份认证

认证方式:

  • BASIC(401)
  • DIGEST
  • SSL 客户端
  • FormBase