以太网数据帧的报尾封装字段是什么_利用TCP/IP模型理解数据通信过程
回顧TCP/IP模型
TCP/IP模型是當今IP網絡的基礎(由OSI七層參考模型發展而來,也稱為DoD模型)。
分層參考模型的設計是非常經典的理念:
- 層次化的模型設計將網絡的通信過程劃分為更小、更簡單的部件,因此有助于各個部件的獨立開發、設計和故障排除;
- 層與層之間相互獨立,又互相依賴,每一層都有該層的功能、以及定義的協議標準。層與層之間相互配合,共同完成數據通信的過程;
- 通過組件的標準化,允許多個供應商進行開發;
- 通過定義在模型的每一層實現什么功能,鼓勵產業的標準化;
- 允許各種類型的網絡硬件和軟件相互通信。
理解數據通信過程
下面我們來分析一下PC去訪問Server的WEB服務的詳細通信過程。在闡述過程中,我們重點放在利用TCP/IP參考模型理解通信過程,因此可能會忽略部分技術細節,例如DNS、TCP三次握手等,這些技術細節這里暫不做討論。事實上,整個過程的宏觀層面如下:
我們一步一步的來分析:
1) PC的用戶在WEB瀏覽器中訪問Server的WEB服務(這里我們暫且不去關注底層的HTTP交互、DNS交互等細節。重點看通信過程),PC的這次操作將觸發HTTP應用為用戶構造一個應用數據。當然這個數據最終要傳遞到Server并最終“遞交”到Server的HTTP應用來處理,但是HTTP不關心數據怎么傳、怎么尋址、怎么做差錯校驗等等,那么這些事情就交由專門的Layer來完成,所以HTTP應用數據還的經過一番“折騰”才能從PC傳出去到達Server,現在開始。
2) 由于HTTP基于TCP,因此這個應用數據交由TCP/IP模型中的主機到主機層進一步處理。在該層,上層HTTP應用數據被封裝上一個TCP的頭部,在TCP頭部中,這里我們重點關注兩個字段,一個是源端口號,另一個是目的端口號,源端口號為隨機,目的端口號為80(HTTP服務對應的默認端口號是80)。然后這個數據segment被交給下一個Layer處理。
3) 到了IP層,IP協議為這個上層下來的數據封裝上一個IP頭,以便該數據能夠在IP網絡中被網絡設備轉發(路由)。IP頭當中,我們重點關注源IP地址、目的IP地址、協議號這三個字段。其中源地址存放的是PC自己的IP地址192.168.1.1,目的地址存放的是Server的IP地址192.168.2.1,而協議號字段則存放的是值6,這個值是一個well-known值,也就是行業約定的、眾所周知的值,該值對應上層協議類型TCP,表示我這個IP頭后面封裝的上層協議為TCP。搞定之后,這個數據被交給下一層處理。
4)為了讓這個IP數據包能夠在鏈路上傳輸,還要給數據包封裝上一個數據鏈路層的頭部,由于我們這里是以太網鏈路,因此上層下來的IP數據包被封裝上一個以太網的數據幀頭。這個數據幀頭中源MAC地址為PC的網卡MAC,那么目的MAC呢?PC知道,數據的目的地是192.168.2.1這個IP,而本機IP是192.168.1.1/24,顯然,目的地與自己并不在同一個網段,因此需要借助自己的網關,讓網關來幫助自己將數據包轉發出去。那么首先我得把數據轉發到網關吧?因此目的MAC地址填寫的就是網關192.168.1.254對應的MAC地址。但是初始情況下,PC可能并沒有192.168.1.254的MAC,所以,它會發送一個ARP廣播去請求192.168.1.254的MAC,R1的GE0/0/0口會收到這個ARP請求并且回送ARP響應。如此一來PC就知道了網關的MAC,它將網關MAC 0018-0011-0001填寫在以太網數據幀頭部的目的MAC中。另外,以太網數據幀頭的類型字段寫上0x0800這個值,表示我這個數據幀頭后面封裝的是一個IP包。好了費了好大勁兒,這個數據幀終于搞定了:
5)值得一提的是,事實上在物理鏈路中傳輸的是bit流,或者電氣化的脈沖,只不過為了方便理解和更加直觀的分析,我們往往會以IP包或者數據幀的形式來闡述通信過程。所以從物理上說,最終這個以太網數據幀變成了一堆的101010101從網線傳到了路由器R1上。
6)路由器R1在收到這一串的1010后,先將他們還原成數據幀。
然后會采用相應的機制檢查一下數據幀在傳輸過程中是否有損壞,如果沒有損壞,那么就瞅瞅數據幀頭部中的目的MAC地址,看看目的MAC地址是不是我收到這個數據幀的GE0/0/0口的MAC,結果發現是,它很高興,覺得這個數據幀是給我的,它查看數據幀頭部的類型字段,發現是0x0800,于是它知道里頭裝的是一個IP包,接著它將以太網數據幀頭剝去或者說解封裝,然后移交給上層IP協議繼續處理。
7)現在R1的IP協議棧接著處理這個報文:
它會先校驗一下數據在傳輸過程中,IP頭有沒有受損,如果沒有,它就查看IP頭中的目的IP地址字段,結果發現目的IP地址為192.168.2.1,發現其實并不是自己的IP地址 – 原來這個數據包是發給別人的,于是它開始拿著目的地址192.168.2.1到地圖(路由表)里去查,看看有沒有到192.168.2.1這個目的地去的路徑,結果發現有,并且這個路由條目指示它把數據包從從GE0/0/1口送出去交給192.168.12.2這個IP。于是它不再繼續拆IP頭看包裹里頭的東東了,而是乖乖的將IP數據包往下交還給以太網協議去處理。
8)現在以太網協議繼續處理上層下來的IP包,它為這個IP包封裝上一個新的以太網幀頭,幀頭中源MAC地址為R1的GE0/0/1口的MAC:0018-0011-0002,目的MAC是這個數據包即將交給的下一跳路由器192.168.12.2對應的MAC,當然初始情況下R1是不知道這個MAC的,因此又是一輪ARP廣播并最終拿到這個MAC:0018-0022-0001,于是它將這個值填寫在目的MAC字段中。完成新的數據幀頭的封裝后,R1把這個數據幀變成1010101通過電氣信號傳遞給R2。
9)R2收到這些10101后,同樣的,還是先成幀,然后查看幀頭,發現目的MAC填寫的就是自己接口的MAC,并且幀頭中類型字段寫的是0x0800(指示上層協議是IP,也就是數據幀頭內封裝的是一個IP包),于是將數據幀頭剝去,將里頭的IP數據包交給IP協議去處理。
10)而IP協議在處理過程中發現,目的IP地址并非本路由器的IP,于是它知道,這個數據包不是發送給自己的,它拿著目的IP地址192.168.2.1在路由表中去查,結果發現,R2的GE0/0/1口就連接著192.168.2.0/24網絡,原來家門口就是了,于是它將這個IP包交還給下層協議去處理。
11)接下來又是重新封裝成幀,R2為這個IP包封裝上一個新的數據幀頭部,幀頭中,源MAC為R2的GE0/0/1口的MAC,目的MAC為192.168.2.1這個IP地址對應的MAC,如果ARP表里有192.168.2.1對應的MAC,則直接將MAC地址寫入目的MAC中,如果沒有,則發ARP去請求。另外類型字段依然填寫0x0800。最終,R2將這個數據幀傳給了Server。
12)好不容易,終于數據幀是到了Server了。Server首先是將101010這些比特流還原成幀,然后做校驗看看幀頭是否損壞,如果沒有,則查看數據幀的目的MAC,結果發現就是自己的MAC,于是查看類型字段,發現是0x0800,于是知道這里頭裝的是一個IP包,于是將幀頭剝去,將內層的IP數據包交給上層協議IP去處理。IP收到這個數據包之后,首先依然是查看IP包頭是否損壞,如果沒有,則查看目的IP地址,發現目的IP地址是192.168.2.1正是自己的網卡IP,于是它知道,這個IP包是發給自己的,因此繼續查看IP包頭中的協議字段,發現協議字段填寫的是6這個值,原來這個IP包頭后面封裝的是一個TCP的數據,因此將IP包頭剝去,將里頭的TCP數據交給上層的TCP協議去處理。而TCP在處理這個數據的時候,查看TCP頭部的目的端口號,發現目的端口號是80,而本地的TCP80端口是開放的,開放給HTTP應用了,接著它將TCP頭部剝去,交給HTTP應用,好了終于從PC發送出來的HTTP應用數據,到達了目的地 –Server的HTTP應用的手中。
總結
以上是生活随笔為你收集整理的以太网数据帧的报尾封装字段是什么_利用TCP/IP模型理解数据通信过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 文件操作的模块_Pytho
- 下一篇: 负数比较大小_小升初总复习第七个基础模块