Http 权威指南读书笔记

温故而知新, 可以为师矣…

报文

HTTP 报文都是纯文本, 不是二进制代码
HTTP 报文包括三个部分:

  • 起始行 报文的第一行就是起始行, 在请求报文中用来说明要做什么, 在响应报文里面说明出现了什么状况
  • 首部字段 起始行后面有零或多个首部字段. key: value 格式.首部以一个空行结束.添加一个首部字段和添加一个新行一样简单.
  • 主体 空行之后就是可选的报文主体

    连接

    TCP/IP

    HTTP 是应用层协议,不操心网络通信的具体细节
    TCP/IP 提供:
  • 无差错的数据传输
  • 按序传输(数据总是会按照发送的顺序到达)
  • 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)

    Web 结构组件

  • 代理
  • 缓存
  • 网关
  • 隧道 对 HTTP 通信报文进行盲转发的特殊代理
  • Agent 代理 _发起自动 HTTP 请求的半智能 Web 客户端

    连接

    HTTP 时延

  • dns 解析耗时
  • TCP 连接建立握手
  • TCP 慢启动拥塞控制

    TCP 连接会随着时间进行自我调谐, 起初会限制连接的最大速度,如果苏剧成功传输,会随着时间的推移提高传输的速度,这种调谐成为 TCP 慢启动, 用于防止突然过载和拥塞
    TCP 慢启动限制了一个 TCP 端点在任意时刻可以传输的分组数.

  • 数据聚集的 Nagle 算法
  • 用于稍待确认的 TCP 延迟确认算法
  • TIME_WAIT时延和端口耗尽

    幂等性

    如果一个事务, 不管是执行一次还是很多次,得到的结果都相同,这个事务就是幂等的,实现者们可以认为 GET, HEAD, PUT, DELETE, TRACE 和 OPTIONS 方法都共享这一特性
    | HTTP Method | Idempotent | Safe |
    | :———: | :——–: | :—: |
    | OPTIONS | yes | yes |
    | GET | yes | yes |
    | HEAD | yes | yes |
    | PUT | yes | no |
    | POST | no | no |
    | DELETE | yes | no |
    | PATCH | no | no |

    关闭连接

    TCP 连接时双向的. TCP 连接的每一端都有一个输入队和一个输出队列,用于数据的读写.放入一端输出队列中的数据最终会出现在另一端的输入队列中

    完全关闭和半关闭

    应用程序可以关闭 TCP 输入和输出信道中的任意一个,或者将两者都关闭了.套接字调用 close() 会将 TCP 连接的输入和输出信道都关闭了,称为完全关闭.还可以用套接字调用 shutdown() 单独关闭输入或输出信道,称为瓣关闭.

    Web 服务器

  • 建立连接 接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭
  • 接收请求 从网络中读取一条 HTTP 请求报文
    • 解析请求行,查找请求方法和指定的资源标识符和版本号.
    • 读取以 CRLF 结尾的保温首部
    • 检测到以 CRLF 结尾的, 标识首部结束的空行 (如果有的话)
    • 读取请求主体 (如果有的话)
  • 处理请求 对请求报文进行解释,并处理
  • 访问资源 访问报文中指定的资源
  • 构建响应 创建带有正确首部的 HTTP 响应报文
    如果有响应主体的话,相应报文中通常包括:
    • 描述了响应主体 MIME 类型的 Content-Type 首部
    • 描述了响应主题长度的 Content-Length 首部
  • 发送响应 将相应回送给客户端
  • 记录事务处理过程 _日志_

    代理

    如何获取流量

  • 修改客户端
  • 修改网络
  • dns
  • web 服务重定向

    cookie

    会话 cookie | 持久cookie
    区别在于他们的过期时间

    工作方式

    类似标签, Web 服务器给当前用户贴上一个由 key=value 这样的信息构成的任意列表,并通过 Set-Cookie 首部将其贴到用户身上. cookie 可以包含任意信息.

    内容发布

Tips

有条件的请求

有条件的请求是通过以 ‘IF-‘ 开头的有条件的首部来实现的.
验证码分为 弱验证码强验证码

1
2
GET /announce.html HTTP/1.0
If-Modified-Since:Sat,29 Jun 2002,14:30:00 GMT

如果 - 从 … 之后 ?? 修改过
每个有条件的请求都通过特定的验证码来发挥作用. 验证码是文档实例的一个特殊属性,用它来测试条件为真.