网络
TCP 可靠传输
TCP 重传
- 超时重传:设置一个计时器,时间应略长于RTT。如果超时了还没有收到ACK,则立即重传
- 快速重传:当连续收到三个相同的 ACK 时,立即重传
- SACK(选择性确认):接收方可以告诉发送方接收到了哪几个消息,还缺哪个消息
- DSACK(重复确认):接收方收到两个2,就会用DSACK告诉发送方,它有两个 2,别重传了。只是因为网络延迟问题。
流量控制 & 拥塞控制
流量控制
- 核心机制:滑动窗口(接收窗口 rwnd)
- 实现逻辑:接收方通过 ACK 报文通告当前可用缓冲区大小(rwnd),发送方实际发送窗口 = min(拥塞窗口 cwnd, 接收窗口 rwnd)
- 目的:防止发送方速率超过接收方处理能力,避免接收缓冲区溢出
拥塞控制(基于拥塞窗口 cwnd,单位:MSS)
慢启动阶段
- 初始状态:cwnd = 1,按指数增长
- 增长规则:每收到一个 ACK 确认,cwnd 翻倍
- 切换条件:当 cwnd ≥ 慢启动阈值(ssthresh)时,进入拥塞避免阶段
拥塞避免阶段
- 增长规则:每经过一个 RTT 周期,cwnd 线性加 1(平稳增长,降低网络拥塞风险)
- 异常处理逻辑:
- 触发超时重传(判定严重拥塞):
- ssthresh = 当前 cwnd / 2
- cwnd 重置为 1,重新进入慢启动阶段
- 触发快速重传(连续 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
- HTTP 1.0:
- 每请求一个东西,都建立一次TCP连接,要三次握手四次挥手
- HTTP 1.1:
- 支持长连接,同一个连接可以发送多个请求
- cache-control字段
- HTTP 2.0:
- 多路复用,一个连接可以同时处理多个请求
- 头部压缩。HPACK 算法,第一次请求时,头部字段和值会完整传输。在服务器和客户端都维护一张 HPACK 表,里面存放来自客户端的请求头。客户端之后请求,如果请求头没有变化,就只需要发送HPACK表的响应索引。
- 请求体请求头都是二进制格式,数据传输快
- 服务器推送:客户端请求某个资源时,服务器还能主动返回客户端可能会用到的其它资源
- HTTP 3.0:
- UDP
- 自己实现拥塞控制
HTTP 请求报文
- 请求行 request line
- GET/POST
- HTTP版本
- url(统一资源定位符)
- 请求头
- 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值
- 请求体:如果是GET方法,则请求体为空;POST、PUT方法有请求体
- GET: example.com/search?query=keyword
- POST: example.com/submit, 数据在 request body 中
HTTP响应报文
- 响应头
- ETag: 服务器首次响应某个请求时,为资源内容生成ETag。客户端再次请求同一资源,想让服务器判断资源是否过期,就在if-none-match中带上之前保存的ETag. 服务器收到之后,如果ETag没有变化,就直接返回304 Not Modified. 则客户端可以直接使用缓存
- Content-Type
- 状态行
- 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
- local DNS cache. 设备先查本地操作系统 DNS 缓存(如 Windows 的 DNS Client 服务缓存、macOS 的 dnscache);若未命中,再查本地 hosts 文件(手动配置的域名 - IP 映射);部分家用路由器也会有自身 DNS 缓存,若设备优先走路由器缓存,会先查这里。
- default DNS server: 默认递归 DNS 服务器. the device sends a request to the default DNS server set by your Internet service provider(ISP比如中国电信)
- Root DNS Servers. 递归 DNS 服务器向 13 组全球根 DNS 服务器 发起查询。根服务器不存储具体域名的 IP,只返回对应顶级域(TLD)服务器的地址(比如 .com/.cn/.org 服务器)。
- Top - level domain (TLD) servers. TLD 服务器不存最终 IP,返回对应权威 DNS 服务器的地址(即目标域名所属的 DNS 服务器,由域名注册商配置)。
- Authoritative DNS Servers request