同一台主机不同的进程之间进行通信、需要经过TCP/IP的四个层吗?
我在同一台电脑上打开了两个qq软件、让这两个qq进行收发消息、那么数据会经过IP层、数据链路层吗?我觉得应该不经过、因为同一台电脑ip是相同的、不会经过路由器转发、也不会通过链路层传输、直接在本机上就可以实现传输了吧?如果是这样、那么具体数据是怎么流动的呢?比如第一个qq进程发出的消息数据是怎么进行封装之后到达第二个qq进程的呢?有经过传输层封装吗?
这个问题可以拆分成两个独立的问题:
同一台主机不同的进程之间是如何通信的?
同一台主机不同的QQ进程之间是如何通信的?
心急吃不了热豆腐,不要痴想一口吃成相扑运动员。
同一台主机不同的进程之间是如何通信的?
内存管道
先来看一个场景,在文件管理器中,可以将一个文件拖拽到Word文件到Office Word里,Office Word会自动打开。这个就是一个典型的不同进程之间的通信。文件管理器(File Manager)这是一个进程,Office Word是另外一个进程,它们分别有自己独立的进程号。
文件管理器将文件的绝对路径,以及操作类型“Read and Open”放入(Write)一个管道(Pipe),然后通知Office Word进程号有管道消息需要取走(Read),Office Word读取消息,获得文件的绝对路径以及操作类型,读取文件并打开文件。
在上述的通信过程中,并没有TCP/IP协议什么事,双方通过共享的内存管道来交换信息。但是并不是所有的进程之间都采用内存管道来交换信息。本机运行一个FTP文件服务器,在本机上使用客户端下载文件,这就需要TCP/IP协议的介入了。
TCP/IP
先来回忆一下,我们是如何下载文件的?首先我们要在地址栏输入:ftp://xxxx,对吗?这里的“xxxx”有可能是主机名,也有可能是域名,也有可能是服务器的IP地址。无论输入的是什么,无论才是DNS域名解析,还是WINS主机名解析,最终FTP客户端得到的信息都是FTP服务器的IP地址,加黑部分是理解这个问题的关键中的关键!客户端得到的并不是服务器的进程号!
难道不能通过文件拖拽的方式下载文件吗?不能,我试过!不相信的同学可以试试看。至于为何不能,我的理解是,采用TCP/IP协议传输,不仅可以满足本地进程之间的通信的需求,同时可以满足不同主机之间通信的需求。而采用内存管道传输,只能满足前者,却无法满足后者。所以FTP的文件传输只会使用TCP/IP来传输。
接下来的问题就是FTP服务器与FTP客户端之间的数据包,会下沉到TCP/IP第几层?
既然客户端与服务器是使用IP地址来识别对方,数据包肯定会下沉到IP层。IP层是路由层,路由调度员一看,咦,目的IP不就是我自己吗?然后将IP报文从发送缓存区,Copy到接收缓冲区,然后等待TCP层的宠幸,然后一路上浮到应用进程。
欲知同一台主机不同的QQ进程之间是如何通信的,且听下回分解。