📧 概述

吞佛童子2022年6月20日
  • 计算机网络
  • 概述
大约 8 分钟

📧 概述

1. 网络模型

1) OSI 标准模型

  • 应用层
    • 在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务
    • 电子邮件 SMTP 、远程登录、文件传输 FTP 等协议
  • 表示层
    • 向应用层提供协议、接收来自会话层的协议、处理数据相关问题
    • 编解码、加解密、压缩解压缩等
  • 会话层
    • 建立连接 & 断开连接
  • 传输层
    • 负责 2 个节点之间的数据传输
    • 分段及封装应用层送来的数据
    • 2 个协议
      • TCP 可靠传输
      • UDP 不可靠传输
  • 网络层
    • 将数据从一个设备传输到另一个设备
    • 相关协议
      • IP 寻址 & 路由
      • ICMP
  • 数据链路层
    • 单个链路上的数据传输
    • 相关协议
      • ARP 地址解析协议
      • RARP 逆地址解析协议
  • 物理层
    • 为设备之间的数据通信提供硬件环境

2) TCP/IP 模型

  • 应用层
    • 关注于为用户提供应用功能
    • 工作在操作系统的用户态,其他层工作在内核态
  • 传输层
  • 网络层
  • 网络接口层

img.png


2. 键入网址到网页显示,期间发生了什么?

1) 应用层

① DNS 解析网址

  1. 当输入的是域名时,由于我们进行 HTTP 传输需要的是 IP 地址,因此需要通过 DNS 解析域名,得到其 公网IP 地址
  2. DNS 服务器就负责保存 web 服务器域名与 IP 的对应关系
  3. 层级关系
    • 根域名服务器 (13 台) [.]
    • 顶级域名服务器 [.com .cn]
    • 权威域名服务器 [google.cn]
  4. 解析流程
  • 客户端请求与该域名所在 IP 目标建立连接
  • 浏览器查询自身对该域名的缓存
    • 有,则直接返回
    • 没有,则
      • 查看操作系统缓存
        • 有,则直接返回
        • 没有,则
          • 查看 hosts 文件有没有该域名的缓存 [C:\Windows\System32\drivers\etc]
          • 有,则返回
          • 没有,查询本地 DNS 服务器
  • 本地 DNS 服务器,收到请求后,查询自己是否有该域名的缓存
    • 有,则直接返回
    • 没有 & 采用的是 非转发模式
      • 本地 DNS 服务器向 根域名服务器发出请求
      • 根域名服务薇收到请求后,返回相关顶级域名服务器的 IP 地址
      • 本地 DNS 服务器向 顶级域名服务器发出请求
      • 顶级域名服务器收到请求后,返回相关权威域名服务器的 IP 地址
      • 本地 DNS 服务器向 权威域名服务器发出请求
      • 权威域名服务器查询到域名对应的具体 IP 地址后返回
      • 本地 DNS 服务器缓存该结果,并将 IP 地址返回给客户端,客户端与目标建立连接
    • 没有 && 采用的是 转发模式
      • 本地 DNS 服务器将请求转发至上一级 DNS 服务器
      • 上一级DNS 服务器进行解析
        • 解析成功,返回给 本地 DNS 服务器
        • 解析失败,转发给再上一级 DNS 服务器,直至解析成功,返回本地 DNS 服务器

img.png

DNS

  1. DNS 污染
    • 某些服务器对DNS查询进行入侵检测,发现与黑名单上匹配的请求,该服务器就伪装成DNS服务器,给查询者返回虚假结果。它利用了UDP协议是无连接不可靠性
  2. DNS 劫持
    • 劫持了DNS服务器,进而修改其解析结果

② 封装 HTTP 请求信息

  • 包括 请求行、请求头、消息体等

③ HTTPS 请求

  1. 若是 HTTPS 请求,还需要建立 SSL/TLS 连接

2) 传输层

  1. 对 HTTP 数据进行封装,添加 TCP 头部,内含源端口号 & 目的端口号等
  2. 客户端与服务端通过 3 次握手建立连接

3) 网络层

  1. 对 TCP 数据进行封装,添加 IP 头部,包含 源 IP 地址 & 目标 IP 地址

4) 网络接口层

  1. 对 IP 数据进行封装,添加 MAC 头部,包含 接收方 MAC 地址 & 发送方 MAC 地址 & 协议类型 [IP | ARP]
  2. 完整数据封装好后,经过网卡,将数字信息转换为电信号,通过网线传输
  3. 在到达服务端之前,需要经过交换机根据 MAC 地址的缓存端口,将信号发送到指定端口 | 所有端口
  4. 还可能经过多个路由器对以太网包进行转发,最终到达服务端端口
  5. 服务端对头部进行校验,最后收到客户端请求的实际信息
  6. 双方连接关闭后,还需要经过 TCP 四次挥手,断开连接

