Skip to content

OSI 七层模型

OSI 网络模型^0 ^1自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。其中第四层完成数据传送服务,上面三层面向用户。较上层的协议依赖较下层。

OSI

物理层

数据链路层

  • 作用:控制如何将数据组合成数据块(帧)、如何在物理信道上传输帧
  • 主要协议:以太网协议、DHCP 协议

TIP

网络协议:网络协议是计算机网络中用于通信的规则和约定。网络协议定义了数据的格式、传输方式、错误检测和纠正等内容,确保不同设备之间能够正确地交换数据。协议常记作 :// 的形式,如 https://http://ftp://ssh://tcp:// 等。

  • 设备:网桥和交换机

网络层

网络层负责路径选择、路由及逻辑寻址,主要协议有 IP、ICMP、ARP 等。

IP

IP 协议(Internet Protocol)是用于在网络之间传输数据包的主要协议。IP 协议负责将数据包从源地址传送到目标地址,并确保数据包能够在复杂的网络环境中正确路由。IP 协议定义了数据包的格式和寻址方式,常见的版本有 IPv4 和 IPv6。

  • IPv4:使用 32 位地址,提供大约 43 亿个唯一地址。
  • IPv6:使用 128 位地址,提供几乎无限的地址空间,解决了 IPv4 地址耗尽的问题。

ICMP

ICMP 协议(Internet Control Message Protocol)是用于在网络设备之间发送错误消息和操作信息的协议。它主要用于报告网络连接中的错误情况和提供网络诊断功能。ICMP 协议在 IP 协议的基础上工作。

TIP

Ping:Ping 是一种基于 ICMP 协议的网络诊断工具,用于测试主机之间的连通性。它通过发送 ICMP 回显请求消息并等待回显应答消息来测量往返时间和数据包丢失率。Ping 命令可以帮助用户确定网络是否通畅以及网络延迟情况。在 Windows 上使用 ping <target_host> 测试某主机的延迟,其中 <target_host> 可以是 IP 也可以是域名。(在 Linux 上需要通过 -c 4 参数指定发送 ping 的次数)(在 Windows 上按Win+R,输入 powershell 打开 powershell;在 Linux 上按Ctrl+Alt+T打开终端)

bash
# 在 Linux 上 ping apache.org:
$ ping apache.org -c 4
PING apache.org (151.101.2.132) 56(84) bytes of data.
64 bytes from 151.101.2.132: icmp_seq=1 ttl=51 time=243 ms
64 bytes from 151.101.2.132: icmp_seq=2 ttl=51 time=469 ms
64 bytes from 151.101.2.132: icmp_seq=3 ttl=51 time=246 ms
64 bytes from 151.101.2.132: icmp_seq=4 ttl=51 time=294 ms

--- apache.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 242.945/312.979/468.728/92.150 ms

ARP

ARP 协议(Address Resolution Protocol),即地址解析协议,用于将网络层地址(IP 地址)解析为数据链路层地址(物理地址/MAC 地址)。当主机需要知道另一台主机的物理地址时,它会发送一个 ARP 请求,目标主机会回复其物理地址。

TIP

物理地址:物理地址(MAC 地址)是网络接口卡(NIC)在数据链路层使用的唯一标识符。它通常由制造商在硬件中烧录,格式为 48 位(6 字节)的十六进制数,例如 00:1A:2B:3C:4D:5E

传输层

传输层负责端到端的可靠数据传输。

TCP

TCP 协议(Transmission Control Protocol)是传输层的主要协议之一,提供基于连接的通信服务。TCP 协议通过三次握手建立连接,并使用序列号和确认机制确保数据包按顺序到达且无丢失。TCP 协议还提供流量控制和拥塞控制,保证网络的稳定性和高效性。

  • 三次握手:建立连接时,客户端和服务器通过三次握手确认彼此的接收和发送能力。
  • 序列号和确认:每个数据包都有一个序列号,接收方需要发送确认信息,确保数据包按顺序接收。
  • 流量控制:略
  • 拥塞控制:通过调整发送速率避免网络拥塞,提高传输效率。
  • 四次挥手:断开连接时,客户端和服务器通过四次挥手确认彼此的关闭意图。

使用 tcp 传输文件^2

transfer_file_over_tcp

常见的基于 TCP 协议的更高级的协议包括:

  • HTTP/HTTPS:浏览网页、使用手机 App 时几乎所有网络浏览都使用 HTTPS 协议。(HTTPS 协议是加密的 HTTP 协议)
  • SSH:Secure shell 协议。应用场景:远程控制服务器执行命令。
  • FTP:文件传输协议,用于在网络上传输文件。
  • SMTP:邮件传输协议,用于发送电子邮件。

TCP meme

UDP

