Skip to content
大纲

网络通信

网络模型

  • 应用层:HTTP、域名系统
  • 传输层:TCP、UDP
  • 网络层
  • 链路层

传输层 - TCP

三次握手

  1. 请求方 -- SYN --> 响应方;请求方进入 SYN_SEND 状态
  2. 响应方(接收 SYN) -- ACK + SYN --> 请求方;响应方进入 SYN_RECV 状态
  3. 请求方(接收 ACK + SYN) -- ACK --> 响应方;请求方进入 ESTABLISHED 状态

四次挥手

  1. 请求方 -- FIN --> 响应方;请求方不再发送数据,进入 FIN_WAIT_1 状态
  2. 响应方(接收 FIN) -- ACK --> 请求方;
    • 响应方进入 CLOSE_WAIT 状态
    • 请求方(接收 ACK) 进入 FIN_WAIT_2 状态
  3. 响应方(数据发送完) -- FIN --> 请求方;响应方进入 LAST_ACT 状态
  4. 请求方(接收 FIN) -- ACK --> 响应方;请求方进入 TIME_WAIT 状态
    • 响应方(接收 ACK) 进入 CLOSED 状态
    • 请求方(经过最大生存期后)进入 CLOSED 状态

说明:第二次和第三次可以合并发送

重传机制

在发送报文时会开启定时器并保留副本

  • 在定时器时间内接收到响应则取消定时器并删除副本
  • 在超出定时器时间外会重置定时器并重新发送报文
  • 一般超时重传时间取 加权平均往返时间 + 4 倍加权平均往返偏差时间

滑动窗口

发送方和接收方分别维护发送窗口和接收窗口

  • 发送窗口按序号发送帧,直到全部帧处于待确认状态
  • 接收窗口按序号接收帧,接收后发送确认帧后滑动窗口
  • 发送窗口接收到确认帧,删除重发表对应帧后滑动窗口

根据发送窗口和接收窗口的大小分为

  • 停等协议:发送窗口=1,接收窗口=1;需要不断等待应答,效率低下
  • 后退 n 协议:发送窗口>1,接收窗口=1;重传时需要后退到错误帧并重传
  • 选择重传协议:发生窗口>1,接收窗口>1;传输效率较高,需要接收方具有足够的缓冲空间

拥塞控制

  1. 慢启动:给定一个初始 cwnd,每次收到确认包时大小翻倍,直到达到 ssthresh 或丢包
  2. 拥塞避免:cwnd 达到 ssthresh 时,采用线增积减的反馈机制控制 cwnd 大小
    • 若网络良好,则每经过一个 RTT ,cwnd 与 ssthresh += 1MSS
    • 若网络拥塞,则 ssthresh 减半,cwnd 置为 1MSS,进入慢启动阶段
  3. 快速重传:当发送方收到 4 次相同的确认时,忽略超时计时器并立即重发,进入快速恢复阶段
  4. 快速恢复:发送方将 cwnd 与 ssthresh 减半,进入拥塞避免阶段

说明:

  • MSS: 最大分段大小,拥塞窗口的大小单位
  • cwnd: 拥塞窗口,每次发送数据包的大小,由发送方维护
  • ssthresh: 慢开始门限,控制拥塞窗口的最大值

传输层 - UDP

<源端口号><目的端口>
<报文长度><报文校验码>
<数据内容>

特点:报文结构简单,开销低,传输效率高;传输时不建立连接,无状态、不可靠

用途:DNS,广播,及时通话


应用层 - DNS

域名系统时将域名与 IP 地址相互映射的分布式数据库

域名解析流程

  • 静态映射:通过本地缓存或配置进行查询
    1. 客户端缓存
    2. 本地 host
    3. 本地 DNS 缓存
    4. 本地 DNS 服务器
  • 动态映射:通过其他域名服务器进行查询
    1. 跟域名服务器
    2. 顶级域名服务器
    3. 权威域名服务器

DNS 基于 UDP 协议实现,理由如下

  • DNS 解析发生在数据传输之前,追求快速
  • DNS 解析报文简单,域名服务器相对稳定

