giftiaのblog

计网合集

· giftia

tcp/ip 四层模型

  • 应用层:http、dns、ftp
  • 传输层:tcp、udp
  • 网际层:ip
  • 网络接口层:数据链路层(mac)、物理层

浏览器输入 url 的整个过程

  1. url 解析:生成get请求
  2. dns 解析:域名转 ip
  3. tcp 三次握手:建立连接
  4. tls 四次握手:https
  5. 发送请求报文
  6. 服务器响应数据
  7. 客户端渲染数据
  8. tcp 四次挥手:超时或主动关闭

dns 解析详情

  1. 查浏览器 dns 缓存
  2. 查操作系统 dns 缓存
  3. 查本地 hosts 文件
  4. 查本地 dns 服务器缓存
  5. 向本地 dns 服务器发起递归查询请求
  6. 本地 dns → . 根域名服务器
  7. 本地 dns → .com 顶级域名服务器
  8. 本地 dns → qq.com 权威域名服务器
  9. 本地 dns 拿到 ip 后,返回给浏览器,同时缓存一份以备后续使用

get 和 post 的区别

  • get 请求数据放 query,不能太大;post 请求数据放 body
  • get 幂等;post 一般不幂等
  • get 会被浏览器缓存
  • 都不保证安全
  • 让无状态的 http 带上状态
  • cookie 存客户端,session 存服务端
  • 使用示例:服务端生成 sessionid,客户端请求时通过 cookie 带上(说明是同一个用户)

http 状态码

  • 1xx:需要继续处理
  • 2xx:成功
  • 301:永久重定向
  • 302:临时重定向
  • 400:入参错误
  • 401:未登录
  • 403:登录但无权限
  • 404:找不到
  • 500:服务端错误
  • 502:网关错误

http 和 https

  • http:明文传输,端口80
  • https:加密、身份校验、完整性,端口443

http/1.1 http/2 http/3

  • http/1.1:文本协议,长连接,但有队头阻塞,不支持多路复用。
  • http/2:二进制分帧 + 多路复用 + 头部压缩,解决 HTTP 层队头阻塞,但 TCP 层队头阻塞仍在。
  • http/3:基于 QUIC/UDP,彻底解决队头阻塞,建连更快,加密强制。

ssl/tls 四次握手

  1. 客户端发 ClientHello(TLS 版本 + 随机数 + 加密套件列表)
  2. 服务端回 ServerHello(确认版本 + 随机数 + 加密套件)+ 证书
  3. 客户端验证证书,发 Pre-Master Secret(用公钥加密)+ Change Cipher Spec + Finished
  4. 服务端发 Change Cipher Spec + Finished,握手完成

tcp 三次握手

  1. 初始都是 close 状态,服务器启动监听变成 listen 状态
  2. 客户端发送 SYN=1, seq=x,状态变为 syn-sent
  3. 服务端收到后回复 SYN=1, ACK=1, seq=y, ack=x+1,状态变为 syn-rcvd
  4. 客户端收到后回复 ACK=1, seq=x+1, ack=y+1,客户端状态变成 established
  5. 服务端收到确认后也变成 established

tcp 如果是两次握手有什么问题

  • 服务端收到 SYN 就直接建立连接,缺少客户端最后一次确认
  • 若失效或重传的 SYN 延迟到达,那么服务端也会建立连接,浪费资源

tcp 四次挥手

  1. 双方 established
  2. a端发送 FIN=1,seq=x,状态变为 fin-wait-1
  3. b端接收后回复 ACK=1,seq=y,ack=x+1,状态变为 close-wait
  4. a端接收b端 ack 后,状态变为 fin-wait-2
  5. b端再发送 FIN=1,ACK=1,seq=z,ack=x+1,状态变为 last-ack
  6. a端接收后回复 ACK=1,seq=x+1,ack=z+1,状态变为 time-wait
  7. b端接收到 ack 后 closed
  8. a端在 time-wait 经过 2msl 后 closed

tcp 和 udp

  • tcp:面向连接、可靠、字节流传输,适合http、文件传输等
  • udp:无连接、不可靠、数据报传输,适合dns、直播、游戏等实时场景

tcp 队头阻塞

报文依次:1 2 3 4 5,如果 2 丢了,那么 3 4 5 都要等 2 重传到之后才能消费

拥塞控制算法

reno

  1. 慢启动:拥塞窗口 cwnd 从 1 开始,每次翻倍
  2. 拥塞避免:cwnd>=ssthresh,变成线性增长
  3. 快重传:不等超时,收到 3 个重复 ack 就重传
  4. 快恢复:重传后不重新慢启动,而是 ssthresh=cwnd/2,cwnd=ssthresh+3,进入拥塞避免

cubic 和 bbr

  • cubic 在 reno 基础上,拥塞避免时的增长从线性换成三次函数 W(t) = C*(t-K)^3 + W_max
  • bbr 跳出丢包判断,带宽时延积 = 瓶颈带宽 x 最小往返时间