UDP 协议(User Datagram Protocol)是传输层的另一主要协议,提供无连接的通信服务。与 TCP 不同,UDP 不保证数据包的顺序和可靠传输,没有可靠的连接,因此具有较低的延迟和较高的性能。UDP 通讯时不需要接收方确认,不可靠,可能丢包,实际开发中需要自行验证。

  • 特点

    • 无连接:UDP 不需要建立连接,数据包可以独立发送。
    • 不可靠传输:UDP 不保证数据包的顺序和完整性,可能会丢失或重复。
    • 低延迟:由于没有连接建立和确认机制,UDP 传输延迟较低。
    • 简单:UDP 协议头部较短,开销小。
  • 应用场景

    • 实时应用:如视频会议、在线游戏等,对延迟敏感但可以容忍少量数据丢失的场景。
    • 流媒体传输:如 IPTV、网络广播等,需要连续传输大量数据的场景。(注:不包括使用浏览器或 app 在线观看视频)
    • QUIC(HTTP/3):QUIC 是基于 UDP 的新一代 HTTPS 协议。
    • DNS:将网站域名转换成 IP 地址的协议。

UDP meme (.gif)

会话层

会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。

SOCKS5

会话层常见的协议有 SOCKS5 协议,一种网络代理协议。它将需要代理的数据包封装成 SOCKS5 协议格式,然后发送给代理服务器,代理服务器再将数据包发送给目标服务器。代理服务器接收到目标服务器的响应后,再将响应发送给客户端。SOCKS5 协议并未加密数据包。SOCKS5 协议能代理传输层及以上的任何协议的流量。

表示层

表示层对上层数据或信息进行变换(加密、压缩、格式转换等)以保证一个主机应用层信息可以被另一个主机的应用程序理解。

TLS

表示层常见的协议有 SSL/TLS 协议。TLS 协议对传输的数据进行加密。

NOTE

HTTPS 是互联网的主要的应用层协议,其中 HTTP 报文由 TLS 协议加密保护。非对称加密的数学原理保证了暴力破解密钥所需要的算力远超人类在可以预见的未来内能够达到的水平,非常安全。

浏览器、常用软件、手机 app 的大部分网络流量都是受到 TLS 加密保护的。除了用户访问的网站本身,理论上没有任何其他人能够解密或窃取传输的数据,任何审查者和攻击者最多只能知道用户在访问什么网站。(指在端到端加密没有被破坏的前提下。如果浏览器提示不安全连接但是用户执意继续访问,或者攻击者在用户的设备上安装了根证书,就可能发生中间人攻击,导致窃密。)

TLS 协议将在后续教程中讲解。

应用层

应用层是 OSI 模型的最顶层,直接与用户交互。它为网络应用程序提供访问网络服务的接口,定义了网络应用程序之间交互的规则和数据格式。应用层协议直接服务于用户的具体需求,例如网页浏览、文件传输、电子邮件收发等。应用层协议依赖于下层协议提供的服务,例如 TCP 和 UDP,来完成数据的传输。

应用层常见协议

  • HTTP/HTTPS:用于网页浏览,客户端通过 HTTP 或 HTTPS 协议请求服务器的资源,并接收服务器的响应。
  • DNS:将域名解析为 IP 地址,确保用户能够通过易记的域名访问服务器。
  • SMTP:用于发送电子邮件。
  • POP3/IMAP:用于接收电子邮件。
  • FTP:用于在客户端和服务器之间传输文件。
  • SSH:用于安全地远程登录和管理服务器。
  • WebSocket:用于在浏览器和服务器之间建立持久的双向通信通道,常用于实时应用。

HTTP

HTTP、HTTPS、WebSocket 都是与 Web(网站和网络应用开发)相关的。Web 将在后续教程中重点讲解。

SSH

SSH(Secure Shell)是一种用于安全访问远程计算机的协议。SSH 提供了强大的身份验证和加密功能,确保数据在传输过程中不被窃听和篡改。SSH 常用于远程登录服务器、执行命令、传输文件等。SSH 使用 TCP、22 端口。

TIP

使用 SSH 登录远程服务器^3
  1. 准备工作:确保本地计算机和远程服务器都已安装 SSH 客户端。打开终端执行 ssh 命令,若出现 ssh 的 usage 提示则表示可以正常使用 ssh。大多数系统都安装了 OpenSSH 等 SSH 客户端。也可以使用 Tabby 等功能更强大的 SSH 客户端。

  2. 获取远程服务器信息:需要知道远程服务器的 IP域名,以及用于登录的用户名和密码(或 SSH 密钥)。

  3. 使用密码登录(不安全):在终端中输入以下命令,并根据提示输入密码:

    bash
    ssh username@remote_host
  4. 使用 SSH 密钥登录(推荐):

    (也称使用公钥登录。安全性高于密码。非对称加密将在后续教程中讲解。)

    1. 首先在本地生成 SSH 密钥对(如果尚未生成):

      bash
      ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    2. 将生成的公钥(~/.ssh/id_rsa.pub)复制到远程服务器的 ~/.ssh/authorized_keys 文件中:

      bash
      ssh-copy-id username@remote_host
    3. 使用密钥登录:

      bash
      ssh -i ~/.ssh/id_rsa username@remote_host
  5. 安装 fail2ban 等封禁暴力破解 SSH 的 IP 的程序,或在云厂商的管理界面的防火墙里设置只允许自己的 IP 访问 22 端口。不要在 iptables 中设置仅允许自己的 IP 访问,否则如果设置错了就无法登录服务器了。