3. Linux 操作系统收发网络包过程

1) Linux 网络协议栈

2) 发送网络包流程

  1. 用户态的应用程序发生系统调用,调用 Socket 接口发送数据包,从用户态切换到内核态
  2. Socket 层将数据 copy 到 Socket 发送缓冲区
  3. 网络协议栈从 Socket 发送缓冲区中取出数据包,根据上图协议栈顺序依次执行
  4. 依次经过 TCP | UDP 添加头部,再经过 IP 添加头部,然后经过 MAC 添加头部,如果需要分片还需要进行数据的分片
  5. 将封装好的数据放入发包队列中
  6. 触发 软中断 [以内核线程的方式进行,用于异步处理硬中断还未完成的部分工作] 通知网卡驱动程序有新的数据包需要发送
  7. 网卡驱动程序通过 DMA 技术,从发包队列中取出网络包,放入硬件网卡的队列中
  8. 物理网卡发送数据包

3) 接收网络包流程

  1. 物理网卡负责接收 & 发送数据包,当接收到网络包后
  2. 通过 DMA 技术,将网络包放入 Ring Buffer,一个环形缓冲区中
  3. 同时,网卡发起 硬件中断
  4. 操作系统执行网卡硬件中断处理函数,处理完后,
  5. 暂时屏蔽中断
  6. 唤醒软中断
  7. 轮询处理数据
    • 从 Ring Buffer 中 copy 数据到内核 struct_sk_buffer 缓冲区中,便于后续网络协议栈的逐层处理
    • 通过网络协议栈依次进行 MAC IP TCP | UDP 头部数据的校验等工作
    • 校验成功后,取出实际请求信息,copy 到 Socket 的接收缓冲区中
    • 应用程序调用 Socket 接口,从内核 Socket 的接收缓冲区中读取新来的数据到应用层进行相应处理
  8. 没有新数据时,恢复中断

4. keep-alive VS so_keepalive

1) http Connection: keep-alive

  • Connection: keep-alive 表示建立 http 长连接
  • 长连接状态下,可以实现一个同一个 TCP 连接发送 & 接收多个 http 请求 & 应答,而不是每次请求都是一次新的连接,都要进行三次握手 & 四次挥手
  • 避免了连接建立 & 释放的开销,也便于 pipeline 的实现
  • 什么时候连接会断开?
    • 除非一段明确提出断开连接,否则一直存在
  • 一直存在浪费资源,如何避免?
    • 服务器提供 keepalive_timeout 参数,指定 http 长连接的过期时间
    • 若过期时间到,在这段时间内没有新的请求,那么会触发回调函数,释放连接
  • 应用程序负责完成

2) TCP so_keepalive

  • TCP 保活机制
  • 当一段时间内双方没有 TCP 交互时,会发送探测报文
  • 内核态负责完成

5. 网络安全

1) XSS 攻击

  1. XSS 攻击,即 跨站脚本攻击
  2. 原理:
    • 恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的
  3. 分类:
    • 非持久性 XSS 攻击
      • 反射型
      • DOM-baseed型
    • 持久性 XSS 攻击
      • 存储型

2) CSRF 攻击

  1. CSRF 攻击, 即 跨站域请求伪造攻击
  2. 原理:
    • 伪装成受信任的用户,恶意攻击网站

6. 其他问题

1) 常见概念

  1. 路由器
    • 网络层 设备
    • 存储 路由表
    • 端到端,其中可能不止经过一个设备,维护路由表进行数据包的转发
  2. 交换机
    • 数据链路层 设备
    • 存储 MAC 地址
    • 全双工
    • 为接入 交换机 的两个节点进行通信,中间不经过其他节点
  3. 集线器
    • 物理层 设备
    • 半双工
    • 将多条以太网双绞线 | 光纤集合 连接到同一物理设备下,一个设备发送消息,局域网内的其他所有设备均能收到
  4. 全双工
    • 在端到端的通信链路中,假设某端发送数据为 正向,接收数据为 负向,那么某段时间内,正向 & 反向可以同时存在
    • TCP
  5. 半双工
    • 在端到端的通信链路中,假设某端发送数据为 正向,接收数据为 负向,那么某段时间内,链路上已经有 正向数据在传输,那么就不能有反向数据传输,只能等待正向数据传输完成才可以进行
    • Http 1.1
  6. P2P
    • 没有服务器,所有设备均是客户端,既能接收请求做出响应,也能发送请求
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou