在有了之前两篇文章的介绍后,相信读者对计算机网络有了初步的认识,那么下面我们就要对不同的协议层进行分类介绍了,我们还是采用自上而下的方式来介绍,这种介绍对读者来说更容易接纳,吸收程度更好(说白了就是更容易给我的文章点赞,逃)。
一般情况下,用户不太在意网络应用程序实际上是按照怎样的机制运行的,但我们是程序员吖,就套用朱伟的一句话说:你觉得计算机网络程序员不了解,你指着互联网用户去了解吗?有内个味儿没?
应用层指的是 OSI 标准模型的第 5、6、7层,也就是会话层、表现层、应用层。
我们介绍的时候都会使用 OSI 标准模型来介绍,因为这样涵盖的层次比较多,这样对于 TCP/IP 模型来说,你也能加深理解。
应用层概念
应用层协议的定义
现如今,越来越多的应用程序利用网络进行通信,这些应用有 Web 浏览器、远程登录、电子邮件、文件传输、文件下载等,应用层的协议正是进行这些行为活动的规则和标准。
应用层协议(application layer protocol)
定义了在不同端系统上的应用程序进程如何相互传递报文。一般来说,会定义如下内容
- 交换的报文类型:是请求报文还是相应报文
- 报文字段的解释:对报文中各个字段的详细描述
- 报文字段的语义:报文各个字段的含义是什么
- 进程何时、以什么方式发送报文以及响应
应用层体系结构
应用层体系结构
的英文是 Application Architecture,它指的是应用层的结构,一般来说,应用层有两种主流体系结构
- 客户 - 服务器体系结构 ( client-server architecture )
- 对等体系结构 ( P2P architecture )
下面我们先来聊一下客户 - 服务器体系结构的概念
在客户-服务器体系结构中,有一个总是打开的主机称为 服务器(Server)
,它提供来自于 客户(client)
的服务。我们最常见的服务器就是 Web 服务器
,Web 服务器服务于来自 浏览器
的请求。
当 Web 服务器通过浏览器接收到用户请求后,它会经过一系列的处理把信息或者页面等通过浏览器呈现给应用。这种模式就是客户 - 服务器模式。
有两点需要注意
- 在客户 - 服务器模式下,通常客户彼此之间是并不互相通信的。
- 服务器通常具有固定的、周知的 IP 地址可以提供访问。
客户 - 服务器模式通常会出现随着客户数量的急剧增加导致单台服务器无法完成大量客户请求的情况。为此,通常需要配备大量主机的 数据中心(data center)
,用来跟踪所有的用户请求。
于此相反,P2P 也就是对等体系结构对这种数据中心的依赖性很低,因为在 P2P 体系结构中,应用程序在两个主机之间直接通信,这些主机被称为对等方
,与有中心服务器的中央网络系统不同,对等网络的每个用户端既是一个节点,也有服务器的功能。常见的 P2P 体系结构的应用有 文件共享、视频会议、网络电话等。
P2P 一个最大的特点就是 扩展性(self-scalability)
,因为 P2P 网络的一个重要的目标就是让所有的客户端都能提供资源、获取资源,共享带宽,存储空间等。因此,当有更多节点加入且对系统请求增多,整个系统的容量也增大。这是具有一组固定服务器的客户 - 服务器结构不具备的,这也就是 P2P 的扩展性。
进程通信
我们上面说到了两种体系结构,一种是客户 - 服务器模式,一种是 P2P 对等模式。我们都知道一个计算机允许同时运行多个应用程序,在我们看起来这些应用程序好像是同时运行的,那么它们之间是如何通信的呢?
用操作系统的术语来说,进行通信实际上是 进程(process)
而不是程序。一个进程可以被认为是运行在端系统中的程序。当多个进程运行在相同的端系统上时,它们使用进程间的通信机制相互通信。进程间的通信规则由操作系统来确定。
进程与计算机网络之间的接口
计算机是庞大且繁杂的,计算机网络也是,应用程序不可能只有一个进程组成,它同样是多个进程共同作用协商运行,然而,分布在多个端系统之间的进程是如何进行通信的呢?实际上,每个进程之间会有一个 套接字(socket)
的软件接口存在,套接字是应用程序的内部接口,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。
通过一个实例来简单类比一下套接字和网络进程:进程可类比一座房子,而它的套接字相当于是房子的门,当一个进程想要与其他进程进行通信时,它会把报文推出门外,然后通过运输设备把报文运输到另外一座房子,通过门进入房子内部使用。
下图是一个通过套接字进行通信的流程图
从图可以看到,Socket 属于主机或者服务进程的内部接口
,由应用程序开发人员进行控制,两台端系统之间进行通信会通过 TCP 的缓冲区经由网络传输到另一个端系统的 TCP 缓冲区,Socket 从 TCP 缓冲区读取报文供应用程序内部使用。
套接字是建立网络应用程序的可编程接口,因此套接字也被称为应用程序和网络之间的
应用程序编程接口(Application Programming Interface,API)
。应用程序开发人员可以控制套接字内部细节,但是无法控制运输层的传输,只能对运输层的传输协议进行选择,还可以对运输层的传输参数进行选择,比如最大缓存和最大报文长度等。
进程寻址
我们上面提到网络应用程序之间会相互发送报文,那么你怎么知道你应该向哪里发送报文呢?是不是存在某种机制能够让你知道你能够发到哪里?这就好比你要发送电子邮件,你写好了内容但是你不知道发发往哪里,所以这个时候必须要有一种知道对方地址的机制,这种机制能够辨明对方唯一的一个地址,这种地址就是 IP地址
。我们会在后面的文章中详细讨论 IP 地址的内容,目前只需要知道 IP 是一个 32 比特的量并且能够唯一标示互联网中任意一台主机的地址就可以了。
只知道 IP 地址是否就可以了呢?我们知道一台计算机可能会运行多个网络应用程序,那么如何确定是哪个网络应用程序接受发送过来的报文呢?所以这时候还需要知道网络应用程序的 端口号(port number)
。例如, Web 应用程序需要用 80 端口来标示,邮件服务器程序需要使用 25 来标示。
应用程序如何选择运输服务
我们知道应用程序是属于互联网四层协议的 应用层
协议,并且四层协议必须彼此协助共同完成工作。好了,这时候我们只有应用层协议,我们需要发送报文,我们如何发送报文呢?这就好比你知道目的地是哪里了,你该如何到达目的地呢?是走路,公交,地铁还是打车?
应用程序发送报文的交通工具
的选择也有很多,我们可以从 数据传输是否可靠、吞吐量、定时和安全性 来考虑,下面是你需要考虑的具体内容。
数据传输是否可靠
我们之前探讨过,分组在计算机网络中会存在丢包问题,丢包问题的严重性跟网络应用程序的性质有关,如果像是电子邮件、文件传输、远程主机、Web 文档传输的过程中出现问题,数据丢失可能会造成非常严重的后果。如果像是网络游戏,多人视频会议造成的影响可能比较小。鉴于此,数据传输的可靠性也是首先需要考虑的问题。因此,如果一个协议提供了这样的确保数据交付的服务,就认为提供了 可靠数据传输(reliable data transfer)
,能够忍受数据丢失的应用被称为 容忍丢失的应用(loss-tolerant application)
。
吞吐量
在之前的文章中我们引入了吞吐量的概念,吞吐量就是在网络应用中数据传输过程中,发送进程能够向接收进程交付比特的速率。具有吞吐量要求的应用程序被称为 带宽敏感的应用(bandwidth-sensitive application)
。带宽敏感的应用具有特定的吞吐量要求,而 弹性应用(elastic application)
能够根据当时可用的带宽或多或少地利用可供使用的吞吐量。
定时
定时是什么意思?定时能够确保网络中两个应用程序的收发是否能够在指定的时间内完成,这也是应用程序选择运输服务需要考虑的一个因素,这听起来很自然,你网络应用发送和接收数据包肯定要加以时间的概念,比如在游戏中,你一包数据迟迟发送不过去,对面都推塔了你还卡在半路上呢。
安全性
最后,选择运输协议一定要能够为应用程序提供一种或多种安全性服务。
因特网能够提供的运输服务
说完运输服务的选型,接下来该聊一聊因特网能够提供哪些服务了。实际上,因特网为应用程序提供了两种运输层的协议,即 UDP
和 TCP
,下面是一些网络应用的选择要求,可以根据需要来选择适合的运输层协议。
应用 | 数据丢失 | 带宽 | 时间敏感 |
文件传输 | 不能丢失 | 弹性 | 不敏感 |
电子邮件 | 不能丢失 | 弹性 | 不敏感 |
Web 文档 | 不能丢失 | 弹性 | 不敏感 |
因特网电话/视频会议 | 容忍丢失 | 弹性 | 敏感,100ms |
流式存储音频/视频 | 容忍丢失 | 弹性 | 敏感,几秒 |
交互式游戏 | 容忍丢失 | 弹性 | 是,100ms |
智能手机消息 | 不能丢失 | 弹性 | 无所谓 |
下面我们就来聊一聊这两种运输协议的应用场景
TCP
TCP
服务模型的特性主要有下面几种
- 面向连接的服务
在应用层数据报发送后, TCP 让客户端和服务器互相交换运输层控制信息。这个握手过程就是提醒客户端和服务器需要准备好接受数据报。握手阶段后,一个 TCP 连接(TCP Connection)
就建立了。这是一条全双工的连接,即连接双方的进程都可以在此连接上同时进行收发报文。当应用程序结束报文发送后,必须拆除连接。
- 可靠的数据传输
通信进程能够依靠 TCP,无差错、按适当顺序交付所有发送的数据。应用程序能够依靠 TCP 将相同的字节流交付给接收方的套接字,没有字节的丢失和冗余。
- 拥塞控制
TCP 的拥塞控制并不一定为通信进程带来直接好处,但能为因特网带来整体好处。当接收方和发送方之间的网络出现拥塞时,TCP 的拥塞控制会抑制发送进程(客户端或服务器),我们会在后面具体探讨拥塞控制
UDP
UDP
是一种轻量级的运输协议,它仅提供最小服务。UDP 是无连接的,因此在两个进程通信前没有握手过程。UDP 也不会保证报文是否传输到服务端,它就像是一个撒手掌柜。不仅如此,到达接收进程的报文也可能是乱序到达的。
下面是上表列出来的一些应用所选择的协议
应用 | 应用层协议 | 支撑的运输协议 |
电子邮件 | SMTP | TCP |
远程终端访问 | Telnet | TCP |
Web | HTTP | TCP |
文件传输 | FTP | TCP |
流式多媒体 | HTTP | TCP |
因特网电话 | SIP、RTP | TCP 或 UDP |
应用层协议
下面我们着重介绍一下应用层都有哪些比较重要的应用协议
WWW 和 HTTP
万维网(WWW, World Wide Web)
是将互联网中的信息以超文本的形式展现的系统,也就是 Web 。用来显示 WWW 结果的客户端被称为 Web 浏览器,通过浏览器,我们无需关注想要访问的内容在哪个服务器上,我们只需要知道我们想访问的内容就可以了。
WWW 定义了三个比较重要的概念,这些概念主要有
URI
,定义了访问信息的手段和位置HTML
, 定义了信息的表现形式HTTP
,定义了 WWW 的访问规范
URI / URL
URI
的全称是(Uniform Resource Identifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。
URL
的全称是(Uniform Resource Locator),中文名称是统一资源定位符,也就是我们俗称的网址
,它实际上是 URI 的一个子集。
URI 不仅包括 URL,还包括 URN(统一资源名称),它们之间的关系如下
URI 已经不局限于标识互联网资源,它可以作为所有资源的识别码。
HTML
HTML 称为超文本标记语言,是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的 Internet 资源连接为一个逻辑整体。HTML 文本是由 HTML 命令组成的描述性文本,HTML 命令可以说明文字,图形、动画、声音、表格、链接等。
HTTP
Web 的应用层协议就是 HTTP(HyperText Transfer Protocol, HTTP)
, 超文本传输协议,它是 Web 的核心协议。下面我们需要了解一下 HTTP 中的几个核心概念。
Web 页面
Web 页面也叫做 Web Page
,它是由对象组成,一个对象(object)
简单来说就是一个文件,这个文件可以是 HTML 文件、一个图片、一段 Java 应用程序等,它们都可以通过 URI 来找到。一个 Web 页面包含了很多对象,Web 页面可以说是对象的集合体。
浏览器
就如同各大邮箱使用电子邮件传送协议 SMTP
一样,浏览器是使用 HTTP 协议的主要载体,说到浏览器,你能想起来几种?是的,随着网景大战结束后,浏览器迅速发展,至今已经出现过的浏览器主要有