计算机网络概论 | 青训营笔记
学习の目的
要建立对计算机网络的整体认知,对计算机网络中的各种概念有初步的理解进而可以在后续的实际工作中能高效解决网络问题
分析方法:
- 自底向上:用于构建对计算机网络的认知,从基础开始不断增加复杂度。将模块逐步拼凑成一个系统。
- 自顶向下:用于解释线程网络应用、协议的特性、工作原理等。从复杂开始,逐渐变简单;从复杂的系统问题入手,拆分为模块问题。
计算机网络基础
网络组成部分:由主机、路由器、交换机等组成
网络结构:网络的网络 以蟹堡王来类比的话:
- 比奇堡和小区网络:本地网络
- 北京和上海分店+比奇堡:三个本地网络节点的网络
- 全国通信网络:本地网络的网络
- 小区的本地网络与其链接的蟹堡王分店组成区域网络
- 分店和每个城市中作为主要转换点的分店组成城域网
- 城域网组成广域网
信息交换方式:电路交换和分组交换
网络分层: 5层,从低到高:物理层、链路层、网络层、运输层、应用层
协议: 协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接受一条报文或其他事件所采取的动作
网络协议的基本结构:标头和载荷
Web中的网络
http协议
http报文容易理解,而TCP报文则非常晦涩难懂。它们在网络中传递都是二进制数据,不同之处在于http报文可以以明文展示出来,对于人很友好但是对于计算机就没辣么友好咯
对于队头堵塞问题,http1.0最常用的方案是同时建立多个TCP连接,将请求分散在多个TCP连接上,但是建立多个TCP连接的成本是巨大的!!!TCP连接增加时,每条TCP分配的带宽也会相应地减少,完成一个完整的http请求的时间也会拉长,因此大部分情况下浏览器会限制TCP连接数量(通常是6个)
//main.js
console.log("hello world");
/*style.css*/
body{
color: red;
}
由于http1.0无法多路复用,所以服务器将上面两串代码交替发送得到下面结果:
body{
console.log("hello world");
color: red;
}
http2中把多个http请求拆分到帧里面,每个帧可以携带来自不同http请求的数据(这里的帧和链路层的帧不同)
request = style.css, content = 'body {'
request = main.js, content = 'console.log('hello world')'
request = style.css, content = ' color: red;'
request = style.css, content = '}'
帧带来的额外好处:
- 调整响应传输的优先级
- 头部压缩
- Server Push
但是,http2仍然存在会发生队头堵塞(但是在TCP上)的问题
http3则有QUIC(Quick UDP Internet Connection)协议:
- 现存网络设备对TCP和UDP支持已经僵化
- UDP不靠谱但是QUIC靠谱
- QUIC可以为除HTTP协议以外的应用层协议提供支持
CDN:DNS劫持
- 域名解析一般由网站自己处理
- 要加速的域名则重定向到CDN厂商的域名解析服务处理
- CDN厂商根据来源确定最近的CDN服务器的IP
- 用户直接访问最近的CDN服务器
WebSocket:
- 有状态的持久连接
- 服务端可以主动推送消息
- 用WebSocket发送消息延迟比HTTP低
网络安全
网络安全三要素:
- 机密性:攻击者无法获知通信内容
- 完整性:攻击者对内容进行篡改时能被发现
- 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信
加密
- 对称加密:加密、解密用同样的密钥
- 非对称加密: 加密、解密使用不同的密钥(公钥和私钥),而且公钥加密只能用私钥解密,私钥加密只能用公钥解密
密码散列函数(哈希函数)
输入:任意长度的内容 输出:固定长度的哈希值 性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的
- 加密需要加密算法和密钥等信息(统称为秘密信息)
- 网络是明文的,不安全的
如何实现身份验证
- 数字签名:对明文内容的哈希值使用私钥加密,验证者使用公钥验证
- 数字签名(指纹) = 私钥加密(密码散列函数(原文))
- 消息 = 原文 + 数字加密
- 一般用于对公开内容(如包含公钥的证书)进行数字签名,防止篡改
HTTPS
- 把HTTP的明文换成密文,再验证身份,即HTTPS
- HTTPS = HTTP + TLS
- TLS = 身份验证 + 解密
- 身份验证靠PKI
服务端身份验证靠PKI,客户端身份验证靠HTTP协议