计算机网络基础
网络组成部分
- 主机:客户端和服务端
- 路由器
- 网络协议
网络结构:网络的网络
- 比奇堡和小区网络:本地网络
- 北京和上海分店+比奇堡:三个本地网络节点的网络
- 全国通信网络:本地网络的网络
- 区域网络、城域网和广域网
电路交换&分组交换
- 电路交换:电路交换最早用于电话系统,主要用于语音通信。在电路交换中,通信双方之间建立一条固定的、专用的物理通信路径。在通话过程中,这条路径会一直被保留,直到通话结束。数据沿着这条路径顺序传输。(这种方式还是比较低效,只有一条路径)
- 分组交换:分组交换是现代计算机网络中主要使用的通信技术。在分组交换中,数据被切分成多个数据包,每个数据包独立传输。数据包在网络中根据最佳路由选择相应的路径,最终在目的地重新组装成原始数据。(较高效)
网络分层
每一层都有自己的功能,以下是从低到高分为的五层
- 物理层
- 链路层
- 网络层
- 运输层
- 应用层
协议
协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接受一条报文或其他事件所采取的动作。
标头和载荷
标头:标头是数据包或帧的开头部分,包含了用于处理和传输数据的控制信息。标头中的信息根据不同的协议和网络层次而有所不同。
载荷:载荷是数据包或帧的主体部分,包含了实际要传输的数据。载荷的内容根据不同的应用和场景而有所不同。
小结
- 网络组成部分:由主机、路由器、交换机等组成
- 网络结构:网络的网络
- 信息交换方式:电路交换和分组交换
- 网络分层:分清职责,物理层、链路层、网络层、运输层和应用层
- 网络协议:标头和载荷
Web中的网络
HTTP协议
上面红字部分是请求(可以通过开头辨别意思和功能)
下面蓝字部分是响应
HTTP连接模型
-
无连接模型: 在早期的 HTTP/1.0 版本中,HTTP 使用无连接模型。这意味着每个 HTTP 请求和响应都需要建立一个新的 TCP 连接。在处理完一个请求后,服务器会关闭连接。(这种模型简单易实现,但在高延迟和大量并发请求的场景下,性能较差。每个连接的建立和关闭都会消耗资源和时间,导致延迟增加和服务器负载过高)
-
持久连接模型: 为了解决无连接模型的性能问题,HTTP/1.1 引入了持久连接模型。在持久连接模型中,客户端和服务器可以在一个 TCP 连接上发送多个 HTTP 请求和响应。(这种模型减少了 TCP 连接的建立和关闭次数,降低了延迟和服务器负载,提高了性能)
-
管道化连接模型: HTTP/1.1 还引入了管道化连接模型,它允许客户端在收到上一个请求的响应之前,连续发送多个请求。服务器会按照请求的顺序依次处理,并按顺序返回响应。这种模型进一步提高了连接的利用率和性能。
可以从下图看出三种连接模型的利弊,和连接方式
队头堵塞
HTTP1.1:无法多路复用
HTTP/1.1 无法实现多路复用的主要原因是其基于文本的请求和响应格式以及协议设计。在 HTTP/1.1 中,每个请求和响应都是一个完整的文本消息,必须按照顺序发送和接收。这导致了一种称为“队头阻塞”的问题,即一个请求或响应的处理延迟会影响后续的请求和响应,无法并行处理。虽然 HTTP/1.1 引入了管道化技术以尝试提高性能,但由于实际部署中的兼容性和实现问题,管道化并未广泛应用。
HTTP2:帧
在 HTTP/2 中,帧(Frame)是协议的基本传输单位。HTTP/2 将请求和响应消息分解为多个小的二进制帧,这些帧在客户端和服务器之间传输。每种类型的帧都有特定的目的和格式。使用帧可以实现更高效的多路复用,避免队头阻塞问题,提高传输性能。
帧带来的好处
- 调整响应传输的优先级
- 头部压缩
- Server Push
HTTP3:QUIC
- Quick UDP Internet Connection
- 现存网络设备对TCP和UDP支持已经僵化
- UDP不靠谱(包丢了就不管了,业务给多少数据,它就发多少数据)但是QUIC靠谱
- QU1C可以为除HTP协议以外的应用层协议提供支持
CDN
CDN:DNS劫持
- 域名解析一般由网站自己处理
- 要加速的域名则重定向到CDN厂商的域名解析服务处理(通常不是由自己来解析,而是由CDN厂商来做)
- CDN厂商根据来源确定最近的CDN服务器的IP
- 用户直接访问最近的CDN服务器
WebSocket
- 有状态的持久连接
- 服务端可以主动推送消息
- 用VebSocket发送消息延迟比HTTP低
WebSocket代码示例
服务端代码
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws){
//有新连接时监听来自客户端的消息
ws.on('message', function message(data) {
//打印收到的消息,再把消息原封不动地发回给客户端
console.log('received: %s', data);
ws.send(data);
});
});
客户端代码
const ws = new WebSocket('ws://localhost:8080');
ws.on('open', function open(){
//当连接建立时,向服务端端发送一条消息
ws.send('something');
});
ws.on('message', function message(data) {
//当收到来自服务端的消息时,打印出来
console.log('received: %s', data);
});
小结
- HTTP123的演进历史
- CDN解决了HTTP协议之外的问题
- WebSocket从HTTP 协议升级而来
网络安全
网络安全三要素
- 机密性:攻击者无法获知通信内容
- 完整性:攻击者对内容进行篡改时能被发现
- 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信
网络安全:对称加密和非对称加密
- 对称加密:加密、解密用同样的密钥
- 非对称加密:加密、解密使用不同的密钥(公钥和私钥),而且公钥加密只能用私钥解密、私钥加密只能用公钥解密
网络安全:密码散列函数(哈希函数)
- 输入:任意长度的内容
- 输出:固定长度的哈希值
- 性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的
网络安全:机密性
- 加密需要加密算法和密钥等信息(统称为秘密信息)
- 网络是明文的,不安全
网络安全:完整性和身份验证
完整性和身份验证相互关联。
如何实现机密性
- 已知:网络是明文的
- 如果双方可以通过明文通信商量出秘密信息,那么攻击者也可以
- 所以想要通过明文通信交换秘密信息,通信双方需要先有秘密信息(通俗来讲,需要有一个只有双方知道的秘密消息,就可以在明面上进行交流)
如何实现完整性
- 密码散列函数性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的
- 有明文m,密码散列函数H
- 计算H(m)获得哈希值h
- 将m和h组合成新信息m+h
- 接收方拆分m+h,重新计算H(m)得h',对比h'和h
- 想要实现身份验证,通信双方需要先有秘密信息
如何实现身份验证
- 签名:用于鉴别身份和防止伪造
- 非对称加密性质:加密、解密使用不同的密钥(公钥和私钥),而且公钥加密只能用私钥解密、私钥加密只能用公钥解密
- 例子
- 蟹老板用自己的私钥对信件进行加密,并发送给海绵宝宝
- 海绵宝宝使用蟹老板的公钥进行解密,获得原文
- 保证了机密性、完整性和身份验证
HTTPS
- 把HTTP的明文换成密文,再验证身份,即HTTPS
- HTTPS = HTTP + TLS
- TLS=身份验证+加解密身份验证靠PKI
- 服务端身份验证靠PKI,客户端身份验证靠HTTP协议。
小结
- 网络安全三要素:机密性、完整性和身份验证
- 在没有提前交换秘密信息的前提下,无法在不安全的信道交换秘密信息
- PKI保证了普通用户不需要“面对面”和根证书机构交换根证书
- HTTPS使用PKI完成了除客户端身份验证以外的特性,客户端身份验证靠
- HTTP协议实现