通过互联网流量了解TCP/IP分层?

6

我查看了以下资源,对TCP/IP分层有了一个高层次的理解,但无法将数据流从TCP/IP映射到现实世界中的互联网数据流。

  1. TCP/IP 分层视频
  2. HTTP与 TCP/IP,向 Web 服务器发送数据

  3. 维基百科 OSI 模型

假设我输入 www.google.com 并按下回车键,请求和响应将如何通过 TCP/IP 层传输?

我的理解:

应用层: 浏览器将对请求进行编码,以使其兼容网络。类似地,它将解码响应以供浏览器使用,因此浏览器是主要的参与者。

传输层: 操作系统(OS)将附加本地端口/套接字,以便可以映射响应。它还会使用一些头信息来丰富数据,并根据底层协议(如 TCP 或 UDP)对其进行处理。同样,操作系统将响应映射回正确的端口。可能还会进行 DNS 解析并将 IP 附加到请求中。它还将建立与服务器的连接,以便可以向服务器发送进一步的数据。

诸如 TCP(与 UDP 相对)之类的协议还将确保包按正确顺序发送,并期望接收方的确认。如果确认失败,将重试。因此,在这里操作系统是主要参与者。

网络层: ISP 将进一步转发数据到互联网骨干(IB)。IB 将决定最短路径以及其他一些东西。响应也是类似的。因此,ISP 和 IB 是两个主要参与者。

数据链路层: 此层将请求映射到正确的计算机,即 MAC 地址。因此,我认为它将在 Internet 服务提供商的某个地方驻留。实际上,我不确定此层的作用和主要参与者是谁?

物理层: 此层处理物理数据,例如电磁波。光纤/电缆可能是主要参与者。尽管在 TCP/IP 分层中它被描绘为最后一层,但我认为其作用始于传输层。

我的理解正确吗?如果不是,请有人逐点纠正它?


这是一个非常好的问题,我已经思考了很长时间。 - samayo
1
你所描述的一切都发生在本地计算机内部。ISP和Internet骨干网与此无关。DNS解析是由浏览器在连接之前执行的,而不是由传输层执行的。离题了。 - user207421
@EJP 你是在说网络层和数据链路层的工作也是在本地计算机上进行,而不是在网络层面进行(一旦数据离开本地计算机)吗? - scott miles
1个回答

8
我将提供一个基本的解释,省略一些细节。
应用层在你的例子中包括:浏览器和为www.google.com提供服务的Web服务器、DNS系统和协议以及HTTP协议。
每个网络应用程序都被编程使用特定的传输和网络层,这意味着你的浏览器应用程序和Web服务器被设计和编码使用TCP/IP。应用程序通过操作系统(OS)提供的API使用TCP/IP。在大多数情况下,这个API被称为Berkeley Sockets API(从现在开始称为套接字API)。使用此API,Web服务器可以指示操作系统监听特定端口(80用于HTTP或443用于HTTPS)以获取客户端连接,并且当建立新连接时,操作系统会将其“传递”给Web服务器应用程序。使用同样的API,浏览器在Internet上与远程Web服务器建立新连接并发送和接收数据。
当您输入www.google.com时,浏览器需要做的第一件事情是查找www.google.com的IP地址,因为互联网通信不使用主机名。这是使用域名系统或DNS完成的。省略细节,浏览器使用套接字API通过UDP发送DNS查询到配置的DNS服务器IP地址和端口53以获取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是浏览器和Web服务器之间用于请求资源(网页、图像等)并接收响应的协议。

应用层构建应用层协议消息或数据,并通过套接字API与传输层进行交互。使用此API,应用程序指示TCP建立到远程主机和端口的新连接,并向连接另一端的应用程序发送和接收数据。

传输层

您的示例中的传输层包括在源和目标主机中运行的UDP和TCP协议,不包括中间主机。

传输层用于在Internet中的某些特定主机上运行的两个(或更多,如果广播但不适用于此处)特定应用程序之间发送数据。

运输层还有其他职责,如TCP的连接建立和拆除、错误检测和重传、有序传递、流量控制和拥塞控制等。TCP头中的某些字段用于这些目的。
TCP和UDP将应用程序数据(在本例中为DNS或HTTP请求和响应)封装成包,包括带有源端口号和目标端口号的头,并将它们传递到IP层以传递到目标IP地址。
网络层在您的示例中包括源主机和目标主机中运行的IP协议,但也包括在到达最终目的地的每个跳点上运行的IP协议层。这些中间跳是用于在Internet内部连接不同网络的路由器。
IP协议是一种无连接、尽力而为的传送协议(没有重传、错误修正、重复检测),用于在Internet内部两个特定主机之间发送数据包。
网络层与传输层有不同的职责,其主要目的是在互联网的复杂互连网络中通过路由器在主机之间路由数据包,使用不同的链路层技术并由不同的组织管理。网络层隐藏了更低级别的网络细节,并向传输层提供主机之间的数据包传递服务。
网络层数据包,我们这里指的是IP数据报,包括一个头部,其中包含源IP地址和目标IP地址,用于将数据包路由到互联网内正确的主机。该层的一部分是路由器,这些是专门用于连接不同物理网络并使用目标地址和路由表在它们之间路由数据包的网络设备,使用路由交换协议(如OSPFBGP)动态构建路由表。

