计算机网络基础 | 青训营
案例小知识
ISP 可以理解为我们的运营商服务器
网络基础
网络组成部分:
- 主机: 客户端(提供接受信息)/服务端
- 路由器 转发信息
- 网络协议 提供统一格式 方便负责信息的编解码
电路交换&分组交换
- 电路交换有节点的链路占用带宽和资源,有资源利用的问题,如果节点过多会降低质量和速度
- 分组交换 不用预留资源 ,采用小报文的方式在队列分组交换,传到各个节点之后由主机来将报文拼接
网络分层
每一层对于上一层都是黑盒的,每一层不需要关心其它层的东西 专注于自己的东西
- 应用层 (快递内容)
- 运输层 (卡车)
- 网络层 (高速公路)
- 数据链路层
- 物理层
协议
协议可以理解成为网络的语言,双方以同一协议来定义交换报文的内容和顺序等 可以让双方可以通过协议的方式沟通。
标头和载荷
寄件/收件 标头记录包裹的地址电话等
载荷相当于包裹内容
TCP协议格式
Web中的网络
Http 1-3的变化
http基本结构
下图是http1/1.1的请求模式,Http是明文协议 使用的是经典的请求响应模型,导致无法在一条连接无法复用且效率不高
http1.1无法多路复用的案例
如果服务器交替响应 main.js 和style.css
http2
在http 2 中解决了这个问题 它将多个响应拆到了一个一个帧里,可以标识那个请求的某内容 来让http可以多路复用
帧的结构:
- 前三位是长度
- 第四个字节标识类型
- 第六个字节第一个是保留位,后面的31代表帧的流id
- 通过帧的头部信息可以分析为在哪个流 可以在流中拿到对应的数据
帧带来的好处 :
- 调整响应传输的优先级
- 头部压缩
- Server push
为什么还会有Http3? 因为2 不够快 还是会出现TCP上的对头堵塞
TCP 有丢包重传机制 导致了尽管包1丢包不影响 0 13 的style.css 但是还是会卡在包1重传 导致阻塞
Http3:QUIC( quick UDP internet Connection)
将TLS作为本身的一部分,解决tcp和tls 需要互相握手的概念,QUIC有独立的流 解决了对头阻塞的问题 ,而且解决了rtt顺序问题 达到可以首次连接1rtt 第二次连接0rtt的访问
总结
- Http1.1 解决了http1 的响应后关闭连接,改成了不关闭连接
- http2 提出了其中帧和头部压缩,解决了1.1不能多路复用的问题 但是还有头部阻塞问题
- Http3 使用quic 解决了头部阻塞问题 用独立的流解决了头部阻塞问题
协议外的因素
物理的距离有很大的因素,这个时候CDN就出现了 服务器可以承受的流量是有限的,
CDN: 内容分发网络 就起到了作用 。
只需要在几个主要的城市的服务器部署cdn 只需要两次跳跃就可以分发到国内的任何位置上去
那么如何做到北京的人只访问北京的服务器呢 ? 要在DNS 上做文章
DNS 劫持
要加速的域名重新定向到CDN厂商的域名解析服务,CDN厂商根据来源来确定CDN服务器的IP 之后让用户直接访问最近的CDN服务器。
并不一定是离得近就一定合适,服务器的网络解析是很复杂的 所以这个时候大部分站点都会提出策略
CDN 可以解决物理层面的问题 。但是很复杂切需要付费 流量很贵
WebSocket
他是从HTTP协议升级而来的一个协议
- 它可以有状态的持久连接
- 服务端可以自动推送消息
- 用ws 发信息要比http的延时低
简单的实例
网络安全
三要素
- 机密性 : 攻击者无法获得通信内容
- 完整性: 攻击者对内容进行篡改的是能被发现
- 身份验证: 让攻击者无法伪装成通信的任意一方
常见的加密中有两种
-
对称加密
- 加密和解密用同样的秘钥
-
非对称加密
- 加密和解密使用不同的秘钥(公钥/私钥),而且公钥加密只能用私钥解密,私钥加密之后能用公钥解密
密码散列函数(hash函数)
- 输入任意长度的内容
- 输出固定长度的hash值
- 找到两个不同的输入使之经过密码三列函数后有相同的hash值在计算上是不可能的
如何实现机密性
已知 网络是明文的
如果双方可以通过明文来商量秘密信息 攻击者也可以
所以想要通过明文通信交换秘密信息 需要双方先有秘钥
如何实现完整性
密码散列函数:
- 有明文 M hash函数 H 以及一个秘钥s
- 计算H(m+s) 获得hash值 h
- 将m和h组合成信息 m+h
- 接收方拆分m+h 重新计算 H(m+s)得到h' 对比h'和h 拿到m
如何实现身份验证
- 数字签名: 对明文的hash 值使用私钥加密 验证者使用公钥验证
- 数字签名(指纹) = 私钥加密(密码散列函数(原文))
- 消息 = 原文+数字签名
一般对于公开的内容 比如 包含公钥的证书 进行数字签名 防止篡改
构成PKI的要素只有三个
构成PKI的主要要素就是下面三个概念
- 证明书
- 认证机关
- 证书库
HTTPS
把http的明文换成密文 再验证身份就是https
https = http + tls
tls = 身份验证+解密
服务端身份验证靠 pki,客户端身份验证靠http 协议