计算机网络概论
前言 & 课程介绍
课程目标和收益
建立对计算机网络的整体认知,对计算机网络中的各种概念(网络分层、网络协议、网络应用等)有初步的理解。进而可以在后续的实际工作中能高效解决网络问题。
课程介绍
- 通过一个示例建立对计算机网络的整体认识
- 建立对网络协议分层的认知
- 分析 HTTP 1、2、3 的关系
- 介绍 CDN 运行的基本原理
- 了解网络安全的最基本原则
分析方法
1、自底向上
- 从简单开始,逐渐变复杂
- 将模块逐步拼凑成一个系统
2、自顶向下
- 从复杂开始,逐渐变简单
- 从复杂的系统问题入手,拆分为模块问题
蟹堡王帝国
故事前言
📈 小目标:蟹老板想挣一个“小目标”
🛠︎ 三步走战略
- 在比奇堡开通外卖
- 在北京和上海开分店
- 在全国开分店并开通外卖
杭州分店
蟹老板又想开新的分店,如何通信?
建立一个蟹堡王城市转发点分店,通信距离缩短。
蟹堡王全国的通信路线图
小结
- 蟹堡王顾客:客户端
- 蟹堡王分店:服务端
- 小区转发点和蟹堡王城市转发点分店:路由器
- 转发表格:网络协议
网络基础
网络组成部分
- 主机:客户端和服务器
- 路由器
- 网络协议
网络结构:网络的网络
1、局域网(LAN)
是指在较小的地理范围内(一般小于10km)由计算机、通信线路(一般为双绞线)和网络连接设备(一般为集线器或交换机)组成的网络。
2、城域网(MAN)
是指在一个城市范围内(一般小于100km)由计算机、通信线路(包括有限介质和无线介质)和网络连接设备(一般为集线器、交换机和路由器等)组成的网络。
3、广域网(WAN)
比城域网范围大,是由多个局域网或城域网组成的网络。目前,已不能明确区分广域网和城域网,或者也可以说城域网的概念越来越模糊了,因为在实际应用中,已经很少有封闭在一个城市内的独立网络。互联网是世界上最大的广域网。
信息交换方式
1、电路交换
在数据通信网发展初期,人们根据电话交换原理,发展了电路交换方式。当用户要发信息时,由源交换机根据信息要到达的目的地址,把线路接到目的交换机。这个过程称为线路接续,是由所谓的联络信号经存储转发方式完成的,即根据用户号码或地址(被叫),经局间中继线传送给被叫交换局并转被叫用户。线路接通后,就形成了一条端对端(用户终端和被叫用户终端之间)的信息通路,在这条通路上双方即可进行通信。通信完毕,由通信双方的某一方向自己所属的交换机发出拆除线路的要求,交换机收到此信号后就将此线路拆除,以供别的用户呼叫使用。电路交换与电话交换方式的工作过程很类似。
由于电路交换的接续路径是采用物理连接的,在传输电路接续后,控制电路就与信息传输无关,所以电路交换方式的主要优点是数据传输可靠、迅速,不丢失且保持原来的序列;缺点是在有的环境下,电路空闲时的信道容量被浪费,而且如果数据传输阶段的持续时间不长,电路建立和拆除所用的时间也得不偿失。因此它适合于系统间要求高质量的大量数据传输的情况,一般按照预定的带宽、距离和时间来计费。
2、分组交换
分组交换也称包交换,它是将用户传送的数据划分成长度一定的部分,每个部分叫作一个分组。分组交换与报文交换都是采用存储-转发交换方式。二者的主要区别是,报文交换时报文的长度不限且可变,而分组交换的报文长度不变。分组交换首先把来自用户的数据暂存于存储装置中,并划分为多个一定长度的分组,每个分组前边都加上固定格式的分组标题,用于指明该分组的发端地址、收端地址及分组序号等。
以报文分组作为存储转发的单位,分组在各交换节点之间传送比较灵活,交换节点不必等待整个报文的其他分组到齐,一个分组、一个分组地转发。这样可以大大压缩节点所需的存储容量,也缩短了网路时延。另外,较短的报文分组相比于长的报文可大大减少差错的产生,提高了传输的可靠性。
分组交换通常有两种方式,即数据包方式和虚电路方式。数据包方式,是每一个数据分组都包含终点地址信息,分组交换机为每一个数据分组独立地寻找路径。因一份报文包含的不同分组可能沿着不同的路径到达终点,在网路终点需要重新排序。所谓虚电路,就是两个用户终端设备在开始互相发送和接收数据之前,需要通过网路建立的逻辑上的连接,一旦这种连接建立之后,就在网路中保持已建立的数据通路,用户发送的数据(以分组为单位)将按顺序通过网路到达终点。当用户不需要发送和接收数据时,可以清除这种连接。
特点
- 线路利用率高
- 不同种类的终端可以相互通信
- 信息传输可靠性高
- 分组多路通信
网络分层
1、OSI 的体系结构
物理层
物理层是OSI分层结构体系中最重要、最基础的一层,它建立在传输媒介基础上,实现设备之间的物理接口。物理层只是接收和发送一串比特流,不考虑信息的意义和信息的结构。
它包括对连接到网络上的设备描述其各种机械的、电气的和功能的规定,还定义电位的高低、变化的间隔、电缆的类型、连接器的特性等。物理层的数据单位是位。
数据链路层
数据链路层实现实体间数据的可靠传送。通过物理层建立起来的链路,将具有一定意义和结构的信息正确地在实体之间进行传输,同时为其上面的网络层提供有效的服务。在数据链路层中对物理链路上产生的差错进行检测和校正,采用差错控制技术保证数据通信的正确性;数据链路层还提供流量控制服务,以保证发送方不致因为速度快而导致接收方来不及正确接收数据。数据链路层的数据单位是帧。
网络层
网络层也称通信子网层,是高层协议与低层协议之间的界面层,用于控制通信子网的操作,是通信子网与资源子网的接口。网络层的主要任务是提供路由,为信息包的传送选择一条最佳路径。网络层还具有拥塞控制、信息包顺序控制及网络记账等功能。在网络层交换的数据单元是包。
传输层
传输层获得下层提供的服务包括发送和接收顺序正确的数据块分组序列,并用其构成传输层数据;获得网络层地址,包括虚拟信道和逻辑信道。
会话层
会话层用于建立、管理以及终止两个应用系统之间的会话。它是用户连接到网络的接口,基本任务是负责两主机间的原始报文的传输。
表示层
表示层向上对应用层服务,向下接受来自会话层的服务。表示层为在应用过程之间传送的信息提供表示方法提供,它关心的只是发出信息的语法与语义。表示层要完成某些特定的功能,主要有不同数据编码格式的转换,提供数据压缩、解压缩服务,对数据进行加密、解密。
应用层
应用层是通信用户之间的窗口,为用户提供网络管理、文件传输、事务处理等服务,其中包含若干个独立的、用户通用的服务协议模块。应用层是 OSI 的最高层,为网络用户之间的通信提供专用程序。
2、TCP/IP 的体系结构
网络协议
前提条件:协议的存在依赖于连接。
协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接受一条报文或其他事件所采取的动作。
标头和载荷
🌰 例子
收件人、寄件人关注:
- 收件地址、寄件地址
- 收件人、寄件人的姓名和电话
- 包裹信息
快递公司关注:
- 收件人、寄件人关注的东西
- 该由哪个集散点发出,哪个集散点收
- 哪个网点派送
HTTP协议示例
TCP 协议格式
Web 应用
HTTP 协议
HTTP 连接模型
HTTP 1.1:无法多路复用
HTTP 2:帧
帧带来的额外好处
- 调整响应传输的优先级
- 头部压缩
- Server Push
HTTP 2:队头堵塞,但是在 TCP 上
- TCP 包 0:包含了的(包含了 style.css 第 1 行内容)HTTP 2 的帧
- TCP 包 1:包含了的(包含了 main.js 的全部内容)HTTP 2 的帧
- TCP 包 2:包含了的(包含了 style.css 第 2 行内容)HTTP 2 的帧
- TCP 包 3:包含了的(包含了 style.css 第 3 行内容)HTTP 2 的帧
TCP 包 1 丢包了
HTTP 2:3 RTT 启动
- HTTP 客户端:我要和大哥说话!
- TCP 客户端默默对 HTTP 客户端说,我知道你很急,但你先别急。
- TCP 客户端:嗨!服务器,你在吗?
- TCP 服务端:嗨!客户端,我在,你在吗?
- TLS 客户端:Hello!能给我把钥匙吗?
- TLS 服务端:Hello!给!你的钥匙!
- HTTP 客户端:终于到我了,我要 index.html!
HTTP 3:QUIC
- Quick UDP Internet Connection
- 现存网络设备对 TCP 和 UDP 支持已经僵化
- UDP 不靠谱但是 QUIC 靠谱
- QUIC 可以为除 HTTP 协议以外的应用层协议提供支持
HTTP 3:QUIC - 1 RTT
QUIC 第一次访问
- HTTP 客户端:我要和大哥说话!
- QUIC 客户端:嗨!服务器,你在吗?在的话能给我把钥匙吗?
- QUIC 服务端:嗨!客户端,我在,这是你的钥匙!
- HTTP 客户端:今天这么快?我要 index.html!
- QUIC 服务端(偷偷告诉客户端):这还有把钥匙,下次找我可以不用问,直接用
HTTP:QUIC - 0 RTT
QUIC 第二次访问
- HTTP 客户端:我要和大哥说话!
- QUIC 客户端:嗨!服务器,你在吗?后面的话我已经用上次你给我的钥匙加密过了,HTTP 那小子肯定要 index.html!
- QUIC 服务端:嗨!客户端,我在,我知道你要 index.html,给你!
- HTTP 客户端:?
CDN
1、CDN 服务器分布
CDN:你无法突破物理极限的
- HTTP3快吗?
- 快!
- 那从美国到中国,HTTP 3要多久?
- 150ms!
- 和北京到上海比,还快吗?
- 好像不够?
CDN:你的钱包够鼓吗?
- 流量多少钱一个G?
- 1块
- 那我在北京给上海的人发一部 10G 电影得 10 块?
- 对!
- 发 10 次一样的电影要 100 块?
- 是的!
- 我都发到上海了,不能内部共享一下吗?
CND:你,够强大吗?
- 我们有几台服务器?
- 1台
- 他能抗多少流量?
- 100G!
- 双十一峰值得 1000G,扛得住吗?
- 不一定,可能会挂。。。
2、CDN 服务器选择
最多跳两次!
3、DNS 劫持
- 域名解析一般由网站自己处理
- 要加速的域名则重定向到 CDN 厂商的域名解析服务处理
- CDN 厂商根据来源确定最近的 CDN 服务器的 IP
- 用户直接访问最近的 CDN 服务器
4、CDN 服务器内容管理策略
拉策略
- 默认情况下什么也不做
- 谁需要了,先看看仓库有没有
- 有,直接给
- 没有,你等着,我去买个橘子
- (每隔几天)这都啥啊,丢了
推策略
- 大哥说今天你存这些,明天存那些
- 谁需要了,先看看仓库有没有
- 有,直接给
- 没有,你等着,我去买个橘子
- 大哥说这个、这个还有这个,丢了
WebSocket
- 有状态的持久连接
- 服务器可以主动推送消息
- 用 WebSocket 发送信息延迟比 HTTP 低
WebSocket示例
服务器代码
const { WebSockerServer } = require('ws');
const wss = new WebSockerServer({ port: 8080 });
wss.on('connection',function connection(ws) {
// 有新连接时监听来自客户端的消息
ws.on('message', function message(data) {
// 打印收到的消息,再把消息原封不动地发回给客户端
console.log('received: %s', data);
ws.send(data);
});
});
客户端代码
const { WebSockerServer } = require('ws');
const ws = new WebSockerServer('ws://locoalhost: 8080');
ws.on('open',function open() {
// 当连接建立时,向服务器端发送一条消息
ws.send('someting');
});
ws.on('message', function message(data) {
// 当收到来自服务器端的消息时,打印出来
console.log('received: %s', data);
});
HTTP请求
HTTP 响应头
WebSocket:发送消息
WebSocket 客户端消息
WebSocket 服务端消息
网络安全
三要素
- 机密性:攻击者无法获知通信内容
- 完整性:攻击者对内容进行篡改时能被发现
- 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信
对称加密和非对称加密
- 对称加密:加密、解密用同样的密钥
- 非对称加密:加密、解密使用不同的密钥(公钥和私钥),而且公钥加密只能用私钥解密、私钥加密只能用公钥解密
密码散列函数(哈希函数)
输入:任意长度的内容
输出:固定长度的哈希值
性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的
机密性
加密需要加密算法和密钥等信息(统称为秘密信息)。
网络是明文的,不安全。
思考:怎么在不安全的信道交换秘密信息?
完整性和身份验证
完整性和身份验证相互关联。
🌰 例子
蟹老板向银行发起了转账请求
银行需要确认
这个请求真的是蟹老板发起的
目标账户和转账金额没有被篡改
如何实现机密性
- 已知:网络是明文的
- 如果双方可以通过明文通信商量出秘密信息,那么攻击者也可以
- 所以想要通过明文通信交换秘密信息,通信双方需要先有秘密信息
如何实现完整性
密码散列函数性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的。
- 有明文 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
所以想要实现身份验证,通信双方需要先有秘密信息,即根证书中的公钥
证书链示例
HTTPS
把 HTTP 的明文换成密文,再验证身份,即 HTTPS 。
-
HTTPS = HTTP + TLS
-
TLS = 身份验证 + 加解密
身份验证靠 PKI
服务器身份验证靠 PKI,客户端身份验证靠 HTTP 协议。