计网合集
·
giftia
tcp/ip 四层模型
- 应用层:http、dns、ftp
- 传输层:tcp、udp
- 网际层:ip
- 网络接口层:数据链路层(mac)、物理层
浏览器输入 url 的整个过程
- url 解析:生成get请求
- dns 解析:域名转 ip
- tcp 三次握手:建立连接
- tls 四次握手:https
- 发送请求报文
- 服务器响应数据
- 客户端渲染数据
- tcp 四次挥手:超时或主动关闭
dns 解析详情
- 查浏览器 dns 缓存
- 查操作系统 dns 缓存
- 查本地 hosts 文件
- 查本地 dns 服务器缓存
- 向本地 dns 服务器发起递归查询请求
- 本地 dns → . 根域名服务器
- 本地 dns → .com 顶级域名服务器
- 本地 dns → qq.com 权威域名服务器
- 本地 dns 拿到 ip 后,返回给浏览器,同时缓存一份以备后续使用
get 和 post 的区别
- get 请求数据放 query,不能太大;post 请求数据放 body
- get 幂等;post 一般不幂等
- get 会被浏览器缓存
- 都不保证安全
cookie 和 session
- 让无状态的 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 四次握手
- 客户端发 ClientHello(TLS 版本 + 随机数 + 加密套件列表)
- 服务端回 ServerHello(确认版本 + 随机数 + 加密套件)+ 证书
- 客户端验证证书,发 Pre-Master Secret(用公钥加密)+ Change Cipher Spec + Finished
- 服务端发 Change Cipher Spec + Finished,握手完成
tcp 三次握手
- 初始都是 close 状态,服务器启动监听变成 listen 状态
- 客户端发送 SYN=1, seq=x,状态变为 syn-sent
- 服务端收到后回复 SYN=1, ACK=1, seq=y, ack=x+1,状态变为 syn-rcvd
- 客户端收到后回复 ACK=1, seq=x+1, ack=y+1,客户端状态变成 established
- 服务端收到确认后也变成 established
tcp 如果是两次握手有什么问题
- 服务端收到 SYN 就直接建立连接,缺少客户端最后一次确认
- 若失效或重传的 SYN 延迟到达,那么服务端也会建立连接,浪费资源
tcp 四次挥手
- 双方 established
- a端发送 FIN=1,seq=x,状态变为 fin-wait-1
- b端接收后回复 ACK=1,seq=y,ack=x+1,状态变为 close-wait
- a端接收b端 ack 后,状态变为 fin-wait-2
- b端再发送 FIN=1,ACK=1,seq=z,ack=x+1,状态变为 last-ack
- a端接收后回复 ACK=1,seq=x+1,ack=z+1,状态变为 time-wait
- b端接收到 ack 后 closed
- a端在 time-wait 经过 2msl 后 closed
tcp 和 udp
- tcp:面向连接、可靠、字节流传输,适合http、文件传输等
- udp:无连接、不可靠、数据报传输,适合dns、直播、游戏等实时场景
tcp 队头阻塞
报文依次:1 2 3 4 5,如果 2 丢了,那么 3 4 5 都要等 2 重传到之后才能消费
拥塞控制算法
reno
- 慢启动:拥塞窗口 cwnd 从 1 开始,每次翻倍
- 拥塞避免:cwnd>=ssthresh,变成线性增长
- 快重传:不等超时,收到 3 个重复 ack 就重传
- 快恢复:重传后不重新慢启动,而是 ssthresh=cwnd/2,cwnd=ssthresh+3,进入拥塞避免
cubic 和 bbr
- cubic 在 reno 基础上,拥塞避免时的增长从线性换成三次函数 W(t) = C*(t-K)^3 + W_max
- bbr 跳出丢包判断,带宽时延积 = 瓶颈带宽 x 最小往返时间