计算机网络重要知识整理汇总

10 minute

重要文章

网络模型

HTTP 协议

HTTP1.0

HTTP1.0 最早在网页中使用是在 1996 年,那个时候只是使用一些较为简单的网页上和网络请求上,是一种无状态、无连接的应用层协议,几年后被 HTTP1.1 代替并广泛使用。

HTTP1.1

  1. 基于文本解析,把所有请求和响应作为纯文本。
  2. 加入了缓存处理(强缓存和协商缓存):从客户端读取缓存,强缓存不发送请求,直接读取资源,可以获得返回 200 的状态码;协商缓存通过服务器来确定缓存资源是否可用(304);如果时间过期,则向服务器发送 header 带有 If-None-Match 和 If-Modified-Since 的请求。
  3. 拥有长连接,并支持请求管道化。
  4. 流控制基于 TCP 连接。当连接建立时,两端通过系统默认机制建立缓冲区,并通过 ACK 报文来通知对方接收窗口大小,因为 HTTP1.1 依靠传输层来避免流溢出,每个 TCP 连接需要一个独立的流控制机制。

HTTP2

  1. 通过一个连接来多路复用
  2. 头部压缩
  3. 使用二进制框架层把所有消息封装成二进制
  4. 允许客户端和服务器端实现他们自己的流控制机制,而不是依赖传输层,两端在传输层交换可用的缓冲区大小,来让他们在多路复用流上设置自己的接收窗口
  5. 让服务器可以将响应主动“推送”到客户端缓存中

HTTP3

HTTP3 是建立一个在 QUIC 协议上运行的 HTTP 新规范,而之前的版本都是基于 TCP,QUIC 是为了替代 TCP,解决 TCP 的一些缺陷:

  1. 同样拥有头部压缩,并优化了对乱序发送的支持,也优化了压缩率
  2. 通过 UDP 建立连接,提高了连接建立的速度,降低了延迟
  3. 解决队头拥塞问题
  4. Connection ID 使得 HTTP3 支持连接迁移以及 NAT 的重绑定

HTTPS 协议

HTTPS=HTTP+SSL/TLS

使用 HTTPS 进行通信时,先是建立传输层 TCP 的连接,完成三次握手,然后再是 SSL/TLS 协议的四次握手,双方协商出对称加密的密钥,之后的通信数据会利用该密钥进行加密传输。具体流程:

HTTPS(超文本传输安全协议)是HTTP的安全版本,主要用于在计算机网络中进行安全的数据传输。HTTPS通过SSL/TLS协议对数据进行加密,确保数据的机密性和完整性。下面是HTTPS的基本流程:

  1. 客户端发起请求:用户在浏览器中输入 HTTPS 网址,浏览器向服务器发送请求。
  2. 服务器响应:服务器接收到请求后,返回其 SSL/TLS 证书给客户端。这个证书包含了服务器的公钥和其他信息。
  3. 证书验证:客户端浏览器验证服务器的 SSL/TLS 证书是否可信。这通常通过检查证书是否由受信任的证书颁发机构(CA)签发,以及证书是否在有效期内。
  4. 生成会话密钥:如果证书有效,客户端生成一个随机的会话密钥,并使用服务器的公钥对其进行加密,然后发送给服务器。
  5. 服务器解密会话密钥:服务器使用其私钥解密收到的会话密钥,从而获得该密钥。
  6. 安全连接建立:客户端和服务器使用会话密钥进行加密通信。此后,所有传输的数据都通过这个密钥进行加密,确保数据的安全性。
  7. 数据传输:客户端和服务器之间的数据传输通过加密的连接进行,确保数据在传输过程中不被窃取或篡改。
  8. 连接关闭:数据传输完成后,客户端或服务器可以关闭连接,结束会话。

通过以上流程,HTTPS 能够有效地保护用户的数据安全,防止中间人攻击和数据泄露:

  • 防窃听:加密(对称加密和非对称加密<公钥加密,私钥解密>)
  • 防篡改:加签(私钥加签,公钥验签)
  • 防伪装:证书(引入中间角色 CA,根据公钥生成证书,帮助验证证书的合法性)

HTTP 代理

