歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux 系統應用編程——網絡編程(利用TCP/IP 模型分析數據傳輸過程)

Linux 系統應用編程——網絡編程(利用TCP/IP 模型分析數據傳輸過程)

日期:2017/3/1 11:46:28   编辑:關於Linux

TCP/IP參考模型是一個非常基礎,而且也非常重要的基礎框架,要想入門數通這是個必須掌握的基本概念,本文檔通過一個簡單的示例,結合參考模型來分析一下數通的基本過程。

\

網絡環境非常簡單,如下圖所示,我們現在來分析一下PC去訪問Webserver的WEB服務,整個數據通信過程是如何發生的,為了簡化描述,我們這裡暫時忽略DNS、ARP、幀校驗等等機制的工作細節,只考慮較為宏觀的層面。

1)PC訪問WebServer的WEB服務,實際上是訪問Webserver的HTTP服務。這個過程對於人來說,就是在PC浏覽器裡輸入了Webserver的IP地址或域名,這個行為在PC的應用層面將觸發本地的HTTP進程產生一些數據,我們把這些數據稱為DATA,它是HTTP的有效荷載:

2)數通的最終任務是,要幫助PC把這個HTTP的有效荷載傳遞到Webserver上的HTTP進程中。這是一個看起來簡單的任務,但是實際上,這份數據卻要翻山越嶺。PC的應用層將這份HTTP的有效荷載交給“傳輸層”(我們這裡忽略TCP三次握手等內容),傳輸層會為應用層下來的這份數據封裝上一個報文頭部,由HTTP是基於TCP的應用,因此這裡壓上的是TCP的頭部,在這個頭部之中,有目的端口號80,這個端口號將在數據到達Webserver後告訴對端,我要訪問你啥服務。當然,為了讓這份數據能夠可靠的被傳輸,TCP頭部裡還有其他重要的內容,這裡暫不贅述。

3)好了,HTTP的荷載被封裝上了TCP的頭,為了讓這份數據能夠在IP網絡中進行傳輸,我們還需要一個“信封”,於是數據到了PC的“因特網層”,在這一層,數據被封裝上了一個IP報文頭部,在IP包頭中,寫入了源和目的IP地址,源IP地址為PC的IP:192.168.1.1,而目的IP地址是WebServer的IP:192.168.2.1。IP包頭中的另一個重要的字段是協議號,這裡寫入的值為6,這個值對應著IP頭後面封裝的協議,也就是TCP。好了,有了IP頭這個信封,我們這份數據,就能夠在IP網絡中被從源傳遞到目的地:

4)然而光有信封還是不夠的,至少,我們要把這個信件一段鏈路一段鏈路的搬運過去,而不能一下就從源直接穿越到目的地去吧,也不是天朝的穿越劇不是?那咋辦,我們還需要一個數據鏈路層的頭部,由於這裡是以太網的環境、以太網的鏈路,因此上層下來的數據,又被封裝上了一個以太網幀頭,這是為了使得PC能夠將這份數據傳遞到同在鏈路上的網關R1(的F0/0口)。由於PC設置的網關地址為192.168.1.254,也就是R1的F0/0口IP地址,因此,當訪問Webserver 192.168.2.1這個非本地網絡的IP時,PC要求助於它的網關,因此再數據鏈路層面上,PC要數據傳遞到網關,它將封裝上去的以太網頭部中寫入源MAC也就是自己的MAC:00DD.F800.0001,同時寫入目的MAC也就是路由器R1的F0/0口的MAC:000.AAAA.0001,當然如果此刻PC沒有網關IP對應的MAC,那麼它會發送ARP消息去請求。

以太網幀頭中還有一個重要的字段,是類型字段,類型字段用於描述我這個以太網的幀頭後面被封裝的是什麼報文,這裡寫入的值是0x0800,表示後面是一個IP報文:紅茶三杯

