tl;dr许多不同的设备可能会遇到多个 OSI 级别。无论哪个端点从第 7 层协议(如 HTTP)请求某些内容,都将在将其连接到网络之前使用所有 7 层。中间节点,如路由器和交换机,最多只能使用前 3 层,防火墙或 WAN 加速器可以影响第 4 层,负载均衡器也可以做一些有趣的事情。
如果您对更详细的答案感兴趣,请看下面 - 我尝试(?)保持相当简单,并使用真实世界的例子。
以供参考:
OSI模型
来源:TCP/IP 指南
封装数据的层取决于生成数据的内容。一般来说,解封装只会发生在与数据在网络中的当前位置(路由器、主机等)相关的地方。
我的意思是,如果我是路由器,如果我要做的只是通过第 3 层路由流量,我不在乎这个数据包中是否存在 HTTP 请求 - 我只会剥离足够的标头以得到我需要的东西,做我的工作,然后继续下一个包。
我们每天都以某种方式使用互联网,因此考虑到 OSI 模型,这是典型的 HTTP 请求的样子。为简单起见,我们可以假设网络可用并且没有任何问题。
- 我在浏览器中输入“ http://google.com ”,然后按回车键。
- [第 7 层]您的 PC/服务器将生成一个 HTTP GET 请求发送到您指定的网络服务器,在这种情况下,我们正在谈论 google.com。所以如果你看上面,我们有那个 GET 请求,它被认为是“数据”。HTTP 是第 7 层协议,我们将添加该标头。因为这一层没什么可做的,所以让我们把它传递到第6层。
- [第 6 层]我们可以将第 6层视为数据应该如何格式化,对于网站来说,这里不会真正发生任何事情,但管理员/开发人员/工程师可以选择这样做。我们的 PC/Server 仍将在第 7 层 (HTTP) 标头的顶部添加一个标头,并将其向下发送到第 5 层。
- [第 5 层]在这一点上,因为我们的 PC/服务器知道我们正在尝试联系网络服务器,所以我们需要以整个应用程序可以理解的格式发出此请求,为此我们使用应用程序接口 (API) . 这是管理应用程序会话的内容,这样 Web 服务器就会知道数据属于哪个“流”。让我们添加第 5 层标题,并将其向下传递到第 4 层。
- [第 4 层]网络工程师关心所有数据,但这对我们来说开始变得非常具体。第 4 层是我们的传输层,在这里我们决定我们的数据如何到达那里,不是路径,而是如何——即 TCP 或 UDP。在这种情况下,我们的 PC/Server 需要与 Web 服务器建立连接。为简单起见,我将略过一些事情,但这是典型的 TCP 3 次握手发生的地方。我们将当前拥有的内容封装在 TCP 标头中,其中包含源和目标端口号、序列号和确认号以及 TCP 窗口信息等内容。
- [第3层]这是我们工程师真正关心的另一层,网络层。这是数据包被寻址到目的地的地方,我们需要 IP 地址才能到达网络上的位置。我们的 PC/服务器将添加其源和目标 IP 地址。数据包不仅会到达正确的目的地,而且该端点将在需要向我们发送任何类型的数据时使用我们的源 IP 地址将其发回给我们。现在,这里需要注意的是,即使 PC/Server 也可以有多个接口,因此我们需要将数据发送到正确的位置。我们的 PC/服务器将有一个路由表,就像路由器一样,通常如果您是某种主机,您的数据包将被路由到您的默认网关,希望它知道如何将数据包送到目的地。让我们添加该 IP 标头并将其传递给数据链路层。
- [第 2 层]我们的 PC/服务器的网络接口卡 (NIC) 不知道如何自己说 IP,因此它使用媒体访问控制 (MAC) 地址来移动该数据。您的 PC/服务器将为它可以访问的每个 IP 提供 ARP 条目,因此在这种情况下,它将为您的默认网关提供一个条目。您的网关 IP 地址将与目标 MAC 地址相关联。因此,让我们添加目标 MAC 地址的 L2 标头,该标头还包含我们的 PC/服务器 NIC 的 MAC 地址作为源。现在我们拥有了将数据作为位放到线路上所需的一切。
- [第 1 层]正如您在问题中提到的,这是数据流过线路的地方,也是我们看到原始 1 和 0 的地方。现在没有第 1 层标题本身,如果您查看第 2 层上的图表,您会看到。到目前为止,包含从 L7 到 L2 的所有标头的数据将被转换为那些 1 和 0。
- 现在我们在线路上有一些东西,在它通往你的网关路由器的路上。到目前为止,您的 PC/服务器已经完成了封装绑定到 google.com 网络服务器的数据的所有工作。
- [第 1 层]现在您的网关路由器接收 1 和 0。路由器上的 NIC(接口)获取该数据并基本上说“我不知道如何阅读!” 并将其带到第 2 层,以便它可以读取数据。
- [第 2 层]网关路由器现在检查 L2 帧,它说“好吧,很酷,你来自这个 MAC,整洁。我看到你的目标 MAC 被设置为我的 MAC 地址,所以我可以继续做这项工作。它会解封装 L2 标头,以便它可以查看 IP 标头(第 3 层)。
- [第 3 层]您的网关路由器现在将查看源 IP 地址和目标 IP 地址。它说“好吧,你来自这个来源,很酷。你的目的地是这个 IP 地址。嗯,我不拥有这个 IP 地址,但我知道谁拥有。” 它将在其路由表中查找目标 IP 地址 (google.com) 的路由并使用该条目。
- 在所有这些之后,重复相同的一般过程。它将检查它需要发送数据包的接口,使用该接口的 MAC 地址,将其转换为位并发送。下一个路由器会做同样的事情,依此类推。通常,这些数据包只有在到达其最终目的地时才会被剥离回第 7 层。正如我之前提到的,路由器只关心将数据包送到他们的目的地,所以它只关心第 3 层,所以除了需要什么之外,它没有理由查看其他任何东西以获得到那个信息。所以它会看到 L1/L2/L3 信息,但没有其他信息。
- 最终,数据有望到达目标 Web 服务器,此时数据的外层将一直剥离到 Web 服务器读取的 HTTP 标头,并执行任何必要的操作来处理该请求。
注意:公平地说,其他事情可能会干扰典型行为(防火墙、NAT/PAT、ACL 等),但最好对所有封装和解封装发生的位置有非常深入的了解以了解这些如何影响网络和流量。