注:当报文超过 512 字节时,应当转为 TCP 进行查询


应用层 - HTTP

基本内容

报文格式

  • 请求报文
    • 请求行:方法 地址 协议
    • 请求头
    • 空行
    • 请求体
  • 响应报文
    • 状态行(协议 状态)
    • 响应头
    • 恐慌
    • 响应体

请求方法:GET POST PUT PATCH DELETE OPTIONS HEAD TRACE CONNECT

状态码

  • 1xx:消息类通知
  • 2xx:成功类通知
  • 3xx:重定向通知;301-永久重定向,302-临时重定向,304-命中协商缓存
  • 4xx:客户端错误;400-请求错误,401-用户未认证,403-请求被拒绝,404-资源不存在
  • 5xx:服务端错误:500-服务器异常,502-网关错误,504-网关超时

HTTP1.x

传输特点

  • 持久连接:设置 Connection: Keep-Alive开启
  • 管道机制
  • 断点续传
  • 虚拟网络

存在问题

  • 明文传输:可以被窃听、篡改、冒充
  • 性能浪费:由 持久连接 导致占用服务器资源
  • 对头阻塞:由 管道机制 导致有序请求阻塞时整列请求受阻

HTTPS

HTTPS = HTTP + SSL/TLS

SSL/TLS 进行了以下处理

  • 信息加密,避免窃听
  • 信息校验,避免篡改
  • 证书校验,避免冒充

工作流程

  1. 客户端 -- client hello --> 服务端
  2. 服务端 -- 证书(公钥) --> 客户端
  3. 客户端(获取证书公钥) -- 公钥加密信息 --> 服务端
  4. 服务端(私钥解密信息) -- 生成会话密钥 --> 客户端
  5. 后续服务端与客户端使用会话密钥进行加密解密通信(对称加密)

HTTP2

  • 二进制分帧
  • 请求优先级
  • 头部压缩
  • 多路复用:解决 对头阻塞 问题
  • 服务端推送

网络安全

跨站脚本攻击(XSS)

  • 攻击原理:通过注入包含可被浏览器解析的标签(如 script),让浏览器对标签内容解析为脚本并执行。
  • 攻击方式:通过向数据库提交恶意代码(常见于社区、论坛网站);创建包含恶意代码的 URL 由前端执行。
  • 预防方式
    • 服务端:设置 CSP(内容安全策略),拦截不安全的数据,设置 HTTP-only 避免脚本获取
    • 服务端渲染:在使用数据拼接 HTML 时对数据进行转义处理
    • 浏览器渲染:在使用 innerHTML/v-html 时对文本进行转义处理

跨站请求伪造(CSRF)

  • 攻击原理:若网站仅通过 cookie 作为用户身份验证,则服务端只能确保请求的来源而无法确保由是否由用户本身发出
  • 攻击方式:攻击网站(B)向使用简单授权的网站(A)发送请求,若用户在 A 的 cookie 未过期,则可能遭受伪造攻击。
  • 预防方式
    • 同源检测:检测 OriginReferer 字段拦截非同源请求
    • 凭证检测:使用 Token 对用户进行检测而非简单的 cookie
    • 双重 cookie:在发送请求时携带 cookie 作为 URL 参数,后端验证 cookie 与参数是否相同 (利用 CSRF 攻击无法获取 cookie 值的特点)

SQL 注入

  • 攻击原理:通过注入包含 SQL 处理的数据作为普通字符串,在对 SQL 语句进行字符串拼接的时候,直接使用为转义的内容并执行
  • 攻击方式:通过在向数据库提交信息的场景提交恶意字符串
  • 预防方式
    • 对提交内容进行特殊字符过滤
    • 语法上禁止 SQL 语句拼接,严格使用参数绑定

盗链

  • 实现方式:在第三方网站使用资源网站的资源链接
  • 预防方式
    • 对链接处理
      • 资源地址自动化更新
      • referer 头进行同源或白名单判断
      • 用户认证,判断当前资源的访问者
    • 对资源处理
      • 添加水印