數據傳輸過程是一個非常復雜的過程,例如數據在轉發的過程中會進行一系列的封裝和解封裝。
數據轉發過程概述
數據可以在同一網絡內或者不同網絡間傳輸,數據轉發過程也分為本地轉發(同網段)和遠程轉發(跨網段),但兩者的數據轉發原理是基本一樣的,都是遵循TCP/IP協議簇。對數據進行一系列的封裝與解封裝的操作。同一網段中封裝的是目的地的MAC,不同網段封裝的是網關MAC。
轉發過程大致如下:
1、TCP數據段封裝
首先當主機建立了到達目的地的TCP連接后,便開始對應用層數據進行TCP封裝。 |
![]() |
|
2. IP數據包封裝
將應用數據完成TCP封裝之后,通過接口將數據傳輸到網絡層進行IP封裝。 |
![]() |
|
查找路由:確認目的IP地址主機A必須要擁有到達目的地的路由。每個主機都會獨自維護各自的路由表項。主機A在發送數據前需要先檢查是否能夠到達目的端,這個過程是通過查找路由來完成的。 在此示例中,主機A擁有一條到達“任何網絡”的路由,它發往其他網絡的數據都會通過IP地址為10.1.1.1的接口轉發到下一跳,即網關10.1.1.254。 |
|
ARP:確認目的MAC接下來的數據幀封裝需要目的MAC地址,所以需要通過ARP協議獲取下一步目的MAC。 |
|
3、以太網封裝——數據鏈路層封裝
在網絡層獲取完相關數據,結束IP封裝之后,通過接口進入數據鏈路層完成以太網封裝(封裝MAC地址)。 |
![]() |
|
4、數據幀的轉發過程
數據在完成數據幀封裝之后,就可以進入物理層進行數據傳輸了。
![]() |
主機A工作在半雙工狀態下,所以會使用CSMA/CD來檢測鏈路是否空閑。如果鏈路空閑,主機A會將一個前導碼(Preamble)和一個幀首定界符(SFD)附加到幀頭然后進行傳輸。
|
![]() |
本例中,
|
5、數據包的轉發過程
![]() |
RTA收到此數據報文后,網絡層會對該報文進行處理。RTA首先根據IP頭部信息中的校驗和字段,檢查IP數據報文頭部的完整性,然后根據目的IP地址查看路由表,確定是否能夠將數據包轉發到目的端。RTA還必須對TTL的值進行處理。另外,報文大小不能超過MTU值。如果報文大小超過MTU值,則報文將被分片。 網絡層處理完成后,報文將被送到數據鏈路層重新進行封裝,成為一個新的數據幀,該幀的頭部會封裝新的源MAC地址和目的MAC地址。如果當前網絡設備不知道下一跳的MAC地址,將會使用ARP來獲得。 |
6、數據幀解封裝
![]() |
該示例中,服務器A處於一個共享以太網中,兩台服務器都會收到RTB發送的數據幀。該幀的目的MAC地址與服務器B的接口MAC地址不匹配,所以會被服務器B丟棄。 服務器A成功收到該幀,並通過FCS校驗。服務器A將利用幀中的類型字段來識別在網絡層處理該數據的協議。該示例中,服務器A會將解封裝后的此數據交給網絡層的IP協議來進行處理。 RTB以服務器A的MAC地址作為目的MAC繼續轉發。服務器A接收到該數據幀后,發現目的MAC為自己的MAC,於是會繼續處理該數據幀。 |
7、數據包解封裝
![]() |
服務器A通過IP協議來處理該報文,首先會通過校驗和字段來驗證報文頭的完整性,然后檢查IP報文頭中的目的IP地址是否與自己當前的IP地址匹配。 如果在源與目的之間的數據傳輸期間數據發生了報文分片,則報文會被目的端重新組合。標識字段用於標識屬於同一數據源的分片報文,偏移量表示該分片在原分組中的相對位置。標志字段目前只有兩位有意義,標志字段最低位為1,表示后面還有分片,為0表示這已經是最后一個數據片;中間一位為1表示不能分片,為0表示允許分片。所有的分片報文必須被目的端全部接收到后才會進行重新組合。 協議字段表示此數據包攜帶的上層數據是哪種協議的數據。需要注意的是,下一個報頭並非總是傳輸層報頭。例如,ICMP報文也是使用IP協議封裝,協議字段值為0x01。 服務器A檢查數據包的目的IP地址,發現目的IP與自己的IP地址相同。則服務器A剝掉數據包的IP頭部后,會送往上層協議TCP繼續進行處理。 |
8、數據段解封裝(TCP解封裝)
![]() |
當IP報文頭被處理完並剝離后,數據段會被發送到傳輸層進行處理。在此示例中,傳輸層協議使用的是TCP,且發送端和接收端已經通過三次握手建立了連接。傳輸層收到該數據段后,TCP協議會查看並處理該數據段頭部信息,其中目的端口號為80,用於表示處理該數據的應用層協議為HTTP協議。 TCP處理完頭部信息后會將此數據段頭部進行剝離,然后將剩下的應用數據發送到HTTP協議進行處理。 |
數據在進行二層和三層封裝之前,主機需要了解哪些信息?
主機在封裝數據包之前,必須要知道目的端IP地址。在封裝數據幀之前,必須要知道去往目的網絡的路由以及下一跳的MAC地址。
當數據幀發送到非目的主機時,非目的主機將會如何處理?
如果主機接收到一個不是發往自己的數據幀,在檢驗幀頭中的目的MAC地址之后會丟棄該幀。
傳輸層如何能夠准確的將數據交給特定應用?
傳輸層會檢查TCP或UDP報文頭中的目的端口號,以此來識別特定應用。
當兩台主機同時訪問服務器的HTTP服務,該服務器如何區分數據屬於哪個會話?
服務器可以只通過源IP地址識別兩台主機的HTTP流量,另外TCP報文頭中包含的源端口也可以被用來區分同一台主機通過不同的瀏覽器發起的不同的會話。例如,兩個來自源IP為10.1.1.1的HTTP流量使用的目的端口號都是80,但源端口號為1028和1035。