我将提供一个基本的解释,省略一些细节。
应用层在你的例子中包括:浏览器和为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地址,用于将数据包路由到互联网内正确的主机。该层的一部分是路由器,这些是专门用于连接不同物理网络并使用目标地址和路由表在它们之间路由数据包的网络设备,使用路由交换协议(如
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地址)。
物理层
在您的示例中,物理层可能包括多个协议。在您的本地网络中,可能是一些以太网物理层,但也包括在您的家庭和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。