📧 概述
2022年6月20日
- 计算机网络
- 概述
📧 概述
1. 网络模型
1) OSI 标准模型
- 应用层
- 在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务
- 电子邮件
SMTP
、远程登录、文件传输FTP
等协议
- 表示层
- 向应用层提供协议、接收来自会话层的协议、处理数据相关问题
- 编解码、加解密、压缩解压缩等
- 会话层
- 建立连接 & 断开连接
- 传输层
- 负责 2 个节点之间的数据传输
- 分段及封装应用层送来的数据
- 2 个协议
TCP
可靠传输UDP
不可靠传输
- 网络层
- 将数据从一个设备传输到另一个设备
- 相关协议
IP
寻址 & 路由ICMP
- 数据链路层
- 单个链路上的数据传输
- 相关协议
ARP
地址解析协议RARP
逆地址解析协议
- 物理层
- 为设备之间的数据通信提供硬件环境
2) TCP/IP 模型
- 应用层
- 关注于为用户提供应用功能
- 工作在操作系统的用户态,其他层工作在内核态
- 传输层
- 网络层
- 网络接口层
2. 键入网址到网页显示,期间发生了什么?
1) 应用层
① DNS 解析网址
- 当输入的是域名时,由于我们进行 HTTP 传输需要的是 IP 地址,因此需要通过 DNS 解析域名,得到其 公网IP 地址
- DNS 服务器就负责保存 web 服务器域名与 IP 的对应关系
- 层级关系
- 根域名服务器 (13 台) [.]
- 顶级域名服务器 [.com .cn]
- 权威域名服务器 [google.cn]
- 解析流程
- 客户端请求与该域名所在 IP 目标建立连接
- 浏览器查询自身对该域名的缓存
- 有,则直接返回
- 没有,则
- 查看操作系统缓存
- 有,则直接返回
- 没有,则
- 查看 hosts 文件有没有该域名的缓存 [C:\Windows\System32\drivers\etc]
- 有,则返回
- 没有,查询本地 DNS 服务器
- 查看操作系统缓存
- 本地 DNS 服务器,收到请求后,查询自己是否有该域名的缓存
- 有,则直接返回
- 没有 & 采用的是 非转发模式 则
- 本地 DNS 服务器向 根域名服务器发出请求
- 根域名服务薇收到请求后,返回相关顶级域名服务器的 IP 地址
- 本地 DNS 服务器向 顶级域名服务器发出请求
- 顶级域名服务器收到请求后,返回相关权威域名服务器的 IP 地址
- 本地 DNS 服务器向 权威域名服务器发出请求
- 权威域名服务器查询到域名对应的具体 IP 地址后返回
- 本地 DNS 服务器缓存该结果,并将 IP 地址返回给客户端,客户端与目标建立连接
- 没有 && 采用的是 转发模式 则
- 本地 DNS 服务器将请求转发至上一级 DNS 服务器
- 上一级DNS 服务器进行解析
- 解析成功,返回给 本地 DNS 服务器
- 解析失败,转发给再上一级 DNS 服务器,直至解析成功,返回本地 DNS 服务器
DNS
- DNS 污染
- 某些服务器对DNS查询进行入侵检测,发现与黑名单上匹配的请求,该服务器就伪装成DNS服务器,给查询者返回虚假结果。它利用了UDP协议是无连接不可靠性
- DNS 劫持
- 劫持了DNS服务器,进而修改其解析结果
② 封装 HTTP 请求信息
- 包括 请求行、请求头、消息体等
③ HTTPS 请求
- 若是 HTTPS 请求,还需要建立 SSL/TLS 连接
2) 传输层
- 对 HTTP 数据进行封装,添加 TCP 头部,内含源端口号 & 目的端口号等
- 客户端与服务端通过 3 次握手建立连接
3) 网络层
- 对 TCP 数据进行封装,添加 IP 头部,包含 源 IP 地址 & 目标 IP 地址
4) 网络接口层
- 对 IP 数据进行封装,添加 MAC 头部,包含 接收方 MAC 地址 & 发送方 MAC 地址 & 协议类型 [IP | ARP]
- 完整数据封装好后,经过网卡,将数字信息转换为电信号,通过网线传输
- 在到达服务端之前,需要经过交换机根据 MAC 地址的缓存端口,将信号发送到指定端口 | 所有端口
- 还可能经过多个路由器对以太网包进行转发,最终到达服务端端口
- 服务端对头部进行校验,最后收到客户端请求的实际信息
- 双方连接关闭后,还需要经过 TCP 四次挥手,断开连接
3. Linux 操作系统收发网络包过程
1) Linux 网络协议栈
2) 发送网络包流程
- 用户态的应用程序发生系统调用,调用 Socket 接口发送数据包,从用户态切换到内核态
- Socket 层将数据 copy 到 Socket 发送缓冲区
- 网络协议栈从 Socket 发送缓冲区中取出数据包,根据上图协议栈顺序依次执行
- 依次经过 TCP | UDP 添加头部,再经过 IP 添加头部,然后经过 MAC 添加头部,如果需要分片还需要进行数据的分片
- 将封装好的数据放入发包队列中
- 触发 软中断 [以内核线程的方式进行,用于异步处理硬中断还未完成的部分工作] 通知网卡驱动程序有新的数据包需要发送
- 网卡驱动程序通过 DMA 技术,从发包队列中取出网络包,放入硬件网卡的队列中
- 物理网卡发送数据包
3) 接收网络包流程
- 物理网卡负责接收 & 发送数据包,当接收到网络包后
- 通过 DMA 技术,将网络包放入 Ring Buffer,一个环形缓冲区中
- 同时,网卡发起 硬件中断
- 操作系统执行网卡硬件中断处理函数,处理完后,
- 暂时屏蔽中断
- 唤醒软中断
- 轮询处理数据
- 从 Ring Buffer 中 copy 数据到内核 struct_sk_buffer 缓冲区中,便于后续网络协议栈的逐层处理
- 通过网络协议栈依次进行 MAC IP TCP | UDP 头部数据的校验等工作
- 校验成功后,取出实际请求信息,copy 到 Socket 的接收缓冲区中
- 应用程序调用 Socket 接口,从内核 Socket 的接收缓冲区中读取新来的数据到应用层进行相应处理
- 没有新数据时,恢复中断
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 攻击
- XSS 攻击,即 跨站脚本攻击
- 原理:
- 恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的
- 分类:
- 非持久性 XSS 攻击
- 反射型
- DOM-baseed型
- 持久性 XSS 攻击
- 存储型
- 非持久性 XSS 攻击
2) CSRF 攻击
- CSRF 攻击, 即 跨站域请求伪造攻击
- 原理:
- 伪装成受信任的用户,恶意攻击网站
6. 其他问题
1) 常见概念
- 路由器
- 网络层 设备
- 存储 路由表
- 端到端,其中可能不止经过一个设备,维护路由表进行数据包的转发
- 交换机
- 数据链路层 设备
- 存储 MAC 地址
- 全双工
- 为接入 交换机 的两个节点进行通信,中间不经过其他节点
- 集线器
- 物理层 设备
- 半双工
- 将多条以太网双绞线 | 光纤集合 连接到同一物理设备下,一个设备发送消息,局域网内的其他所有设备均能收到
- 全双工
- 在端到端的通信链路中,假设某端发送数据为 正向,接收数据为 负向,那么某段时间内,正向 & 反向可以同时存在
- TCP
- 半双工
- 在端到端的通信链路中,假设某端发送数据为 正向,接收数据为 负向,那么某段时间内,链路上已经有 正向数据在传输,那么就不能有反向数据传输,只能等待正向数据传输完成才可以进行
- Http 1.1
- P2P
- 没有服务器,所有设备均是客户端,既能接收请求做出响应,也能发送请求