计算机网络重要知识整理

14 minute

TOC

重要文章

网络模型

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,则超时重传。

Wireshark 抓包分析

设备信息:

  • 主机:安装了 ftp 的 windows11(ip:172.23.224.1)
  • 虚拟机:安装了 vsftpd 的 wsl2(ubuntu18)(ip:172.23.234.65)

Wireshark 抓包配置:

  1. 选择 vEthernet(WSL) 连接进行捕获;
  2. 使用过滤表达式 ip.addr==172.23.234.65&&tcp 进行捕获。

首先通过 ftp 上传文件:

 1ftp 172.23.234.65
 2
 3# 连接到 172.23.234.65。
 4# 220 (vsFTPd 3.0.3)
 5# 200 Always in UTF8 mode.
 6# 用户(172.23.234.65:(none)): akyna
 7# 331 Please specify the password.
 8# 密码:
 9# 230 Login successful.
10
11ftp> put a.txt
12# 200 PORT command successful. Consider using PASV.
13# 150 Ok to send data.
14# 226 Transfer complete.
15# ftp: 发送 42 字节,用时 0.00秒 42000.00千字节/秒。

接着在 Wireshark 分析捕获的数据:

tcp_ftp

上图已经包括了三次握手建立连接,登录验证,文件传输,四次挥手结束连接这几个主要的过程。

下面通过生成流量图进行具体分析:

(1)三次握手建立连接

tcp

  • 第一次握手:client 通过 6518 端口向 server 发送连接请求,发送 SYN 和 SEQ,server 在端口 21 进行监听并接收到请求。

  • 第二次握手:server 监听到请求后发送 SYN,ACK 和 SEQ,client 接收到回复。

  • 第三次握手:client 接收到恢复后发送 SEQ(等于刚接收到的 ACK 的值)和ACK,server 接收到并确认 SEQ 正确,完成连接。

(2)文件传输过程

tcp_file

  1. 首先,还是三次握手在 client 端口 6540 和 server 端口 20 之间建立连接,这两个端口用于传输数据;
  2. 接着,server 端口 21 回复 “Response 150 Ok to send data” 给 client 端口 6518,含 PSH 标识,表明可以开始传输数据;
  3. 然后,client 开始发送数据包,长为 42,且含 PSH,表示可以接收数据,server 接收到后回传的 ACK 应该加上数据包长,即 43=1+42;
  4. 接着,client 发送了 FIN 标识,表明发送完毕,server 发送了 FIN 标识,表明将停止接收,client 发送 ACK 确定 server 可以停止接收;
  5. 最后,client 端口 6518 回复 “Response 226 Transfer complete” 给 server 端口 21,表明传输完毕。

(3)四次挥手结束连接

tcp

  1. 第一次挥手:server 发送了 FIN 标识,向 client 确认是否可以关闭连接;
  2. 第二次挥手:client 接收到 FIN,发送 ACK,确定 server 可以关闭连接,这时 server 确定 ACK 正确后将进入半关闭态,还可以接收 client 发送的数据;
  3. 第三次挥手:这次由 client 发送 FIN 标识,让server真的关闭连接;
  4. 第四次挥手:server 关闭连接,发送 ACK 向 client 确认已关闭,至此,ftp 通信完毕。

Reference