本篇笔记使用了ChatGPT对部分内容进行了完善
一、网络基础
1、网络的组成部分
- 主机:客户端与服务端
- 路由器
- 网络协议
2、网络结构
- 区域网络
- 城域网
- 广域网
3、信息交换方式
- 电路交换
- 分组交换——计算机中使用的交换方式
4、网络分层
Internet参考模型从低到高分别为:物理层(Physical Layer)->数据链路层(Data Link Layer)->网络层(Network Layer)->传输层(Transport Layer)->应用层(Application Layer)
相较于OSI模型这是一种简化过的分层方式,每一层都相互独立不考虑别的层所传输的内容。
5、协议
协议的存在依赖于连接。
协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接受一条报文或其他事件所采取的动作。
(1)标头和载荷
标头(Header)也就相当于寄快递时的面单,是位于数据包或帧的开头,用于描述数据包或帧的基本信息,例如数据包或帧的长度、类型、源地址、目的地址等。标头的长度一般是固定的,并且在不同的协议中可能会有所不同。
载荷(Payload)就相当于寄快递时的物品,是位于标头之后的数据部分,它是实际需要传输的数据,例如文本、图像、音频、视频等。载荷的长度是可变的,并且取决于要传输的具体数据内容。
每一层都会将上一层的标头和载荷视为自己的载荷,并添加自己这一层的标头。
(2)HTTP协议
下面的为一个网络连接帧,下面逐步解析其中的含义
链路层——本地帧头部:1到4字节,左侧解析结果第二行的Null/Loopback表示了该帧为本机帧,源地址与目标地址均为本机,以右侧原始数据为18 00 00 00转换为10进制为24,代表链路层选择的是IPv6
链路层——IP协议头部:第5到44字节,这些字节中包含了IP协议版本、源IP地址、目标IP地址
运输层——TCP协议头部:TCP协议头部一共有20个字节,包含了源端口号、目标端口号、序列号、头部长度、载荷信息、载荷长度信息
应用层——HTTP协议头部:包含了请求路径、域名、UA等内容
报文=应用层头+IP协议头+TCP协议头+HTTP协议头+HTTP正文
(3)TCP协议格式
TCP协议中头部与载荷的分割靠的是Data offset,在TCP数据包中位置是固定的,永远在第12个字节(即偏移量为12字节),占据4个比特位(即4个二进制位),它用于指定TCP协议头部的长度,以32位字长度为单位。
因为Data Offset字段占据了TCP协议头部中的固定位置,所以它是TCP协议头部中的一个固定字段。TCP协议头部的长度通常为20个字节,但是TCP协议允许在Data Offset字段中指定一个可选的选项字段长度。如果TCP协议头部中包含了可选的选项字段,那么Data Offset字段的值将会大于20个字节,以反映TCP协议头部的实际长度。但是,无论是否包含可选的选项字段,Data Offset字段的位置是固定的,它始终位于TCP协议头部的第12个字节位置。
二、Web应用
1、HTTP
(1)HTTP连接模型
- 在短暂的连接中,每个HTTP请求都会建立一个新的TCP连接,用于传输请求和响应。请求和响应之后,连接立即关闭。这种方式可以确保每个请求的响应是独立的,不会受到之前或之后请求的干扰,同时也可以避免持久连接可能会出现的资源耗尽和占用问题。
- 持久连接(HTTP Persistent Connections):持久连接允许在同一TCP连接上传输多个HTTP请求和响应,而不是为每个请求和响应建立一个新的连接。这可以减少连接的开销,提高传输效率,但也会增加服务器的负载。
- 管线化连接(HTTP Pipelining):管线化连接允许在同一TCP连接上发送多个HTTP请求,而不需要等待前一个请求的响应。这可以进一步提高传输效率,但如果其中一个请求出现问题,那么整个管线化的请求都将被阻塞。
- 课程中没提到的长轮询(HTTP Long-Polling):长轮询是一种实时通信机制,它允许客户端向服务器发送一个HTTP请求,并一直保持该连接打开状态,直到服务器有新的数据可用时才返回响应。这可以实现服务器推送新数据给客户端,但也会增加服务器的负载和网络开销。
这三种连接模型都旨在提高HTTP传输效率和实现实时通信机制,但每种模型都有自己的优点和缺点,具体的应用场景需要根据具体情况来选择。例如,持久连接适用于大量的短期请求,管线化连接适用于大量的并发请求,长轮询适用于需要实时推送数据的场景。
(2)HTTP2:帧
关于HTTP/2相较于HTTP/1.1的不同:
多路复用:HTTP/2引入了多路复用技术,允许在同一个TCP连接中同时处理多个HTTP请求和响应。这避免了HTTP/1.1中的队头阻塞问题,提高了HTTP传输效率。
二进制分帧:HTTP/2采用二进制分帧技术,将HTTP消息分解为二进制数据帧进行传输。这提高了传输的效率,并且允许客户端和服务器同时发送和接收多个帧。
首部压缩:HTTP/2使用HPACK算法对HTTP请求和响应中的首部进行压缩,减少了数据传输的大小,提高了传输效率。
服务器推送:HTTP/2允许服务器在客户端请求之前将资源推送到客户端,减少了客户端的请求次数,提高了传输效率。
优先级:HTTP/2允许客户端设置请求的优先级,确保重要请求的优先处理,提高了传输效率。
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
- Length(长度):占用3个字节,用于表示帧体的长度,取值范围为0~2^24-1字节。
- Type(类型):占用1个字节,用于表示帧的类型,取值范围为0~255,定义了多种类型的帧,例如HEADERS帧、DATA帧、PRIORITY帧等。
- Flags(标志):占用1个字节,用于表示帧的一些标志位,不同的帧类型具有不同的标志位,例如DATA帧可以设置END_STREAM和PADDED标志。
- R(保留位):占用1个位,保留位,暂时未被使用。
- Stream Identifier(流标识符):占用4个字节,用于标识一个HTTP/2连接中的流(Stream),取值范围为0~2^31-1,每个流都有唯一的标识符。
当使用HTTP/2进行通信时,可以通过抓包工具来查看HTTP/2帧的具体内容,下面以Chrome浏览器发送HTTP/2请求为例,来说明每个帧中的字节所代表的意义:
假设我们要发送一个简单的HTTP/2请求:
GET /index.html HTTP/2.0
Host: example.com
首先,客户端会发送一个HEADERS帧,其中帧头部分如下所示:
00 00 09 // Length(3字节)
01 // Type(1字节)
04 // Flags(1字节)
00 00 00 01 // Stream Identifier(4字节)
这个帧表示一个HEADERS帧,长度为9个字节,标识符为1,标志位为0x04(二进制100,表示END_HEADERS标志位已设置),帧体部分则包含了请求头信息。具体帧体部分的内容如下所示:
:method: GET
:path: /index.html
:scheme: https
:authority: example.com
其中,每个键值对都以冒号开头表示HTTP/2内置的伪头字段(pseudo-header fields),这些字段用于表示请求的方法、路径、协议等信息。
接下来,客户端会发送一个DATA帧,其中帧头部分如下所示:
00 00 0d // Length(3字节)
00 // Type(1字节)
01 // Flags(1字节)
00 00 00 01 // Stream Identifier(4字节)
这个帧表示一个DATA帧,长度为13个字节,标识符为1,标志位为0x01(二进制001,表示END_STREAM标志位已设置),帧体部分则包含了请求体数据。具体帧体部分的内容如下所示:
<p>This is an example page.</p>
这个帧体部分表示了请求体数据,也就是HTML页面的内容。
(3)HTTP2:3RTT启动
HTTP/2的3次往返时间(3RTT)启动指的是在建立HTTP/2连接时,客户端需要与服务器进行三个来回的通信才能建立连接并开始传输数据。
具体来说,当客户端想要建立与服务器的HTTP/2连接时,它会向服务器发送一个连接请求。服务器会回复一个包含HTTP/2协议版本和支持的功能列表的设置帧(SETTINGS frame)。客户端接收到这个设置帧后,会回复一个确认帧(ACK frame),用于确认接收到服务器的设置帧。
这样一来,客户端和服务器之间就已经进行了2次往返的通信。接着,客户端会发送一个包含HTTP请求信息的帧(比如HEADERS frame),服务器回复一个包含响应数据的帧(比如DATA frame),这样就完成了3次往返的通信。
在完成这3个往返通信之后,客户端和服务器之间的HTTP/2连接就建立好了,之后客户端就可以通过该连接发送HTTP请求并接收响应,而无需再进行3RTT启动过程。3RTT启动过程主要是在建立连接的过程中进行的,目的是确保客户端和服务器之间的通信能够正确建立和维护。
(4)HTTP3
HTTP/3相较于HTTP/2有以下几方面的改进:
- 使用QUIC协议:HTTP/3使用QUIC协议来传输数据,相较于HTTP/2使用TCP协议,QUIC协议在传输数据时具有更快的连接建立和恢复速度,同时可以有效地减少网络抖动对数据传输的影响。
- 减少延迟:HTTP/3使用了一些新的技术来减少延迟,比如0-RTT连接恢复、无需等待的头部压缩和服务器推送等。
- 更高效的流控制:HTTP/3使用了更为灵活和高效的流控制机制,能够更加准确地控制数据流量的发送和接收速度,从而提高了数据传输的效率。
- 更加安全:HTTP/3默认使用TLS 1.3加密协议,提供了更加安全的数据传输保障。
(5)HTTP3:QUIC
QUIC协议具有以下几个特点:
- 基于UDP协议:QUIC协议是基于UDP协议开发的,相较于TCP协议,UDP协议不需要建立连接和维护状态等操作,因此能够更快地建立和恢复连接,减少网络抖动对数据传输的影响。
- 多路复用:QUIC协议支持多路复用(Multiplexing),能够同时处理多个数据流,避免了TCP协议中的队头阻塞问题。
- 0-RTT连接恢复:QUIC协议支持0-RTT连接恢复,即在客户端和服务器之间已经建立过连接的情况下,可以直接恢复连接,无需经过握手过程,从而减少连接建立的时间。
- 数据包级别的流控制:QUIC协议采用了基于数据包的流控制(Packet-level Flow Control)机制,可以更加灵活地控制数据的发送和接收速度,提高传输效率。
- 安全性:QUIC协议默认使用TLS 1.3协议进行加密,提供更高的安全性保障。
关于1RTT
QUIC协议支持在首次连接时实现1-RTT(Round Trip Time)连接建立,即客户端和服务器在第一次通信时就能够建立连接,而不需要像TCP协议那样需要3次握手才能建立连接。
在QUIC协议中,客户端和服务器在首次通信时采用了一种称为“0-RTT Early Data”的机制,该机制允许客户端在建立连接的同时发送数据。具体来说,客户端在第一次连接时将发送两个数据包:
- 客户端发送一个带有QUIC版本和加密密钥的INITIAL包,该包中也可能包含一些应用数据,这个过程需要1个RTT。
- 客户端接着发送一个带有加密应用数据的0-RTT包。如果服务器在第一次收到客户端的INITIAL包时已经准备好接受数据,那么它将能够立即解密和处理这个0-RTT包,并向客户端发送一个确认包。这个过程也需要1个RTT。
因此,通过这种机制,客户端和服务器可以在第一次通信时就建立连接并发送数据,实现1-RTT连接建立。
2、CDN
CDN(Content Delivery Network,内容分发网络)是一种构建在互联网上的分布式服务器网络,旨在提供高效、可靠的内容分发服务。CDN通过将内容存储在位于全球不同地理位置的服务器上,并利用网络负载均衡技术将用户的请求路由到距离其最近的服务器上,从而加速内容的传输和分发,提高用户的访问速度和体验。
CDN通常由多个层次的缓存服务器和数据中心组成,每个节点都存储一部分或全部内容,用户请求的内容会被分配到距离其最近的节点上进行处理。当用户请求内容时,CDN系统会根据用户的位置和网络状况,自动选择最近和最优质的节点,从而减少延迟和网络拥塞,提高传输速度和响应速度。
(1)DNS劫持
CDN服务在实现内容分发的过程中,通常需要利用DNS劫持技术来将用户的请求路由到最近和最优质的CDN节点上,从而提高用户的访问速度和体验。
DNS劫持是一种利用DNS(Domain Name System)协议漏洞的攻击技术,攻击者通过篡改DNS响应,将用户的请求重定向到攻击者指定的服务器上,从而窃取用户的敏感信息或进行恶意操作。
在CDN服务中,DNS劫持技术通常是由CDN服务提供商实现的,其过程如下:
- 用户向DNS服务器发送请求,查询指定域名的IP地址。
- DNS服务器查询自身的DNS缓存,如果缓存中存在目标域名的IP地址,则直接返回给用户;否则,DNS服务器向根域名服务器发送请求,获取目标域名对应的权威DNS服务器的IP地址。
- DNS服务器向权威DNS服务器发送请求,获取目标域名的IP地址。
- CDN服务提供商的DNS服务器在接收到用户的DNS请求后,会根据用户的地理位置和网络状况,自动选择最近和最优质的CDN节点,并将该节点的IP地址作为响应返回给用户。
通过DNS劫持技术,CDN服务提供商可以将用户的请求路由到距离其最近的CDN节点上,从而提高用户的访问速度和体验。但是需要注意的是,DNS劫持技术也存在安全风险,攻击者可以利用DNS劫持技术窃取用户的敏感信息或进行恶意操作,因此在使用DNS劫持技术时需要特别注意安全问题。
(2)Anycast任播
Anycast是一种用于网络路由和负载均衡的技术,它将一个IP地址分配给多个服务器,但在任何时候只有一个服务器能够接收和处理请求。在Anycast技术中,多个服务器共享同一个IP地址,但它们的网络路径不同,当用户发送请求时,路由器会将请求路由到距离最近或最优的服务器上,从而实现负载均衡和高可用性。
在Anycast技术中,多个服务器之间通常采用相同的配置和数据,当其中一个服务器出现故障或负载过高时,其他服务器会接替其工作,从而实现自动故障转移和容错。Anycast技术广泛应用于互联网基础设施、域名系统、CDN、DDoS防护等领域,能够提高服务的可用性和性能。
举个例子,假设一个互联网服务提供商(ISP)在全球范围内有多个服务器节点,每个节点都使用相同的IP地址。当用户向该IP地址发送请求时,路由器会将请求路由到距离最近或最优的节点上,并由该节点处理请求。如果其中一个节点发生故障,其他节点会接替其工作,从而保证服务的可用性和性能。这种使用相同IP地址的方式被称为Anycast技术。
(3)CDN策略
3、WebSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许浏览器和服务器之间进行双向通信,而不需要通过轮询或长轮询等技术进行数据交换。
WebSocket协议通过在HTTP握手期间进行协商来建立连接,一旦连接建立成功,浏览器和服务器之间就可以通过该连接进行实时通信。WebSocket协议提供了一种类似于套接字(socket)的编程接口,使得开发者可以使用类似于发送和接收消息的方式进行数据交换。
WebSocket协议有以下几个特点:
- 实时性:WebSocket协议可以实现实时通信,使得浏览器和服务器之间能够快速地进行双向通信,从而提高用户的使用体验。
- 全双工通信:WebSocket协议可以实现全双工通信,即浏览器和服务器之间可以同时发送和接收数据,避免了传统HTTP协议中的单向通信限制。
- 更少的网络流量:WebSocket协议使用了HTTP握手期间建立的TCP连接,减少了网络流量的消耗和服务器的负载。
- 支持跨域:WebSocket协议可以跨域使用,使得浏览器可以与不同域名的服务器进行通信,扩大了应用范围。
WebSocket协议是一种应用层协议,它是在HTTP协议的基础上设计和实现的。WebSocket协议的握手阶段和HTTP协议非常相似,它在HTTP协议的Upgrade头字段中添加了一个"websocket"字段,表示要升级到WebSocket协议。因此,WebSocket协议使用HTTP协议的握手机制来建立连接,但在连接建立之后,数据的传输并不依赖于HTTP协议,而是直接在建立的TCP连接上进行传输。因此,WebSocket协议的实现既涉及到HTTP协议的解析和处理,也涉及到TCP协议的实现和操作 。
当浏览器向服务器发起WebSocket协议连接时,会包含一组WebSocket协议的请求头。下面是一个WebSocket协议连接请求头的例子:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com
该请求头包含了以下信息:
- 请求方法:GET
- 请求的URL地址:/chat
- HTTP协议版本:HTTP/1.1
- Host:请求的目标主机名
- Upgrade:指定将协议从HTTP升级为WebSocket
- Connection:指定协议升级后保持连接不断开
- Sec-WebSocket-Key:表示该WebSocket连接的唯一标识符,由客户端随机生成
- Sec-WebSocket-Version:指定WebSocket协议的版本号,当前使用的是版本13
- Origin:指定发起WebSocket连接的源URL
需要注意的是,WebSocket协议的请求头与HTTP协议的请求头有所不同,但是它们都包含了一些基本的信息,例如请求的方法、URL地址、协议版本、目标主机名等。而WebSocket协议的请求头中,关键的字段是Upgrade、Connection、Sec-WebSocket-Key和Sec-WebSocket-Version,它们表示了WebSocket协议的特点和协议版本。
三、网络安全
数据安全三要素是:机密性、完整性和身份验证。
机密性是指使信息不泄露给未授权的个人、实体、进程,或不被其利用的特性。
完整性是指数据没有遭受以未授权方式所作的更改或破坏的特性。
身份验证是指确认数据来源或目的地的真实性和合法性的特性
1、加密
(1)对称加密
对称加密是一种加密方式,指的是使用相同的密钥对数据进行加密和解密。在对称加密中,加密密钥和解密密钥是相同的,所以只有持有密钥的人才能够对加密的数据进行解密。对称加密算法的加密速度快,适合对大量数据进行加密和解密,因此被广泛应用在网络通信、数据传输和存储等领域。
常见的对称加密算法包括DES、3DES、AES等。这些算法在加密时使用密钥对数据进行处理,生成密文;在解密时使用相同的密钥对密文进行处理,还原成原始数据。由于对称加密使用相同的密钥进行加密和解密,因此密钥的安全性非常重要,如果密钥泄露,加密的数据就会变得容易受到攻击和窃取。
(2)非对称加密
非对称加密是一种加密方式,与对称加密相比,使用两个不同但相关的密钥,分别为公钥和私钥,也称为公开密钥加密(Public Key Encryption)。公钥可以向任何人公开,私钥只有密钥持有者才能知道,因此非对称加密的密钥安全性更高。
在非对称加密中,公钥用于加密数据,私钥用于解密数据。数据发送方使用接收方的公钥对数据进行加密,接收方收到加密的数据后使用自己的私钥对数据进行解密。由于私钥是只有密钥持有者才能知道的,所以只有密钥持有者才能解密数据,保证了数据的安全性。
非对称加密算法广泛应用于数字签名、数字证书、安全通信等领域,例如RSA、Diffie-Hellman、ECC等算法都是常用的非对称加密算法。非对称加密的一个缺点是加密和解密速度较慢,适合对少量数据进行加密和解密。
(3)密码散列函数
密码散列函数(Cryptographic Hash Function)是一种将任意长度的消息(明文)转换成固定长度的散列值(密文)的函数,具有不可逆性、抗碰撞性、雪崩效应等特性。密码散列函数常用于密码学、信息安全和数据完整性验证等领域。
密码散列函数通常被用于计算消息摘要(Message Digest),也称为哈希值(Hash Value)。哈希值是一段固定长度的二进制数字串,通常表示为一串十六进制数字,用于验证数据的完整性,判断数据是否被篡改过。
密码散列函数的特点包括:
- 不可逆性:散列值不能被逆向计算出原始消息,即从哈希值无法恢复出原始消息。
- 抗碰撞性:不同的消息产生不同的哈希值的概率极高,且在当前技术条件下难以找到两个不同的消息具有相同的哈希值。
- 雪崩效应:消息的微小变化会导致哈希值的大幅度变化,即输入消息发生微小变化,输出哈希值也会发生很大的变化。
常见的密码散列函数包括MD5、SHA-1、SHA-2等。其中,MD5已经被证明存在漏洞,不适合用于安全领域。SHA-2是目前被广泛应用的密码散列函数。
2、如何实现加密
3、HTTPS
把HTTP的铭文换成密文,再验证身份,即HTTPS。
HTTPS=HTTP+TLS
TLS=身份验证+加解密
身份验证靠PKI
服务端身份验证靠PKI,客户端身份验证靠HTTP协议。
小结
网络安全三要素:机密性、完整性和身份验证 在没有提前交换秘密信息的前提下,无法在不安全的信道交换秘密信息 PKI保证了普通用戶不需要“面对面”和根证书机构交换根证书 HTTPS使用PKI完成了除客戶端身份验证以外的特性,客戶端身份验证靠HTTP协议实现