本文以簡化的網絡架構為例,詳細介紹了當你在瀏覽器中輸入網址(例如www.google.com)并按下回車鍵后,TCP段的完整傳輸過程。我們將探討DNS解析、ARP、TCP/IP封裝、PAT和路由如何協同工作,將數據從個人電腦通過局域網和廣域網發送到谷歌的服務器。需要注意的是,本文為了便于學習,展示的是一個基礎案例,而實際應用中的網絡實現往往更為復雜。
1. DNS解析:將域名轉換為IP地址
當你輸入www.google.com這樣的域名時,瀏覽器首先需要將其解析為IP地址才能發起通信,步驟如下:
- 系統會檢查本地DNS緩存,包括/etc/hosts文件或操作系統緩存。
- 如果在本地緩存中未找到對應記錄,就會向電腦中配置的DNS服務器(通常由互聯網服務提供商或路由器提供)發送DNS查詢請求。
- DNS服務器會返回對應的IP地址(例如142.250.190.132)。
- 此時,瀏覽器已準備好與目標IP地址建立TCP連接。
2. 準備建立TCP連接
在發送數據包之前,系統需要做一些準備工作:
- 源IP地址:網卡的IP地址。
- 目的IP地址:從DNS服務器獲取到的IP地址。
- 源MAC地址:網卡的MAC地址。
- 目的MAC地址:
- 如果目標設備與本機在同一子網,可通過ARP協議獲取其MAC地址。
- 如果目標設備在不同子網(通常情況如此),數據包必須經過默認網關轉發,因此需要獲取網關的MAC地址。
系統如何獲取網關的MAC地址:通過ARP(地址解析協議)
- 利用子網掩碼判斷目標設備是否在子網外。
- 如果是,發送ARP廣播:“誰擁有192.168.1.1這個IP地址?”
- 網關會回復其MAC地址。
- 個人電腦會將該MAC地址緩存起來,以便后續進行幀封裝。
3. 數據封裝:四層協議棧
- 應用層(HTTP消息):
- 例如,GET / HTTP/1.1請求。
- 傳輸層(TCP段):
- 添加源端口和目的端口(例如,40000 → 443,443是HTTPS的默認端口),源端口是操作系統分配的動態端口(1024-65535,例如40000)。
- 必要時對數據進行分段。
- 網絡層(IP數據包):
- 添加源IP地址和目的IP地址。
- 其他字段:TTL(生存時間)、校驗和等。
- 數據鏈路層(以太網幀):
- 添加源MAC地址和目的MAC地址。
- 包含一個帶有FCS(幀校驗序列)的尾部,用于錯誤檢查。
最后,完整的以太網幀會被發送到局域網交換機。
4. 通過交換機發送到網關(第二層)
交換機維護著一張MAC地址表。例如:00:1A:2B:3C:4D:5E → Gi0/1, VLAN 10,表示擁有該MAC地址的設備連接在Gi0/1端口。
- 當交換機從某個端口接收到幀時,會檢查源MAC地址與該端口的映射關系是否存在于表中。如果不存在,就將該映射添加到表中。
- 交換機檢查網關的目的MAC地址是否存在于表中。
- 如果不存在,交換機就會將幀從除源端口之外的所有端口發送出去。網關收到廣播幀后,會回復其MAC地址(例如00:1A:2B:3C:4D:5E)。交換機隨后會將這個MAC地址與端口的映射記錄到表中,這樣后續發往網關的幀就可以直接轉發(不再需要廣播)。
5. 網關執行PAT(端口地址轉換)
如果個人電腦使用私有IP地址,邊緣路由器(PAT設備)必須進行地址轉換:
- 源IP地址:從私有IP地址(例如192.168.1.100)轉換為路由器的公網IP地址(例如203.0.113.10)。
- 源端口:替換為臨時的公網端口(例如50000)。
- PAT表條目:192.168.1.100:8080 → 203.0.113.10:50000。
之后,路由器會將修改后的IP數據包轉發到廣域網。
6. 廣域網中的路由器:尋找最短路徑
路由表的構建方式有兩種:手動配置(靜態路由)或通過動態路由協議自動生成(例如,用于內部網絡的OSPF協議、用于互聯網服務提供商之間通信的BGP協議)。這些協議通過交換路徑信息來找到最佳路由。每臺廣域網路由器都維護著一個路由表數據庫,該數據庫將目的IP網絡映射到:
- “下一跳”路由器(路徑中的下一臺路由器)。
- 出接口(用于發送數據包的物理端口)。
- 度量值(例如跳數、帶寬、延遲),用于確定“最佳”路徑。
路由決策過程:
- 檢查IP頭部:TTL、校驗和等。
- 最長前綴匹配:將目的IP地址與最具體的網絡進行匹配。
- 選擇最佳路徑:基于成本最低的度量值。
- 更新頭部:
- 遞減TTL值。
- 將目的MAC地址替換為下一跳路由器的MAC地址。
- 轉發到下一跳路由器。
這個過程會逐跳重復,直到數據包到達目標所在的本地互聯網服務提供商。
7. 最終交付與解封裝
最后一臺路由器確定該數據包屬于某個直接連接的局域網段:
- 它將幀轉發到交換機或直接轉發到服務器。
- 服務器接收到幀后開始解封裝:
- 數據鏈路層 → 網絡層 → TCP段 → HTTP消息。
- 該消息最終由應用程序(例如Nginx或Apache等Web服務器)處理。
8. 服務器如何響應
服務器的響應遵循與請求相同的封裝過程,但源IP地址、目的IP地址以及源端口、目的端口是反向的(例如,源IP地址:谷歌服務器的IP地址;目的IP地址:經過PAT轉換后的個人電腦私有IP地址)。
- 服務器生成響應并發送回去。
- 在第一臺路由器(PAT網關)處,利用PAT表進行映射:203.0.113.10:50000 → 192.168.1.100:8080。
- 路由器相應地重寫IP地址和端口字段,并將數據包轉發回個人電腦。