IP将TCP段封装到IP数据报中,包括一个包含协议 = TCP的头部字段(此字段由目标IP层用于将数据报内容传递到TCP或UDP),源IP地址和目标IP地址,并将它们传递给链路层,以便将它们传递到沿着到达目的地的路径的下一个跳。

链路层

在您的示例中,链路层可能包括多个协议。在您的本地网络中,可能是WI-FI(IEEE 802.11某些内容)和/或以太网(IEEE 802.3某些内容),但还包括用于家庭与ISP之间、ISP不同网络内部以及广域网中的链路层协议,用于到达目标ISP或公司以及最终目标主机。您可能还在使用一些链路层协议,例如:PPPFrame Relay
链路层仅在主机连接到的本地网络段(链路)上运行,链路层数据包不会路由到其他网络。该层的责任是在两个连接到同一网络的主机之间使用物理层传输数据。这一层是唯一实际在两台不同机器之间传输比特的层。
链路层将IP数据报封装到帧中,包括一个带有字段的头部,其中包括EtherType = IP(此字段由目标链路层用于将帧内容传递到适当的网络层)、源链路层地址和目标链路层地址(例如MAC地址)。
物理层

在您的示例中,物理层可能包括多个协议。在您的本地网络中,可能是一些以太网物理层,但也包括在您的家庭和ISP之间使用的物理层协议,例如DSL,在ISP的不同网络中以及用于到达目标ISP或公司和最终目的主机的广域网中使用的物理层协议。在广域网中,最常用的物理层是SDH或SONET

物理层使用不同的数字调制方法将比特转换为电信号或光脉冲,并通过物理介质传输这些信号,无论是铜线、微波还是光纤。物理层包括构建网络所需的每个硬件部件,如连接器、电线、设备、天线、中继器等。

一个具体的例子

假设Google网络服务器的IP地址为10.0.0.1,您的主机的IP地址为20.0.0.1。同时假设在Google的某个网络管理员设置了DNS服务器,并将www.google.com映射到10.0.0.1。还假设您的主机配置了一个使用IP地址为30.0.0.1的DNS服务器。
Google网络服务器使用套接字API在IP地址为10.0.0.1和端口443的位置监听来自客户端(浏览器)的连接。Web服务器主机操作系统将每个新的TCP连接转发到10.0.0.1:443到Web服务器应用程序。
您在具有IP地址为20.0.0.1的主机中的浏览器中键入www.google.com。
您的浏览器将使用sockets API发送DNS查询,使用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唯一的区别是在发送数据之前不会建立连接。
您的浏览器再次使用sockets API,将建立到目标IP = 10.0.0.1和目标端口= 443的TCP连接。您的操作系统将为此连接分配一个随机本地端口,假设端口= 10000。现在我们有一个由本地和目标端点标识的TCP连接,在我们的示例中为(20.0.0.1:10000,10.0.0.1:443)。
在获取www.google.com的IP地址后,您的浏览器将再次使用sockets 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地址映射到安装在您计算机上的网络接口。因此,链路层将使用EtherType = IP、源MAC =(映射本地网络接口的MAC地址)和目标MAC =(使用ARP获取的默认网关的MAC地址)将IP数据报封装成帧,并通过正确的网络接口发送它们。
默认网关(路由器)和沿途所有其他路由器都会重复此过程:
- 链路层将接收到MAC地址为某些本地网络接口的帧。 - 链路层将检查帧字段EtherType,由于值为IP,将数据报传递给IP层。 - IP层将检查目标IP地址,由于目标IP地址不是任何本地IP地址,它将使用本地路由表找到此数据报的下一跳,直到最终目标主机。

最终主机(运行Google Web服务器)将执行相同的步骤,但由于目标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。


TLS也在应用层。 - user207421
@Luciano Afranllie,我对网络层和链路层的作用感到困惑。你说链路层的责任是在两个连接到同一网络的主机之间使用物理层传输数据,这是否意味着当数据通过WiFi发送到我的家庭路由器,然后通过WiFi路由器到ISP时,它的角色就发挥了作用?如果是这样,为什么链路层要先于网络层出现?另外,如果这是链路层的作用,那么网络层的作用是什么时候开始的?它是在将数据路由到两个不同的ISP之间的网络上时开始的吗? - scott miles
1
网络层的作用是将数据报从您的主机端点传递到最终目的地。当IP数据报离开您的主机时,标头中的目标地址是目标主机的IP地址,并且沿途永远不会更改。链路层无法发送超出本地网络的数据包。因此,通常在到达最终目的地的路径上包括不同的物理网络和协议:wifi、DSL、帧中继等。在每个网络中,帧标头都有下一跳的目标地址,始终是位于同一物理网络上的主机。IP对上层隐藏了这些细节。 - Luciano Afranllie
非常感谢你,Luciano。 - scott miles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接