← 博客

网络

TCP 可靠传输

TCP 重传

  1. 超时重传:设置一个计时器,时间应略长于RTT。如果超时了还没有收到ACK,则立即重传
  2. 快速重传:当连续收到三个相同的 ACK 时,立即重传
  3. SACK(选择性确认):接收方可以告诉发送方接收到了哪几个消息,还缺哪个消息
  4. DSACK(重复确认):接收方收到两个2,就会用DSACK告诉发送方,它有两个 2,别重传了。只是因为网络延迟问题。

流量控制 & 拥塞控制

流量控制

  • 核心机制:滑动窗口(接收窗口 rwnd)
  • 实现逻辑:接收方通过 ACK 报文通告当前可用缓冲区大小(rwnd),发送方实际发送窗口 = min(拥塞窗口 cwnd, 接收窗口 rwnd)
  • 目的:防止发送方速率超过接收方处理能力,避免接收缓冲区溢出

拥塞控制(基于拥塞窗口 cwnd,单位:MSS)

  1. 慢启动阶段

    • 初始状态:cwnd = 1,按指数增长
    • 增长规则:每收到一个 ACK 确认,cwnd 翻倍
    • 切换条件:当 cwnd ≥ 慢启动阈值(ssthresh)时,进入拥塞避免阶段
  2. 拥塞避免阶段

    • 增长规则:每经过一个 RTT 周期,cwnd 线性加 1(平稳增长,降低网络拥塞风险)
    • 异常处理逻辑:
      1. 触发超时重传(判定严重拥塞):
        • ssthresh = 当前 cwnd / 2
        • cwnd 重置为 1,重新进入慢启动阶段
      2. 触发快速重传(连续 3 个重复 ACK,判定轻微拥塞):
        • ssthresh = 当前 cwnd / 2
        • cwnd = ssthresh,进入快恢复阶段,cwnd 从此线性增长

OSI七层模型

1. 应用层:

  • HTTP,传输单位是message(报文)
  • FTP传文件(字节流)
  • SMTP负责电子邮件(报文,并非HTTP 报文)

2. 表示层:

  • representation layer
  • 编码解码、加密解密

3. 会话层:

  • session layer, 管理登录状态

4. 传输层

  • TCP/UDP: 只在源主机和目的主机起作用。
  • 把报文加上port(源端口号+目标端口号),封装成 segment
  • 接收时,TCP 把字节流变成多个 segment,然后把 message 根据 port number转发到不同的端口

5. 网络层

  • 把 segment 加上源 IP 和目标 IP,封装成包
  • IPv4: 前 24 位代表子网,后 8 为代表设备 ID
  • 作用 1:把包从一个 router 发到另一个 router
  • 作用 2:根据routing算法规划出包的转移路径(关心从源主机到目标主机整个路线上经过的所有路由器)

6. 数据链路层

  • 把包加上客户端MAC和目标MAC,封装成帧。MAC地址即网卡地址。
  • 若在同一子网。它发一个ARP给子网中的所有设备,问谁的IP是xxx, 目标设备返回它的MAC地址。

7.物理层

  • 传输比特流0和1

TCP/IP Model

  • Application Layer
  • Transport Layer
  • Internet Layer
  • Network Access Layer

HTTP 1.0, 1.1, 2.0

  1. HTTP 1.0:
  • 每请求一个东西,都建立一次TCP连接,要三次握手四次挥手
  1. HTTP 1.1:
  • 支持长连接,同一个连接可以发送多个请求
  • cache-control字段
  1. HTTP 2.0:
  • 多路复用,一个连接可以同时处理多个请求
  • 头部压缩。HPACK 算法,第一次请求时,头部字段和值会完整传输。在服务器和客户端都维护一张 HPACK 表,里面存放来自客户端的请求头。客户端之后请求,如果请求头没有变化,就只需要发送HPACK表的响应索引。
  • 请求体请求头都是二进制格式,数据传输快
  • 服务器推送:客户端请求某个资源时,服务器还能主动返回客户端可能会用到的其它资源
  1. HTTP 3.0:
  • UDP
  • 自己实现拥塞控制

HTTP 请求报文

  1. 请求行 request line
  • GET/POST
  • HTTP版本
  • url(统一资源定位符)
  1. 请求头
  • user-agent
  • Host: www.test.edu.cn
  • Cookie: 123456
  • Accept: image/jpeg
  • Accept-Encoding: gzip, deflate (说明自己可以接收哪些压缩方法)
  • Content-Type:(如果有请求体的话)
  • Content-Length: 112(如果有请求体的话)
  • Connection: Keep-alive
  • If-None-Match:若客户端想验证缓存资源的有效性,就在请求中带上它,里面就是该资源的ETag值

  1. 请求体:如果是GET方法,则请求体为空;POST、PUT方法有请求体
  • GET: example.com/search?query=keyword
  • POST: example.com/submit, 数据在 request body 中

HTTP响应报文

  1. 响应头
  • ETag: 服务器首次响应某个请求时,为资源内容生成ETag。客户端再次请求同一资源,想让服务器判断资源是否过期,就在if-none-match中带上之前保存的ETag. 服务器收到之后,如果ETag没有变化,就直接返回304 Not Modified. 则客户端可以直接使用缓存
  • Content-Type
  1. 状态行
  • status code

HTTP 缓存

缓存分为private cache和shared cache.

  • private cache:一般指browser cache,对用户私有
  • shared cache: CDN之类

HTTP1.1在header中引入了cache control字段

  • server在响应头中可设置cache control
    • no-store: 客户端不能存储任何版本的资源,每次请求都要从服务器获取完整数据
    • no-cache:必须先和server确认缓存的有效性,才能用
    • private: 只有客户端浏览器可以存储
    • max-age=[秒]: 客户端在多长时间之内可以直接用缓存
    • s-maxage=[秒]: 针对shared cache,优先级比max-age更高
  • client设置cache control
    • no-cache: 要求服务端验证缓存的有效性(手动刷新页面)

DNS Lookup

alt text guide by Cloudflare

  1. local DNS cache. 设备先查本地操作系统 DNS 缓存(如 Windows 的 DNS Client 服务缓存、macOS 的 dnscache);若未命中,再查本地 hosts 文件(手动配置的域名 - IP 映射);部分家用路由器也会有自身 DNS 缓存,若设备优先走路由器缓存,会先查这里。
  2. default DNS server: 默认递归 DNS 服务器. the device sends a request to the default DNS server set by your Internet service provider(ISP比如中国电信)
  3. Root DNS Servers. 递归 DNS 服务器向 13 组全球根 DNS 服务器 发起查询。根服务器不存储具体域名的 IP,只返回对应顶级域(TLD)服务器的地址(比如 .com/.cn/.org 服务器)。
  4. Top - level domain (TLD) servers. TLD 服务器不存最终 IP,返回对应权威 DNS 服务器的地址(即目标域名所属的 DNS 服务器,由域名注册商配置)。
  5. Authoritative DNS Servers request