第一节的课程是计算机网络概论,计算机网络与计算机组成原理、计算机操作系统、数据结构并称“计算机四大件”,是基础中的基础,当然还是要一直巩固复习。
课程目标
- 建立对计算机网络的整体认知,对计算机网络中的各种概念(网络分层、网络协议、网络应用等)有初步的理解。
- 可以在后续的实际工作中高效解决网络问题。
课程介绍(会做什么?)
- 通过一个示例建立对计算机网络的整体认识
- 建立对网络协议分层的认知
- 分析HTTP 1、2、3的关系
- 介绍CDN运行的基本原理
- 了解网络安全的最基本原则
(不会做什么?)
- 详细描述如何开发一个基于HTTP协议的网络应用
- 深入介绍课程中所涉及协议的规范
分析方法
在课程学习中交替运用自底向上和自顶向下两种分析方法
- 自底向上:
- 从简单开始,变复杂
- 将模块逐步拼凑成一个系统
- 自顶向下
- 从复杂开始,变简单
- 从复杂的系统问题入手,拆分为模块问题
02 “蟹堡王帝国”
三步走战略
-
主店开通外卖
- 电话外卖
- 谁吃?吃什么?送到哪?
- 电话外卖
-
开设分店
- 分店
- 北京,上海
- 通信线路
- 赚了多少
- 确定原料数量
- 是否需要新分店
- 促销
转发
来自 分店 发往 主店 内容 今日销售数据:1000个 来自 主店 发往 分店 内容 明日促销:全场8折 - 分店在哪
- 居民居住分散
- 城市中小区密度较高
- 小区中每家都直连,成本太高
- 全国通信线路图
- 分店
-
分店开通外卖
小结
- 顾客:客户端
- 分店:服务端
- 小区转发点和城市转发分店:路由器
- 转发表格:网络协议
03 计算机网络基础
网络组成部分
- 主机:客户端、服务端
- 路由器
- 网络协议
网络结构:网络的网络
- 小区网络:本地网络
- 分店+主店:本地网络节点的网络
- 全国通信:本地网络的网路
区域网、城域网、广域网
电路交换&分组交换
电路交换(Circuit Switching): 电路交换最早用于电话系统,主要用于语音通信。在电路交换中,通信双方之间建立一条固定的、专用的物理通信路径。在通话过程中,这条路径会一直被保留,直到通话结束。数据沿着这条路径顺序传输。
特点
- 确保了连续性:由于通信双方之间有一条专用的通信路径,因此数据传输具有连续性和实时性,适用于实时通信,如电话通话。
- 低效:在通信过程中,即使没有数据传输,通信路径也会一直被占用。这可能导致资源浪费,尤其在数据传输量不大的情况下。
- 通话建立时间较长:在建立通话之前,需要为通信双方分配一条物理路径,这个过程可能需要较长的时间。
分组交换(Packet Switching): 分组交换是现代计算机网络(如互联网)中主要使用的通信技术。在分组交换中,数据被切分成多个数据包(或称分组),每个数据包独立传输。数据包在网络中根据最佳路由选择相应的路径,最终在目的地重新组装成原始数据。
特点
- 高效:数据包在网络中独立传输,可以根据网络拥塞情况动态选择最佳路径。这样可以实现更高效的资源利用和更快的数据传输速率。
- 弹性:由于数据包可以通过不同的路径传输,因此分组交换网络具有较强的抗干扰能力和容错性。
- 适用于多种应用:分组交换可以处理多种类型的数据(如文本、图像、音频和视频),非常适合复杂的计算机网络应用。
电路交换和分组交换是两种截然不同的通信技术。电路交换主要用于实时通信,如电话系统,而分组交换则广泛应用于现代计算机网络,如互联网。分组交换具有更高的资源利用率和更强的适应性,因此在大多数场景下,分组交换是更优的选择
作者:2002XiaoYu链接:juejin.cn/post/722136…
网络分层
在实际应用中,网络模型经常会简化为五层模型。五层模型与 OSI 七层模型的主要区别在于它将会话层、表示层和应用层合并为一个层次,并将物理层和数据链路层合并为一个层次。
物理层和数据链路层(Physical and Data Link Layers):
结合了 OSI 模型中的物理层和数据链路层,负责处理数据链路的建立、维护和断开,以及物理介质上的比特流传输和信号编码等任务。
网络层(Network Layer):
网络层与 OSI 模型中的网络层相同,负责处理网络寻址和路由选择,以确定数据包从源节点到目的节点的最佳路径。
传输层(Transport Layer):
传输层与 OSI 模型中的传输层相同,负责提供端到端的通信服务,包括数据的分段、传输、重组和确认。传输层还负责处理流量控制和差错控制。
应用层(Application Layer):
这个层次结合了 OSI 模型中的会话层、表示层和应用层,负责处理与特定应用程序相关的通信任务,以及数据的表示和编码问题。
五层模型在实际应用中非常常见,因为它相对于七层模型更加简洁,同时涵盖了网络通信的主要功能。五层模型的应用可以简化网络协议的设计和实现,便于网络设备和协议的互操作。
作者:2002XiaoYu链接:juejin.cn/post/722136…
- 快递员不关心包裹里是什么(应用层)
- 卡车司机不关心车里是什么(传输层)
- 高速公路不关心在开什么车(网络层)
协议
协议的存在依赖于连接。
01001000 01100101 01101100 01101100 01101111 00101100 00100000
01010111 01101111 01110010 01101100 01100100 00100001
72 | 101 | 108 | 108 | 111 | 44 | 32 | 87 | 111 | 114 | 108 | 100 | 33
H e l l o , W o r l d !
协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接受一条报文或其他事件所采取的动作。
标头和载荷
收件人、寄件人关注:
- 收件地址、寄件地址
- 收件人、寄件人的姓名和电话
- 包裹内容
快递公司关注:
- 收件人、寄件人关注的东西
- 该由哪个集散点发出,哪个集散点收
- 哪个网点派送
HTTP协议
HTTP协议示例: 链路层 - 本地头部
HTTP协议示例: 链路层-IP 协议头部
HTTP协议示例: 运输层 - TCP 协议头部
HTTP协议示例: 应用层 - HTTP 协议头部
TCP协议格式
小结
- 网络组成部分:由主机、路由器、交换机等组成
- 网络结构:网络的网络
- 信息交换方式:电路交换和分组交换
- 网络分层:分清职责,物理层、链路层、网络层、运输层和应用层
- 网络协议:标头和载荷
WEB中的网络
HTTP协议
上头红色部分为请求,蓝色部分为响应
请求方法 资源路径 HTTP版本
HTTP版本 状态码 状态信息
HTTP连接模型
队头堵塞(Head of Line Blocking)
HTTP 1.1: 无法多路复用
//main.js
console.log('hello world');
/* style.css */
body {
color: red;
}
body {
console.log('hello world');
color: red;
}
HTTP 2: 帧
request=style.css, content='body {'
request=main.js, content='console.log('hello world')'
request=style.css, content=' color: red;'
request=style.css, content='}'
HTTP 2: 帧带来的额外好处
- 调整响应传输的优先级
- 头部压缩
- Server Push
HTTP 2: 队头堵塞,但是在 TCP 上
- TCP 包 0: 包含了(包含了 style.css 的第 1行内容) 的 HTTP 2 的帧
- TCP 包 1: 包含了 (包含了 mainjs 的全部内容) 的 HTTP 2 的帧
- TCP 包 2: 包含了 (包含了 style.css 的第 2 行内容)的 HTTP 2 的帧
- TCP 包 3: 包含了 (包含了 style.css 的第 3 行内容) 的 HTTP 2 的帧
HTTP 3: QUIC
- Quick UDP Internet Connection
- 现存网络设备对 TCP 和 UDP 支持已经僵化
- UDP 不靠谱但是 OUIC 靠谱
- OUIC 可以为除 HTTP 协议以外的应用层协议提供支持
CDN(Content Distribution Network)
-
基本思路:
尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
-
目的:
解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度和成功率。控制时延无疑是现代信息科技的重要指标,CDN的意图就是尽可能的减少资源在转发、传输、链路抖动等情况下顺利保障信息的连贯性。
控制时延无疑是现代信息科技的重要指标,CDN的意图就是尽可能的减少资源在转发、传输、链路抖动等情况下顺利保障信息的连贯性。
-
优点:
- 更快地传递内容
- 更多同步用户
- 持续可用性
- 可靠的内容传递
- 控制资产交付
- 防止流量高峰
CDN: DNS 劫持
- 域名解析一般由网站自己处理
- 要加速的域名则重定向到 CDN 广商的域名解析服务处理
- CDN 厂商根据来源确定最近的 CDN 服务器的 IP
- 用户直接访问最近的 CDN 服务器
拉取策略(Pull)和推送策略(Push)
- 拉取策略,也叫做就近访问策略,指的是 CDN 节点通过 HTTP 请求直接向源站请求数据,然后缓存到本地节点,当用户请求数据时,就直接从缓存的本地节点中获取数据。这种策略主要用于数据更新较少的情况,适用于流量较小、访问频率低的站点。
- 推送策略,也叫做预先访问策略,指的是将源站的数据推送到 CDN 节点,通过 HTTP 请求缓存到 CDN 节点,当用户请求数据时,直接从缓存的本地节点中获取数据。这种策略适用于数据更新频繁的情况(比如视频举例的热门新电影上线的时候,就可以使用推送策略,全国用户可以第一时间 获取新电影),可以有效地缓解源站的访问压力,提高用户访问速度。推送策略需要源站和 CDN 之间建立预先配置好的链接,源站通过这个链接将数据推送到 CDN 节点。
拉取策略:
优点:
- 可以实时获取最新数据,不需要手动推送数据。
- 可以有效地缓解源站的访问压力,节省带宽和资源。
- 部署简单,不需要与源站建立链接。
缺点:
- 访问速度可能较慢,特别是在访问量较大时。
- 需要源站保持开放状态,以便 CDN 节点随时请求数据。
推送策略:
优点:
- 访问速度较快,因为数据已经预先推送到了 CDN 节点。
- 可以减轻源站的访问压力,提高网站的稳定性和可靠性。
缺点:
- 需要手动推送数据到 CDN 节点。
- 可能会出现数据不一致问题,需要定期同步数据。
- 部署和维护较为复杂,需要建立预先配置好的链接。
作者:2002XiaoYu链接:juejin.cn/post/722136…
WebSocket
WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
- 有状态的持久连接
- 服务端可以主动推送消息
- 用 WebSocket 发送消息延迟比 HTTP 低
WebSocket代码示例
- 服务端
//作者:2002XiaoYu链接:https://juejin.cn/post/7221367770066550839来源:稀土掘金
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
console.log('Client connected');
// 接收客户端发送的消息并广播给所有连接的客户端
ws.on('message', (message) => {
console.log(`Received message: ${message}`);
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
// 连接关闭后执行的回调函数
ws.on('close', () => {
console.log('Client disconnected');
});
});
server.listen(3000, () => {
console.log('WebSocket server started on port 3000');
});
- 客户端
//作者:2002XiaoYu链接:https://juejin.cn/post/7221367770066550839来源:稀土掘金
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Example</title>
</head>
<body>
<h1>WebSocket Example</h1>
<input type="text" id="message">
<button id="send">Send</button>
<ul id="messages"></ul>
<script>
const messages = document.getElementById('messages');
const messageInput = document.getElementById('message');
const sendButton = document.getElementById('send');
// 创建 WebSocket 连接
const ws = new WebSocket('ws://localhost:3000');
// 连接成功后执行的回调函数
ws.addEventListener('open', () => {
console.log('Connected to WebSocket server');
});
// 接收服务器发送的消息并显示在页面上
ws.addEventListener('message', (event) => {
const li = document.createElement('li');
li.textContent = event.data;
messages.appendChild(li);
});
// 发送消息给服务器
sendButton.addEventListener('click', () => {
const message = messageInput.value;
ws.send(message);
messageInput.value = '';
});
</script>
</body>
</html>
小结
- HTTP 1 2 3 的演进历史
- CDN解决了HTTP协议之外的问题
- WebSocket 从 HTTP 协议升级而来
05 网络安全
网络安全三要素
- 机密性:攻击者无法获知通信内容
- 完整性:攻击者对内容进行篡改时能被发现
- 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信
密码散列函数(哈希函数)
- 输入:任意长度的内容
- 输出:固定长度的哈希值
- 性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值在计算上是不可能的
网络安全:机密性
- 加密需要加密算法和密钥等信息(统称为秘密信息)
- 网络是明文的,不安全
网络安全:完整性和身份验证
完整性和身份验证相互关联。
例
- 蟹老板向银行发起了转账请求
- 银行需要确认
- 这个请求真的是蟹老板发起的
- 目标账户和转账金额没有被篡改
网络安全:如何实现机密性
- 已知: 网络是明文的
- 如果双方可以通过明文通信商量出秘密信息,那么攻击者也可以
- 所以想要通过明文通信交换秘密信息,通信双方需要先有秘密信息
网络安全:如何实现完整性
-
密码散列函数性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的
-
有明文 m,密码散列函数 H
-
计算 H(m) 获得哈希值 h
-
将 m 和 h 组合成新信息 m + h
-
接收方拆分 m + h,重新计算 H(m) 得 h‘,对比 h’ 和 h
网络安全:如何实现完整性
-
有明文 m,密码散列函数 H,以及一个密钥 s
-
计算 H(m + s) 获得哈希值 h
-
将 m和 h 组合成新信息 m + h
-
接收方拆分 m + h,重新计算 H(m + s) 得 h‘,对比 h' 和 h
-
所以想要实现完整性,通信双方需要先有秘密信息
网络安全:如何实现身份验证
- 签名: 用于鉴别身份和防止伪造
- 非对称加密性质: 加密、解密使用不同的密钥 (公钥和私钥),而且公钥加密只能用私钥解密、私钥加密只能用公钥解密
- 蟹老板用自己的私钥对信件进行加密,并发送给海绵宝宝
- 海绵宝宝使用蟹老板的公钥进行解宓,获得原文
- 保证了机密性、完整性和身份验证
网络安全:如何实现身份验证
- 数字签名: 对明文内容的哈希值使用私钥加密,验证者使用公钥验证
- 数字签名 (指纹) = 私钥加密(密码散列函数 (原文) )
- 消息 = 原文 + 数字签名
- 一般用于对公开内容(如包含公钥的证书)进行数字签名,防止篡改
- 可信的人验证蟹老板的公钥
- 那谁验证可信的人的公钥?
- 根证书是证书链的尽头
- 验证的一连串证书称为证书链
- 分发证书、验证证书的基础设施称为 PKI(Public Key Infrastructure)
PKI具体是什么?
PKI(Public Key Infrastructure,公钥基础设施)是一种安全技术体系,用于管理和分发数字证书、公钥和私钥等密钥材料,以保证数字通信和电子商务中的安全性、可信性和可靠性。
PKI 体系由以下几个组成部分构成:
- 数字证书:数字证书是一种用于证明某个实体身份和公钥信息的电子凭证,由认证机构(CA)进行签发和管理。数字证书包括证书拥有者的身份信息、公钥、数字签名等信息,可以用于身份验证、数据加密和数字签名等场景。
- 证书颁发机构(CA):CA 是 PKI 体系的核心组成部分,负责签发、验证和管理数字证书。CA 通常是由信任机构或政府部门颁发,具有可信的身份和信誉,是数字证书可靠性的保证。
- 注册机构(RA):RA 是 CA 的辅助机构,负责验证证书申请者的身份信息和授权申请数字证书。
- 数字签名:数字签名是一种用于验证数字证书有效性和真实性的技术,可以确保数据的完整性、不可否认性和真实性。
- 证书撤销列表(CRL):CRL 是由 CA 管理的一份撤销数字证书的列表,如果数字证书已经被撤销,则该数字证书将无法继续使用。
- 证书存储库(CS):CS 是用于存储数字证书和其他密钥材料的安全存储设施。
PKI 是一种安全技术体系,用于管理和分发数字证书、公钥和私钥等密钥材料,以保证数字通信和电子商务中的安全性、可信性和可靠性。PKI 体系由数字证书、CA、RA、数字签名、CRL 和 CS 等组成部分构成,可以应用于身份验证、数据加密和数字签名等场景。
作者:2002XiaoYu链接:juejin.cn/post/722136…
所以想要实现身份验证,通信双方需要先有秘密信息,即根证书中的公钥
证书链示例
网络安全:HTTPS
把 HTTP 的明文换成密文,再验证身份,即 HTTPS.
- HTTPS = HTTP + TLS
- TLS = 身份验证 + 加解密
- 身份验证靠 PKI
服务端身份验证靠 PKI,客户端身份验证靠 HTTP 协议。
小结
- 网络安全三要素: 机密性、完整性和身份验证
- 在没有提前交换秘密信息的前提下,无法在不安全的信道交换秘密信息
- PKI 保证了普通用户不需要“面对面”和根证书机构交换根证书
- HTTPS 使用 PKI 完成了除客户端身份验证以外的特性,客户端身份验证靠 HTTP 协议实现
课程总结
参考
- 计算机网络 (原书第7版),机械工业出版社
- HTTP 权威指南,人民邮电出版社
- 密码编码学与网络安全 (第6版) ,电子工业出版社
- web.dev/performance…
- calendar.perfplanet.com/2020/head-o…
- juejin.cn/post/722136…