计算机网络架构
OSI/RM 参考模型
- 物理层
- 位于OSI/RM体系的最底层,向下直接与物理传输介质相连接
- 数据传输单元是比特
- 能够实现比特流的透明传输, 为数据链路层提供数据传输服务
- 数据链路层
- 通过建立数据链路连接,采用差错控制与流量控制方法, 将一条原始且有差错的物理链路变为对网络层无差错的数据链路。
- 数据传输单元是帧(一种用于传输数据的结构化的数据包)。
- 网络层
- 网络层主要负责确定从源主机沿着网络到目的主机的路由选择,即找到最佳路径实现数据的无差错传输。
- 提供数据报和虚电路两种分组传输服务
- 数据传输单元是分组或数据包
- 传输层
- 主要负责为不同位置主机中的进程分配端到端的可靠数据传输与接收服务, 能够向高层屏蔽低层数据通信的细节。传输层在OSI/RM参考模型中起到承上启下作用。
- 数据传输单元是报文.
- 会话层
- 主要维护不同级逐渐会话连接的建立, 使用和结束
- 对数据传输的同步进行管理.
- 会话层之上是面向用户的,会话层以下是面向网络通信
- 数据传输单元是报文
- 表示层
- 负责通信系统之间的数据格式变换, 数据加密与解密, 数据压缩与恢复
- 重点结局保证所传输的数据经传输后意义不改变, 并与机器无关
- 传输单元是报文
- 应用层
- 直接为用户服务, 通过应用软件实现网络与用户的直接对话, 负责整个网络应用程序的协同工作.
TCP/IP 协议
- 链路层
- 接收数据报并通过特定的网络进行传输, 或从网络上接收物理帧, 抽出IP数据报交给网络层.
- 网络层
- 处理来自上层的报文发送请求
- 处理输入数据报
- 处理 ICMP 报文. 即处理网路的路由选择, 流量控制和拥塞控制等问题.
- 传输层
- 在源/宿 系统的两个进程实体之间提供可靠地端到端的数据传输
- 应用层
- 远程登录协议 Telnet
- 文件传输协议 FTP
- 简单邮件传输协议 SMTP
- 域名服务 DNS
- 超文本传输协议 HTTP
传输控制协议 TCP
- TCP 是面向连接的. 可靠地. 基于字节流的传输层用心协议
- 将应用层的数据分割成报文段并发送给目标节点的TCP层
- 数据包都有序号, 对方接收到则发送ACK确认, 未收到则重传
- 使用奇偶校验判断
报文格式
TCP Flag:
- URG 紧急指针
- ACK 确认序号
- PSH push 标志
- RST 重置连接
- FIN 释放连接
- SYN 同步序号, 用户建立连接过程
三次握手
看图, 不解释
三次握手的原因:
- 为了初始化Sequence Number的初始值
- 防止SYN超时, 即Client发送SYN包后掉线, Server会不断重试直至超时, 容易遭受SYN攻击
SYN Flood攻击:
SYN 攻击就是发送大量的 SYN 包, 使服务器一直处于 SYN_RCVD 状态, 并不断重发直到超时. 使服务器SYN队列满了. 无法处理正常请求.
预防措施: 当SYN请求队列满了, 设置SYN Cookie, 如果正常连接则会回发SYN Cookie, 直接建立连接, 不进入队列.
四次挥手
等待2MSL的原因:
- 确保有足够的时间让对方收到 ACK 包, (如果对方未收到 ACK, 则会重发FIN, 时间相当于2msl)
- 避免新旧连接混淆
四次挥手的原因:
- 因为全双工, 发送方和接收方都需要FIN报文和ACK报文.
拓展, 服务器出现大量 CLOSE_WAIT 状态的原因:
- 对方关闭socket连接, 我方忙于读或写, 没有及时关闭连接
- 检查代码, 特别是释放资源的代码
- 检查配置, 处理请求的线程配置
# 查看tcp各个状态的连接数, (close-wait1000左右说明有问题)
netstat -n | awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'
滑动窗口
RTT 发送一个数据包到收到对应的ack, 所花费的时间
RTO 重传时间间隔, (动态的, 经过RTT计算得到)
作用:
- 保证TCP的可靠性
- 保证TCP的流控特性, (流量控制)
只有当32-35全部被确认后才滑动窗口.
UDP 协议
- 面向非连接
- 不维护连接状态, 支持同时向多个客户端传输相同的消息
- 数据包报头只有8个字节, 额外开销小
- 尽最大努力交付, 不保证可靠交付
TCP 和 UDP的区别
- 面向连接 vs 无连接
- 可靠性
- 有序性
- 速度
- 量级
HTTP/HTTPS 协议
超文本传输协议 HTTP
- 支持客户 / 服务器模式
- 简单快速
- 灵活, 允许发送任意格式的数据, content-type指定
- 无连接, 每次只处理一个请求
- 无状态
HTTP 1.1 改成了长连接模式
HTTP请求结构
HTTP响应结构
请求/响应的步骤
- 客户端连接到web服务器
- 发送http请求
- 服务器接受请求并返回http响应
- 释放tcp连接 (keep-alive则保持一段时间)
- 客户端浏览器解析HTML内容
在浏览器地址栏键入URL, 按下回车之后的流程
- DNS解析 (浏览器缓存 – 主机host – 路由器上DNS缓存 – IPS服务器缓存 – 根域名服务器缓存 – 顶级域名服务器缓存 )
- TCP 连接, 三次握手
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析HTML, 并渲染页面
- 连接结束, 四次挥手
HTTP 状态码
- 1xx 指示信息 — 请求已接收, 继续处理
- 2xx 成功 — 请求已被成功接收, 理解. 接受
- 200 OK 请求所希望的响应头或数据将随次响应返回.
- 204 No Content 成功处理了请求, 没有返回任何内容
- 3xx 重定向 — 必须请求进行进一步的操作, 后续请求地址在本次的 Location 中指明
- 301 Moved Permanently 被请求资源被永久移动到新的位置
- 302 Fund 要求客户端执行临时重定向
- 303 See Other 对应当前请求可以在另一个URL上被找到, 该响应禁止被缓存
- 304 Not Modified 资源未被修改, 不需要重新传输
- 305 Use Proxy 必须通过指定代理才能被访问
- 4xx 客户端错误 — 请求有语法错误或无法实现
- 400 Bad Request 明显的客户端错误(如: 错误格式的请求语法), 服务器不能或不会处理该请求
- 401 Unauthorized 未认证, 用户没有凭据. 该响应必须包含一个适用于被请求资源的WWW-Authenticate信息头用以询问用户信息
- 403 Forbidden 服务器已经理解请求, 但是拒接执行.
- 404 Not Found 请求失败, 资源未被找到.
- 5xx 服务器错误 — 服务器未能实现合法的请求
- 500 Internal Server Error 通用错误信息, 服务器遇到一个未预料的状况, 无法完成对请求的处理
- 502 Bad Gateway 作为网关或代理工作的服务器执行请求时, 从上游服务器接收到无效的响应
- 503 Service Unavailable 由于临时的服务器维护或过载, 暂时无法处理请求.
- 504 Gateway Timeout 网关超时
GET 和 POST 请求的区别
- HTTP 报文层面 GET 将请求信息放在URL中, 有长度限制; POST 放在报文体,
- 数据库层面: GET 符合幂等性(每次结果都一样), 安全性(不改变数据库), POST 没有
- 其他 GET可以被缓存, 被存储, 而 POST 不能
Cookie 和 Session 区别
- Cookie 存放在客户的浏览器上, Session 数据放在服务器是
- Session 相对于 Cookie 更安全
- 考虑减轻服务器负担, 应当使用 Cookie
session 有两种实现方式: Cookie 中保存一个 JSISSIONID, url 回写
HTTPS
HTTPS = HTTP + 加密 +认证 + 完整性保护
HTTPS数据传输流程
- 浏览器将支持的加密算法信息发送给服务器
- 服务器选择一套浏览器支持的加密算法, 以证书的形式回发给浏览器
- 浏览器验证证书的合法性, 彬结合战术公钥加密信息发送给服务器
- 服务器使用私钥解密信息, 验证哈希, 加密响应小心回发浏览器
- 浏览器解密响应消息, 并对消息验真, 之后进行加密交互数据
HTTP和HTTPS的区别
- HTTPS 需要 CA 申请证书, HTTP不需要
- HTTPS 密文传输, HTTP明文传输
- 连接方式不同, HTTPS默认443端口, HTTP使用80端口
- HTTPS = HTTP + 加密 +认证 + 完整性保护, 比HTTP安全