应用层的程序之间是如何沟通的

Posted by Joel on February 09,2018

前言

接下来的一系列文章中我们将要讨论计算机网络的五层架构。

这些文章是我学习计算机网络过程中的笔记与理解,用问答的方式写出来。

既然是分层架构,那么在讨论每一层时我们不去关注其他层的实现细节,而是直接使用它们提供的服务。

什么是应用层


应用层位于计算机网络五层模型中的最顶层,也是我们日常接触最多的一层,web、邮件、迅雷、bitTorrent等等软件都运行在应用层。

他们使用不同的应用层协议,这些软件被称为应用程序。

我们的问题:应用层的程序之间是如何沟通的

一个帮助我们理解的例子

假设你拿着一把98K(没错狙神就是你),你想一枪打死八百里外的鬼子机枪手。

此时你的大脑是一个程序,鬼子的大脑是一个程序。

我们要做的就是搞清楚你是如何与八百里外的鬼子通信的。

总览-应用程序体系结构

现代网络应用程序使用两种主流体系结构:

  1. 客户-服务器(C-S)体系结构
  2. 对等(P2P)体系结构

特点

C-S体系要求服务器保持开启状态并准备响应客户端的请求,客户与服务器进行通信以得到服务。

P2P体系要求连接的主机间直接进行通讯,这些主机称为对等方,并不存在一个专门的服务器来提供服务。虽然可以相互通信,但给定情境下依旧是一方作为客户端,一方作为服务器。

程序通信实质是进程通信

运行在多个端系统上的应用程序间的通信实际上是进程间的通信。

什么是进程间通信

当两个进程运行在同一个端系统时,他们使用操作系统提供的进程间通信机制来相互通信。

就好比你是一个精神分裂患者,你的不同人格之间可以直接对话。

当两个进程运行在不同的端系统(如一台客户端电脑和一台服务器时),两个进程通过计算机网络来相互通信。发送进程向网络中发送报文,接收进程从网络接收报文并进行响应(或不响应)。

对应我们的例子,你的大脑就是一个进程,鬼子的大脑是另一个进程,你将要痛击他的大脑。

客户进程与服务器进程

在一个会话开始时,发起通信的进程是客户(client)进程,等待联系的进程是服务器(server)进程。

在P2P体系中一个进程可以既是客户又是服务器。例如在P2P文件共享应用中,一个进程既能下载文件又能上载文件。

现在我们的问题变为了:不同端系统上的两个进程如何进行通信。

如何进行进程间通讯(不同主机间)

上文说过,通过计算机网络进行通讯,那么具体怎么做到的呢?

以98K的例子来说,我要怎样才能痛击鬼子呢?

其实很简单:

  1. 找到目标的位置
  2. 瞄准他的某部位(咋这么污…
  3. 扣下扳机,射出子弹(越来越污…
  4. 子弹在空气中飞行
  5. 子弹到达,目标清除

目前需要关心的只有前三个步骤

上述1、2两个步骤对应到进程间通信叫做进程寻址

什么是进程寻址

想要痛击鬼子,首先你得知道鬼子在哪里,然而光知道目标在哪里还不够,你得往目标身上某个致命的部位瞄准(🌼),最后才能开枪。

对应到计算机网络中:你想与目标进程通信,你得知道目地主机的地址;然而光知道地址还不够,主机上运行有很多进程,你得找到目的主机上运行的那个进程;最后发出报文。

  • 目的主机的地址在internet中用IP来标识
  • 目的主机中的进程用端口号来标识

至于你能不能保证子弹可以飞到目标面前,子弹是怎么在空气中飞行的等种种问题,我们统统不管。

总结:IP地址加端口号标记出了一个主机上运行的进程。

那么,我们知道了目标的地址和端口,知道计算机网络可以帮我们传输报文,那么该怎么发送报文呢?

对应我们的例子,我们来到了步骤三:扣下扳机

套接字

怎么扣扳机?用你的脑子控制你的手啊!

具体一点,大脑向手部神经发出指令:扣下扳机。至于发出指令后神经怎么控制手扣扳机,大脑完全不在乎,因为它知道发出指令就能扣下扳机,并且能痛击鬼子。

对应到计算机中,由进程与套接字进行交流,通过套接字收发数据,而套接字具体怎么收发数据进程完全不在乎,因为进程知道从套接字读写数据就能与目标进程通信。

这就是前言里提到的分层结构的最大好处:直接使用其他层提供的服务而不用去关心细节。

什么是套接字

套接字(socket)是一个软件接口,是同一台主机内应用层与运输层的接口。

在linux中它是一个可被读写的文件,当你往文件中写入时,它将写入的数据发送到网络中;当它从网络中接收到数据,你可以从文件中读出数据。

在我们的例子中,大脑是位于应用层的进程,身体代表了运输层,而手部神经就是一个套接字。

大脑直接向神经发出指令,并不关心指令执行的细节。

第一眼看到套接字我是一脸懵逼的,这三个字拆开都认识,合起来是什么鬼???!!!

在以后的运输层多路复用与多路分解中会详细介绍套接字


至此我们得出结论:不同主机上应用程序间的通信就是进程的通信。这些进程通过套接字与计算机网络(具体来说是运输层)进行通信。

运输层为运行在不同主机间的进程提供了逻辑通信,从进程的角度看,通过逻辑通信,运行不同进程的主机好像直接连接在一起。

计算机网络屏蔽掉底层的细节,从而简化了应用程序的设计。

补充:应用层协议

应用层协议定义了运行在不同端系统上的应用程序如何相互传递报文。特别是规定了:

  • 交换的报文类型
  • 各报文类型的语法,字段及其意义
  • 如何发送、响应报文的规则

对应我们的例子,你跟对手要先商量好:

  • 是对狙还是扫射
  • 能不能叫兄弟
  • 能不能扔手雷能不能嗑药
  • 是交替开火还是自由射击

如果没商量好,那就不能动手。

简而言之协议规定了双方的行为,进程间想要通信必须运行相同的协议。


>