计算机网络概论 | 青训营笔记
计算机网络基础
网络组成部分
主机:客户端和服务端 :负责提供信息和接受信息
路由器:负责转发主机之间的信息
网络协议:负责提供统一格式,方便主机和路由器编码和解码
网络结构:网络的网络
区域网络,城域网,广域网
信息交换方式
电路交换
分组交换(计算机网络使用)
网络分层
计算机网络分为五层 从高到低分别是 物理层,内容层,网络层,运输层,应用层
协议
协议定义了两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接受一条报文或其他时间所采取的动作。
有两种 HTTP 报文的类型,请求与响应,每种都有其特定的格式。
标头和载荷
HTTP协议示例
第二行:链路层-本地帧头部
第三层:链路层-IP协议头部
第四层:运输层-tcp协议头部
第五行:应用层-HTTP协议头部
报文 = 链路层头 +IP协议头部 +tcp协议头部+HTTP协议头部 +HTTP正文
TCP协议格式
Web中的网络
HTTP协议
HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP 链接更低效。
红色的是请求
第一行称为起始行,包含 GET / HTTP1.1 三个要素
分别代表 请求的方法 资源路径 http版本
后面到第一空行为止为头部,后面为正文
每一行代表一个头部,使用冒号分隔
蓝色的是响应
第一行是状态行
第一行仨个要素分别代表 http版本 状态码 状态信息
后面是头部
对头堵塞:当前面请求很大,后面的请求要等待
对于这种情况,一般使用多条ttp连接
在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 链接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。
为了减轻这些缺陷,HTTP/1.1 引入了流水线(被证明难以实现)和持久连接的概念:底层的 TCP 连接可以通过 Connection 标头来被部分控制。
HTTP2:帧
前三个字节:载荷长度
第四个字节:类型
第五个字节:类型对应的flags
第六到第九字节:第一位:保留位 第2-32:流ID
随后的字节:载荷
HTTP2:帧带来的额外好处
解决了头部运输和对头堵塞
调整响应传输的优先级
头部压缩
serve push
但是不能解决tcp对头堵塞的问题
http3
使用quic协议,解决tcp对头堵塞
HTTP流
- 打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的 TCP 连接连向服务端。
- 发送一个 HTTP 报文:HTTP 报文(在 HTTP/2 之前)是语义可读的。在 HTTP/2 中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。
- 读取服务端返回的报文信息:
- 关闭连接或者为后续请求重用连接。
当 HTTP 流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而 HTTP 流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。因此,HTTP 流水线已被在有多请求下表现得更稳健的 HTTP/2 的帧所取代。
在HTTP之外仍然有很多影响web性能的因素
无法突破物理极限
价格
服务器是否强大
如何让北京用户使用北京服务器
DNS劫持
域名解析一般由网站自己处理
要加速的域名则重定向到cdn厂商的域名解析服务处理
CDN厂商根据来源确定最近的cdn服务器的ip
用户直接访问最近cdn服务器
WebSocket
与HTTP协议不同,是由HTTP协议升级而来的
有状态的持久连接
服务端可以主动推送消息
用websocket发送信息延迟比HTTP低
WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议。
WebSocket 是双向通讯,有状态,客户端一(多)个与服务端一(多)双向实时响应(客户端 ⇄ 服务端)。
WebSocket 是应用在浏览器的 Socket (是 Socket 模型接口的实现),Socket 是一个网络通信接口 (通信规范)。
网络安全
网络安全三要素
机密性:攻击者无法获知通信内容
完整性:攻击者对内容进行篡改时能被发现
身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信
对称机密和非对称加密
对称加密:加密,解密用同样的密钥
非对称加密:加密,解密使用不同的密钥(公钥和私钥),公钥加密只能用私钥解密,私钥加密只能用公钥解密
密码散列函数(哈希函数)
输入:任意长度的内容
输出:固定长度的哈希值
性质:找个两个不同的输入使之经过密码散列函数后相同的哈希值,在计算上是不可能的
如何实现机密性
想要通过明文通信交换秘密信息,双方必须要有秘密信息
如何实现完整性
想要实现完整性,双方必须要先有秘密信息
如何实现身份验证
根证书是证书链的尽头
验证的一连串证书称为证书链
想要实现身份验证,双方必须要先有秘密信息,即根证书中的公钥
HTTPs
把HTTP的明文换成密文,再验证身份,即HTTPs
HTTPs = HTTP +TLS
TLS = 身份验证 + 加解密
身份验证靠PKI
服务端身份验证靠PKI,客户端身份验证靠HTTP协议