我将给出一个(基本的?)解释,省略一些细节。
应用层
您示例中的应用层包括:浏览器和服务于 www.google.com 的网络服务器、DNS 系统和协议以及 HTTP 协议。
每个网络应用程序都被编程为使用特定的传输和网络层,这意味着您的浏览器应用程序和网络服务器被设计和编码为使用 TCP/IP。应用程序通过操作系统 (OS) 提供的 TCP/IP 和 API 使用。在大多数(如果不是全部)情况下,这个 API 就是所谓的Berkeley Sockets API(从现在开始就是套接字 API)。使用此 API,Web 服务器可以指示操作系统在特定端口(HTTP 的 80 或 HTTPS 的 443)上侦听客户端连接,当建立新连接时,操作系统会将其“传递”给 Web 服务器应用程序。使用相同的 API 浏览器建立与 Internet 中远程 Web 服务器的新连接并发送和接收数据。
当您键入 www.google.com 时,浏览器需要做的第一件事就是查找 www.google.com 的 IP 地址,因为 Internet 中的通信不使用主机名。这是使用Domain Name System 或DNS 执行的。省略细节,浏览器使用套接字 API 使用 UDP 向配置的 DNS 服务器 IP 地址和端口 53 发送 DNS 查询,以获取 www.google.com 的 IP 地址。 DNS 服务器也会使用 UDP 向浏览器发送回复。
一旦浏览器获得 www.google.com 的 IP 地址,它将使用套接字 API 与之前获得的 IP 地址和端口 443(如果使用 HTTPS)建立新的 TCP 连接。建立连接后,浏览器会通过该连接向 Web 服务器发送 HTTP 请求,以获取网页、图像、音频等资源,Web 服务器将使用同一连接将回复发送回浏览器。 HTTP 是您的浏览器和 Web 服务器之间使用的应用程序级协议。
从网络的角度来看,应用层的职责是:
- 使用套接字 API 通过 UDP 上的 DNS 应用层协议将主机名转换为 IP 地址。
- 使用套接字 API 与为 www.google.com 获得的 IP 地址、端口 443 建立 TCP 连接。
- 使用 HTTP 应用层协议通过此连接发送请求和接收响应(通过套接字发送和接收数据)。同样,HTTP 是浏览器和网络服务器之间用于请求资源(网页、图像等)并接收响应的协议。
应用层构建应用层协议消息或数据,并通过套接字 API 与传输层进行交互。使用此 API,应用程序指示 TCP 建立与远程主机和端口的新连接,并在连接的另一端向/从应用程序发送和接收数据。
传输层
您示例中的传输层包括在源主机和目标主机中运行的 UDP 和 TCP 协议,不包括中间主机。
传输层用于在 Internet 中某些特定主机中运行的两个(或多个在广播的情况下,但此处不适用)特定应用程序之间发送数据。
传输层还有你提到的其他职责:在TCP的情况下,连接建立和断开、错误检测和重传、有序传递、流量控制和拥塞控制等。使用了TCP头中的一些字段用于这些目的。
TCP 和 UDP 将应用程序数据(在这种情况下为 DNS 或 HTTP 请求和响应)封装成数据包,其中包含包含源端口号和目标端口号字段的标头,并将它们传递给 IP 层以传递目标 IP 地址。
网络层
您的示例中的网络层包括在源主机和目标主机中运行的 IP 协议以及在通往最终目的地的每一跳上运行的 IP 协议层。这些中间跃点是用于互连 Internet 内不同网络的路由器。
IP 协议是一种无连接、尽力而为的交付(无重传、无纠错、无重复检测)协议,用于在 Internet 中的两个特定主机之间发送数据包。
网络层与传输层的职责不同,它的主要目的是在互联网上的主机之间路由数据包,互联网是一个复杂的互联网络,通过路由器使用不同的链路层技术并由不同的组织管理。网络层隐藏了较低层的网络细节,并为传输层提供主机之间的数据包传递服务。
网络层数据包(在我们的例子中是 IP 数据报)包含一个标头,其中包含用于将数据包路由到 Internet 中正确主机的源 IP 地址和目标 IP 地址。这一层的一部分是路由器,一种特殊用途的网络设备,用于互连不同的物理网络,并使用目标地址和路由表在它们之间路由数据包,这些路由表使用路由交换协议(如OSPF 和BGP)动态构建
IP 将 TCP 段封装成 IP 数据报,包括一个包含协议 = TCP 字段的标头(此字段由目标 IP 层用于将数据报的内容传递给 TCP 或 UDP)、源 IP 地址和目标 IP 地址并将它们传递给链路层,以便沿着到达目的地的路径传递到下一跳。
链接层
您示例中的链路层可能包含多个协议。在您的本地网络中,可能是 WI-FI(IEEE 802.11 标准)和/或以太网(IEEE 802.3 标准),但也包括家庭和 ISP、ISP 的不同网络和广域网之间使用的链路层协议用于到达目标 ISP 或公司,最后到达目标主机。您可能还使用的一些链路层协议是:PPP 和 Frame Relay。
链路层只在主机连接的本地网段(链路)上运行,链路层数据包不会路由到其他网络。该层的职责是使用物理层在连接到同一网络的两台主机之间传输数据。 这一层,是唯一在两台不同机器之间实际传输比特的层。
链路层将 IP 数据报封装成帧,其中包含一个包含 EtherType = IP 字段的标头(该字段由目标链路层用于将帧的内容传递到适当的网络层)、源链路层地址和目标链路层地址(例如 MAC 地址)。
物理层
您示例中的物理层可能包含多个协议。在您的本地网络中,可能是Ethernet physical layers 的一部分,但也包括在您的家庭和您的 ISP 之间使用的物理层协议,例如DSL,在您的 ISP 的不同网络内以及用于到达目标 ISP 的广域网或公司,最后是目的地主机。在广域网中,最常用的物理层是SDH or SONET
物理层使用不同的digital modulation methods将比特转换为电信号或光脉冲,并通过物理介质传输这些信号,无论是铜线、微波还是光纤。物理层包括构建网络所需的每一块硬件,如连接器、电线、设备、天线、中继器等。
一个具体的例子
假设 Google 网络服务器的 IP 地址 = 10.0.0.1,而您的主机的 IP 地址 = 20.0.0.1。还假设 Google 的某个网络管理员使用 www.google.com 的条目设置 DNS 服务器以映射到 10.0.0.1。还假设您的主机配置为使用 IP = 30.0.0.1 的 DNS 服务器。
Google 网络服务器使用套接字 API 来侦听来自 IP 10.0.0.1 和端口 443 的客户端(浏览器)的连接。网络服务器主机操作系统会将每个新的 TCP 连接转发到 10.0.0.1:443 到网络服务器应用程序。
您在主机的浏览器中键入 www.google.com,IP 地址 = 20.0.0.1。
您的浏览器使用套接字 API 将使用 UDP 向目标 IP = 30.0.0.1 和目标端口 = 53 发送 DNS 查询。侦听该主机和端口的 DNS 服务器将接收查询并将其转发给其他一些DNS 服务器,直到 Google DNS 服务器(域 google.com 的权威机构)被联系,并以 DNS 响应进行响应,告知 www.google.com 位于 10.0.0.1。请参阅下面的详细信息以了解这些查询如何使用 UDP 传递到 DNS 服务器应用程序并将响应发送回应用程序,在此详细信息级别上与 UDP 的唯一区别是在发送数据之前没有建立连接。
您的浏览器,再次使用套接字 API,将建立一个到目标 IP = 10.0.0.1 和目标端口 = 443 的 TCP 连接。您的操作系统将为此连接分配一个随机本地端口,假设端口 = 10000。现在我们有一个由本地和目标端点标识的 TCP 连接,在我们的示例中是 (20.0.0.1:10000, 10.0.0.1:443)。
在获得 www.google.com 的 IP 地址后,您的浏览器将再次使用套接字 API 发送 HTTP 请求,请求 index.html 和该页面的所有资源。 Sockets API 会将应用数据发送到 TCP 层。
在您的主机中运行的 TCP 层会将应用程序数据封装到本地端口 = 10000 和目标端口 = 443 的段中,并要求 IP 层将这些段发送到目标 IP = 10.0.0.1。
在您的主机中运行的 IP 层将使用本地路由表和目标 IP 地址为这些数据报找到下一跳。下一跳将是您主机中配置的默认网关。
在您的主机中运行的 IP 层将使用名为 ARP 的协议查找下一跳(默认网关)的 MAC 地址。此协议用于查找位于同一本地网络中的给定目标 IP 地址的 MAC 地址。
IP 层将 TCP 段封装成协议 = TCP、源 IP = 20.0.0.1 和目标 IP = 10.0.0.1 的 IP 数据报,并要求链路层将这些 IP 数据报发送到下一跳。
下一跳 IP 地址映射到您机器中安装的网络接口。因此,链路层将 IP 数据报封装成 EtherType = IP、源 MAC =(映射的本地网络接口的 MAC 地址)和目标 MAC =(使用 ARP 获得的默认网关的 MAC 地址)的帧,并通过正确的网络接口发送它们.
默认网关(一个路由器)和沿途的所有其他路由器都会重复这个过程:
- 链路层将接收发往某些本地网络接口的 MAC 地址的帧。
- 链路层将检查帧字段 EtherType,并且由于值为 IP,因此会将数据报传递给 IP 层。
- IP 层将检查目标 IP 地址,由于目标 IP 地址不是任何本地 IP 地址,因此它将使用本地路由表为该数据报找到下一跳,依此类推,直到最终目标主机。
最终主机(运行 Google 网络服务器)将执行相同的步骤,但由于现在目标 IP 地址与该主机的本地 IP 地址之一匹配,IP 层将检查 IP 数据报的协议字段,因为它是TCP 会将这些段传递给 TCP 层。 TCP 层将检查 TCP 段中的目标端口(本例中为 443),并将应用程序层数据通过套接字 API 传递给侦听端口 443 上的应用程序(本例中为 Google Web 服务器)。请记住,此套接字绑定到特定的远程 IP 和端口 (20.0.0.1:10000),因此当 Web 服务器通过此套接字发送回响应时,该过程将重复,但现在源 IP = 10.0.0.1,源端口 = 443,目标 IP = 20.0.0.1,目标端口 = 10000。