5)費了好大的勁兒,層層加料,終於,這份數據最終做好了傳輸的准備,從PC傳輸到了同在鏈路上的R1,距離目的地又更近了一點,當然,在數據在傳輸過程中,是不可能像我們圖畫的這麼文藝的,它應該是一些電氣化的信息,例如1010101神馬的,不鳥他了,反正是這一坨東西是傳到了R1:

6)R1的F0/0口收到了這份東西,先把它還原成數據幀,查看幀頭,發現目的MAC地址正是自己F0/0口的MAC地址,高興壞了,以為是誰寫給自己的情書呢,於是結合查看類型字段,發現是0800,於是知道上層被封裝的是一個IP包,它將以太網幀頭剝去,將裡頭的IP報文交上去給IP協議棧處理:

7)接下去是R1的因特網層的工作了,他收到下層傳遞夠來的IP包,查看IP包的目的IP地址,發現目的地是192.168.2.1,我艹,原來不是給我的是給別人的,沒辦法,R1拿著這個地址去自己的地圖--路由表中去查找,發現有個目的地192.168.2.0/24的網絡,出口是自己的FA1/0口,下一跳地址是192.168.12.2也就是R2:

8)發現數據包目的IP地址不是自己的R1,找到將數據送到目的地的路徑,是交給離目的地更近的192.168.12.2,而為了將數據交給同在鏈路上的192.168.12.2,又得將數據重新封裝上以太網的幀頭,這次幀頭中的源MAC填寫的是R1的FA1/0口的MAC地址,而目的MAC寫的是R2的F0/0口的MAC地址:

9)妥妥兒的,數據又被R1傳遞給了R2:

10)R2收到這個數據後,同樣的是先還原成數據幀,然後查看幀頭,結果發現目的MAC是自己的MAC,也挺高興,將數據幀丟給上層的IP協議去處理:紅茶三杯(http://weibo.com/vinsoney)原創技術博文,版權歸作者所有,轉載請注

11)結果一樣的,丫一看IP頭中的目的IP地址,擦類又不是給自己的,咦,為什麼要說又字?不管了,反正不是給自己的就對了:

12)於是查路由表,發現目的IP地址192.168.2.1就是在自己FA1/0口直連的網絡192.168.2.0/24中的一個IP地址,好辦了,緣來是家門口的人啊。於是它將數據再封裝上以太網幀頭,源MAC是自己Fa1/0口的MAC地址,目的MAC是Webserver的MAC,如果沒有Webserver的192.168.2.1對應的MAC,同樣的,還是發送ARP消息去請求:

13)數據有上路了,傳遞給了Webserver

14)說好的宏觀分析的,說著說著有變成微觀的了。Webserver收到這個數據幀後,查看幀頭,目的MAC是自己的網卡MAC,而且類型字段為0800:

15)於是將這個幀頭拆開,將裡頭的IP報文交給IP協議去處理。接著IP協議分析這個IP包,查看包頭中的目的IP地址,發現正是自己的網卡IP相同,又發現IP頭中的協議號是6,說明這IP頭裡包裹著的是一個TCP的報文:

16)知道IP頭後面包裹的是一個TCP報文後,它將IP頭剝去,將裡頭的TCP包拿出來,發現TCP頭部中目的端口號是80,這是一個well-known眾所周知的端口號:

17)80端口號對應的服務是HTTP。PC發現,自己的80端口正好是打開的,HTTP服務正在工作,於是將TCP頭部摘掉,露出了裡頭的有效荷載,哎,終於……小姑娘終於又出來了,最終被交給了HTTP服務。這樣,一份數據最終就被傳遞到了目的地的目的應用中。當然,這一過程中我們依然省略了大量的細節。值得注意的是數據通信的過程是雙向的,因此PC發送數據到了WebServer,為了讓服務交互能夠正常進行,數據還會回程,因此實際上還有一個數據返程的過程這裡我們就不再分析了,原理大同小異。


Copyright © Linux教程網 All Rights Reserved