课程重点
- 网络结构
- TCP/UDP
- HTTP 1 / HTTP2 / HTTP3 (QUIC)
- WebSocket
- CDN
- 安全(SSL/TLS/基础密码学)
1 前言
网络现在已与人们的生活密不可分,是现实与虚拟的桥梁,是人们生活的一部分。了解网络帮助开发者高效排查解决开发中出现的网络问题。
课程帮助我们通过示例建立对计算机网络的整体认知,对其各种概念(网络分层,网络协议,网络应用等)初步了解,包括建立对网络分层的认知,分析HTTP 1,2,3的关系,介绍CDN运行的基本原理,了解网络安全的基本原则。
分析方法:描述一个复杂系统的两种方式
自底向上:构建对计算机网络的认知
- 从简单开始逐渐复杂
- 将模块逐步拼凑成一个系统
自顶向下:解释线程网络应用,协议的特性,工作原理等
- 从复杂开始逐渐简单
- 从复杂的系统问题入手,拆分为模块问题
2 蟹堡王帝国(示例)
三步走战略
- 在比奇堡开通外卖
- 在北京上海开分店
- 在全国开分店并开通外卖
最重要的管理基础设施:通信网络
- 销售情况
- 原料数量
- 是否需要分店
- 发布促销活动
小结
- 蟹堡王顾客:客户端
- 蟹煲王分店:服务端
- 小区转发点/蟹堡王城市转发分店:路由器
- 转发表格:网络协议
客户端发 - 协议 - 小区路由器 - 分店服务端
城市转发路由器 - 协议 - 总店服务端
3 计算机网络基础
网络组成部分
- 主机:客户端和服务端
- 路由器
- 网络协议
主机负责提供和接收信息,路由器负责转发主机之间的信息,网络协议提供格式方便路由器和主机对于信息编码和解码。
网络结构:区域网,城域网,广域网
- 本地网络(LAN):每个店,每个小区
- 区域网络(MAN):小区的本地网络+蟹堡王分店
- 城域网络(CAN):城市分店之间
- 广域网络(WAN):城域网组成的网络
本地网络连接组成区域网,区域网连接组成城域网,城域网连接组成广域网。
信息交换方式
- 电路交换(Circuit Switching):打电话订餐
通讯双方建立一条固定专用线路,数据沿线路传输。缺点:实时通信,路径占用,浪费资源。
- 分组交换(Packet Switching):传真订餐
数据包独立传输,寻找最优路径,不浪费资源。
网络分层
OSI网络模型,一般来说是七层,但是五层在实际应用中更常见,因为它更加简洁。每一层是相互独立的存在,从低到高分别是:
- 物理层(Phycial Layer)
- 数据链路层(Data Link Layer)
- 网络层(Network Layer)
- 运输层(Transport Layer)
- 应用层(Application Layer):与会话层(session),表示层(presentation)合并
比如,在实际物流行业中:
- 高速公路:网络层(不在乎什么车走)
- 卡车:运输层(不在乎运的什么)
- 快递公司:应用层(不在乎包裹里是什么)
网络协议
- 协议的存在依赖于连接:两个实体(ex. 路由器,主机)之间能够交换信息,否则协议没有意义。
- 协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送/接收所采取的动作,相当于语言。
数据按照协议的格式封装传输,数据包分为两部分:
- 标头(Header):开头部分,包含用于处理和传输的控制信息
- 载荷(Payload):主体部分,包含世纪传输数据
比如在快递单中:一个信封套一个信封
对于寄件人收件人:
- 面单:标头(姓名地址)
- 包裹里的东西:载荷
对于快递公司:
- 面单:标头(上哪个车)
- 寄件人收件人和包裹:载荷
HTTP:超文本传输协议,应用层的协议,用于客户端和服务器之间传输超文本和其他资源。其请求响应包含标头信息用于描述和控制消息传输处理
4 Web 中的网络
4.1 HTTP
在下面的代码中,红色是请求,蓝色是响应
请求
-
起始行:
GET / HTTP/1.1。包含请求的方法(GET),路径(/ HTTP)和版本(1.1)。 -
头部:在起始行之后,每一行代表一个头部,比如
Host:info.cern.ch。分别以冒号分隔,左边代表头部名称,有大小写之分,右边为头部的值。- Host:指定请求目标服务器的域名,
Host: www.example.com - Connection:连接的控制选项,keep-alive表示客户端保持连接
- User-Agent:描述发起请求的客户端信息,包括操作系统,浏览器类型和版本等
- Accept:客户端支持接收的内容格式,比如HTML,XHTML,XML,WebP等格式的内容
- Accept-Language:客户端支持的语言和优先级
- Host:指定请求目标服务器的域名,
响应
-
状态行:
HTTP/1.1 200 OK。包含版本(HTTP1.1),状态码(200)和状态信息(OK),状态信息可以自定义。 -
头部:与请求相似
- Date:响应生成日期和时间
- Server:生成响应的服务器软件和版本信息
- Content-Type:指定响应体的媒体类型(HTML)
- Content-Length:响应体的字节长度
- Connection:连接的控制选项,close表示服务器在发送响应后将关闭连接
-
响应体:被空行与头部分隔开,是一个HTML页面
HTTP连接模型
- 无连接模型:1.0早期模型,每个请求响应都需要建立新连接,使用完关闭,性能较差,消耗资源时间
- 持久连接模型:1.1版本,可以在一个TCP发送多个请求响应,减少了建立关闭次数,通过Connection头部控制开关。但是有队头堵塞的可能:第二个请求需要等第一个请求结束才能发出,造成资源浪费
- 管理化链接模型:允许发送多个请求,按顺序响应,对于队头堵塞没有帮助
队头堵塞
-
建立多个TCP连接,将请求分散,但建立成本巨大,同时需要控制数量
-
HTTP2:将多个请求响应拆分为帧(frame),每个帧都有唯一的标识符,实现多路复用
- 流(stream):判断每个帧在哪个流,每个请求响应都有独立的流,帧根据流在服务器重组为完整的服务器响应
- 好处:通过不同类型的帧来实现调整响应传输的优先值,头部压缩,Server Push
- 弊端:在TCP上还是会队头堵塞
-
HTTP3(QUIC):加快速度
0 RTT
无法解决的问题
- 物理极限无法突破:美国到中国高于北京到上海
- 流量需要花钱
- 服务器承受流量不够大
CDN(Content Delivery Network)
- 按照地理位置分布服务器,将内容缓存到位于不同位置的服务器,客户可以从最近的服务器获取内容,优化网络资源访问速度
CDN:DNS劫持
- 网站自己完成域名解析
- 要加速域名让CDN厂商的域名解析服务器处理
- CBDN厂商根据来源选择最近的服务器IP
- 用户访问最近的CDN服务器
CDN缓存策略
-
拉策略(Pull):就近访问,CDN节点通过HTTP请求向源站请求数据并缓存到本地节点,直接从本地节点获取数据提供给用户。适用于数据更新量少的站点。
-
推策略(Push):预先访问,源站数据传送到CDN节点通过HTTP请求缓存,直接从本地节点获取数据提供给用户。适用于数据更新频繁的站点。
4.2 WebSocket 一种由HTTP升级而来的网络协议,可以在任何时间实现客户端和服务端的双向实时通信,避免了HTTP的请求响应延时
- 有状态的持久连接
- 服务端可以主动推送消息
- 延迟比HTTP低
5 网络安全
这些网络协议都是明文的,意味着消息在传输过程中都可以被看到,丢弃,篡改,导致银行转账无法在网络上进行
网络安全三要素
- 机密性:攻击者无法获知通信内容
- 完整性:攻击者对内容进行篡改时能被发现
- 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信(必须要先有秘密信息)
加密需要秘密信息(加密算法和密钥);完整性和身份验证互相关联,比如蟹老板向银行发起转账,银行需要确认这个请求真的是蟹老板发起的,目标账户和转账金额没有被篡改
加密方法
- 对称加密:加密,解密用同样的密钥。
- 非对称加密:加密,解密使用不同的密钥(公钥和私钥);公钥加密只能用私钥解密,私钥加密只能用公钥解密。
密码散列函数(哈希函数)
- 输入:任意长度内容
- 输出:固定长度哈希值
- 性质:找到两个不同输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的
如何实现机密性:
- 如果双方可以通过明文商量秘密信息,攻击者也可以
- 所以想要通过明文交换秘密信息,通信双方需要先有秘密信息
如何实现完整性
- 有明文m,密码散列函数H,以及密钥s
- 计算H(m+s)获得哈希值h
- 将m和h组合成新信息m+h
- 接受方拆分m+h,重新计算H(m+s)得h',对比h和h'
必须要先有一个秘密信息,密钥s。
如何实现身份验证
- 签名:用于鉴别身份和防止伪造
- 数字签名(指纹):对明文内容的哈希值使用私钥加密,验证者使用公钥验证。具有可鉴别(确认身份)和不可伪造(确保来源正确)的特性
- 证书链:验证的一连串证书
- 根证书:证书链的尽头
- PKI(Public Key Infrastructure):分发证书,验证证书的基础设施
必要要先有一个秘密信息,根证书里的公钥。
HTTPS
- 使用PKI对服务器提供的证书进行验证
- 使用验证后的证书中的非对称加密公钥与服务器交换对称加密的密钥
- 使用验证后的对称密钥的算法和密钥对明文进行加密
- 客户端要求用户端提供身份密码信息进行验证