點擊上方藍色字體,選擇“置頂公衆號”
一起自學,一起進步
同一臺主機不同的進程之間進行通信、需要經過TCP/IP的四個層嗎?
我在同一臺電腦上打開了兩個qq軟件、讓這兩個qq進行收發消息、那麼數據會經過IP層、數據鏈路層嗎?我覺得應該不經過、因爲同一臺電腦ip是相同的、不會經過路由器轉發、也不會通過鏈路層傳輸、直接在本機上就可以實現傳輸了吧?如果是這樣、那麼具體數據是怎麼流動的呢?比如第一個qq進程發出的消息數據是怎麼進行封裝之後到達第二個qq進程的呢?有經過傳輸層封裝嗎?
這個問題可以拆分成兩個獨立的問題:
同一臺主機不同的進程之間是如何通信的?
同一臺主機不同的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進程之間是如何通信的,且聽下回分解。
END
如果讀完覺得有收穫的話,歡迎點【好看】,關注【Java知其所以然】,查閱更多精彩歷史!!!
讓我“好看”
本文分享自微信公衆號 - Java知其所以然(gh_37a1335e2608)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。