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

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