一臺主機,兩個QQ,如何通信?

點擊上方藍色字體,選擇“置頂公衆號”

一起自學,一起進步


同一臺主機不同的進程之間進行通信、需要經過TCP/IP的四個層嗎?

我在同一臺電腦上打開了兩個qq軟件、讓這兩個qq進行收發消息、那麼數據會經過IP層、數據鏈路層嗎?我覺得應該不經過、因爲同一臺電腦ip是相同的、不會經過路由器轉發、也不會通過鏈路層傳輸、直接在本機上就可以實現傳輸了吧?如果是這樣、那麼具體數據是怎麼流動的呢?比如第一個qq進程發出的消息數據是怎麼進行封裝之後到達第二個qq進程的呢?有經過傳輸層封裝嗎?

這個問題可以拆分成兩個獨立的問題:

  1. 同一臺主機不同的進程之間是如何通信的?

  2. 同一臺主機不同的QQ進程之間是如何通信的?

心急吃不了熱豆腐,不要癡想一口喫成相撲運動員。

同一臺主機不同的進程之間是如何通信的?

1. 內存管道

先來看一個場景,在文件管理器中,可以將一個文件拖拽到Word文件到Office Word裏,Office Word會自動打開。這個就是一個典型的不同進程之間的通信。文件管理器(File Manager)這是一個進程,Office Word是另外一個進程,它們分別有自己獨立的進程號。

文件管理器將文件的絕對路徑,以及操作類型“Read and Open”放入(Write)一個管道(Pipe),然後通知Office Word進程號有管道消息需要取走(Read),Office Word讀取消息,獲得文件的絕對路徑以及操作類型,讀取文件並打開文件。

在上述的通信過程中,並沒有TCP/IP協議什麼事,雙方通過共享的內存管道來交換信息。但是並不是所有的進程之間都採用內存管道來交換信息。本機運行一個FTP文件服務器,在本機上使用客戶端下載文件,這就需要TCP/IP協議的介入了。

2. 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進程之間是如何通信的,且聽下回分解。


往期精彩回顧
Spring Context 你真的懂了嗎
JDK1.6 對 synchronized 的鎖優化
Java 泛型(上)


END

如果讀完覺得有收穫的話,歡迎點【好看】,關注【Java知其所以然】,查閱更多精彩歷史!!!

讓我“好看” 

本文分享自微信公衆號 - Java知其所以然(gh_37a1335e2608)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章