如访问 HTTP 站点,则遵循流程如下:

 1Agent                         Proxy                          Site
 2  |                             |                              |
 3  | <1> tcp dial to proxy:8080  |                              |
 4  |<--------------------------->|                              |
 5  |    <2> GET / HTTP/1.1       |                              |
 6  |        Host: baidu.com      | <3> tcp dial to baidu.com:80 |
 7  |---------------------------->|<---------------------------->|
 8  |                             |   <4> GET / HTTP/1.1         |
 9  |                             |       Host: baidu.com        |
10  |                             |----------------------------->|
11  |                             |   <5> HTTP/1.1 200 OK        |
12  |   <4> HTTP/1.1 200 OK       |<-----------------------------|
13  |<----------------------------|                              |
14  |                             |                              |
  1. 客户端同代理服务器建立 TCP 连接
  2. 客户端将 HTTP 请求发送给代理服务器
  3. 代理服务器解析 HTTP 请求,获取目标服务器地址并建立 TCP 连接
  4. 代理服务器将客户端 HTTP 请求发送给目标服务器
  5. 目标服器将响应内容发送给代理服务器
  6. 代理服务器将目标服务器的响应内容发送给客户端

如访问 HTTPS 站点,则需遵循另外一套流程:

 1Agent                         Proxy                          Site
 2  |                             |                              |
 3  | <1> tcp dial to proxy:8080  |                              |
 4  |<--------------------------->|                              |
 5  |  <2> CONNECT baidu.com:443  |                              |
 6  |---------------------------->| <3> tcp dial to baidu.com:443|
 7  |   <4> HTTP/1.1 200 OK       |<---------------------------->|
 8  |<----------------------------|                              |
 9  |                             |                              |
10  |          https data         |         https data           |
11  |<--------------------------->|<---------------------------->|
12  |                             |                              |
  1. 客户端同代理服务器建立 TCP 连接
  2. 客户端向发送给代理服务器发送 CONNECT 请求
  3. 代理服务器解析 HTTP 请求,获取目标服务器地址并建立 TCP 连接
  4. 代理服务器向客户端发送 Connection Established 响应(图中标为 OK)
  5. 接下来代理服务器会不断将客户端发来数据转发给目标服务器,并把目标服务器的发来的数据转发给客户端

为什么 HTTP 请求和 HTTPS 请求的代理通信流程不一样?

因为对于明文的 HTTP 请求,代理服务器可以通过解析请求内容获取目标服务器的域名和端口,进而发起 TCP 连接。可对于 HTTPS 请求,客户端在发送 HTTP 请求之前要发送 TLS 握手数据。Proxy 收到 TLS 握手数据后是无法获取目标服务器。所以,协议要求客户端要先发送一个 CONNECT 请求来告诉代理服务器目标服务器的域名和端口

注意,对于 HTTP 请求,Agent 和 Proxy 之间的通信中全明文的;对于 HTTPS 请求, Agent 的 CONNECT 请求也是通过明文发送给 Proxy 的。

MTU

MTU(Maximum Transmission Unit)是网络通信中的一个重要参数,表示网络设备(如网卡、路由器)在一次传输中可以处理的最大数据包大小,以字节为单位。设置合适的 MTU 是优化网络性能的关键。

ARP

ARP(Address Resolution Protocol) 是一种网络协议,用于在局域网(LAN)中根据 IP 地址获取对应的物理地址(MAC 地址)。ARP 是网络通信中不可或缺的部分,尤其是在 IPv4 网络中,它确保设备能够正确地将数据包发送到目标设备。

TCP

三次握手

  1. seq=x (syn, >)
  2. ack=x+1,seq=y (syn-ack, <)
  3. ack=y+1 (ack, >)

四次挥手

  1. seq=x (fin, >)
  2. ack=x+1 (ack, <)
  3. seq=y (fin, <)
  4. ack=y+1 (ack, >)

数据传输

  1. seq=x (send data1, >)
  2. ack=x+len(data1) (ack, <)
  3. seq=x+len(data1) (send data2, >)
  4. ack=x+len(data1)+len(data2) (ack, <)

如果未收到 ack,则超时重传。

Reference