网络通信
网络模型
- 应用层:HTTP、域名系统
- 传输层:TCP、UDP
- 网络层
- 链路层
传输层 - TCP
三次握手
- 请求方 -- SYN --> 响应方;请求方进入 SYN_SEND 状态
- 响应方(接收 SYN) -- ACK + SYN --> 请求方;响应方进入 SYN_RECV 状态
- 请求方(接收 ACK + SYN) -- ACK --> 响应方;请求方进入 ESTABLISHED 状态
四次挥手
- 请求方 -- FIN --> 响应方;请求方不再发送数据,进入 FIN_WAIT_1 状态
- 响应方(接收 FIN) -- ACK --> 请求方;
- 响应方进入 CLOSE_WAIT 状态
- 请求方(接收 ACK) 进入 FIN_WAIT_2 状态
- 响应方(数据发送完) -- FIN --> 请求方;响应方进入 LAST_ACT 状态
- 请求方(接收 FIN) -- ACK --> 响应方;请求方进入 TIME_WAIT 状态
- 响应方(接收 ACK) 进入 CLOSED 状态
- 请求方(经过最大生存期后)进入 CLOSED 状态
说明:第二次和第三次可以合并发送
重传机制
在发送报文时会开启定时器并保留副本
- 在定时器时间内接收到响应则取消定时器并删除副本
- 在超出定时器时间外会重置定时器并重新发送报文
- 一般超时重传时间取 加权平均往返时间 + 4 倍加权平均往返偏差时间
滑动窗口
发送方和接收方分别维护发送窗口和接收窗口
- 发送窗口按序号发送帧,直到全部帧处于待确认状态
- 接收窗口按序号接收帧,接收后发送确认帧后滑动窗口
- 发送窗口接收到确认帧,删除重发表对应帧后滑动窗口
根据发送窗口和接收窗口的大小分为
- 停等协议:发送窗口=1,接收窗口=1;需要不断等待应答,效率低下
- 后退 n 协议:发送窗口>1,接收窗口=1;重传时需要后退到错误帧并重传
- 选择重传协议:发生窗口>1,接收窗口>1;传输效率较高,需要接收方具有足够的缓冲空间
拥塞控制
- 慢启动:给定一个初始 cwnd,每次收到确认包时大小翻倍,直到达到 ssthresh 或丢包
- 拥塞避免:cwnd 达到 ssthresh 时,采用线增积减的反馈机制控制 cwnd 大小
- 若网络良好,则每经过一个 RTT ,cwnd 与 ssthresh += 1MSS
- 若网络拥塞,则 ssthresh 减半,cwnd 置为 1MSS,进入慢启动阶段
- 快速重传:当发送方收到 4 次相同的确认时,忽略超时计时器并立即重发,进入快速恢复阶段
- 快速恢复:发送方将 cwnd 与 ssthresh 减半,进入拥塞避免阶段
说明:
- MSS: 最大分段大小,拥塞窗口的大小单位
- cwnd: 拥塞窗口,每次发送数据包的大小,由发送方维护
- ssthresh: 慢开始门限,控制拥塞窗口的最大值
传输层 - UDP
<源端口号><目的端口>
<报文长度><报文校验码>
<数据内容>特点:报文结构简单,开销低,传输效率高;传输时不建立连接,无状态、不可靠
用途:DNS,广播,及时通话
应用层 - DNS
域名系统时将域名与 IP 地址相互映射的分布式数据库
域名解析流程
- 静态映射:通过本地缓存或配置进行查询
- 客户端缓存
- 本地 host
- 本地 DNS 缓存
- 本地 DNS 服务器
- 动态映射:通过其他域名服务器进行查询
- 跟域名服务器
- 顶级域名服务器
- 权威域名服务器
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 进行了以下处理
- 信息加密,避免窃听
- 信息校验,避免篡改
- 证书校验,避免冒充
工作流程
- 客户端 -- client hello --> 服务端
- 服务端 -- 证书(公钥) --> 客户端
- 客户端(获取证书公钥) -- 公钥加密信息 --> 服务端
- 服务端(私钥解密信息) -- 生成会话密钥 --> 客户端
- 后续服务端与客户端使用会话密钥进行加密解密通信(对称加密)
HTTP2
- 二进制分帧
- 请求优先级
- 头部压缩
- 多路复用:解决 对头阻塞 问题
- 服务端推送
网络安全
跨站脚本攻击(XSS)
- 攻击原理:通过注入包含可被浏览器解析的标签(如
script),让浏览器对标签内容解析为脚本并执行。 - 攻击方式:通过向数据库提交恶意代码(常见于社区、论坛网站);创建包含恶意代码的 URL 由前端执行。
- 预防方式
- 服务端:设置 CSP(内容安全策略),拦截不安全的数据,设置 HTTP-only 避免脚本获取
- 服务端渲染:在使用数据拼接 HTML 时对数据进行转义处理
- 浏览器渲染:在使用 innerHTML/v-html 时对文本进行转义处理
跨站请求伪造(CSRF)
- 攻击原理:若网站仅通过
cookie作为用户身份验证,则服务端只能确保请求的来源而无法确保由是否由用户本身发出 - 攻击方式:攻击网站(B)向使用简单授权的网站(A)发送请求,若用户在 A 的
cookie未过期,则可能遭受伪造攻击。 - 预防方式
- 同源检测:检测
Origin或Referer字段拦截非同源请求 - 凭证检测:使用
Token对用户进行检测而非简单的cookie - 双重 cookie:在发送请求时携带 cookie 作为 URL 参数,后端验证 cookie 与参数是否相同 (利用 CSRF 攻击无法获取 cookie 值的特点)
- 同源检测:检测
SQL 注入
- 攻击原理:通过注入包含 SQL 处理的数据作为普通字符串,在对 SQL 语句进行字符串拼接的时候,直接使用为转义的内容并执行
- 攻击方式:通过在向数据库提交信息的场景提交恶意字符串
- 预防方式
- 对提交内容进行特殊字符过滤
- 语法上禁止 SQL 语句拼接,严格使用参数绑定
盗链
- 实现方式:在第三方网站使用资源网站的资源链接
- 预防方式
- 对链接处理
- 资源地址自动化更新
- 对
referer头进行同源或白名单判断 - 用户认证,判断当前资源的访问者
- 对资源处理
- 添加水印
- 对链接处理