摘要
- 網絡模型
- 網絡協議棧
- 網絡包接收流程
- 網絡包發送流程
網絡模型
網絡模型按照標準有幾類劃分?
- OSI模型
- TCP/IP模型
OSI模型的劃分層次?
- 應用層:負責給應用程序提供統一的接口
- 表示層:負責把數據轉換成兼容另一個系統能識別的格式
- 會話層:負責建立、管理和終止表示層實體之間的通信會話
- 傳輸層:負責端到端的數據傳輸
- 網絡層:負責數據的路由、轉發、分片
- 數據鏈路層:負責數據的封幀和差錯檢測,以及mac尋址
- 物理層:負責在物理鏈路中傳輸數據幀
為什么出現了TCP/IP模型?
OSI模型過于復雜,只是概念理論上的分層,沒有具體的實現方案。
TCP/IP模型的分層?
- 應用層:負責向用戶提供一組應用程序,比如HTTP、DNS、FTP等
- 傳輸層:負責端到端的數據傳輸,比如TCP、UDP等
- 網絡層:負責網路包封裝、分片、路由、轉發,比如IP、ICMP等
- 網絡接口層:負責網絡包在物理網絡中的傳輸,比如網絡包的封幀、MAC尋址、差錯檢測以及通過網卡傳輸網絡幀等
OSI模型和TCP/IP模型的層次對應關系如下圖:
網絡協議棧
網絡通信的主機間必須要遵從一定的網絡協議。我們的網絡包每經過一層,都會被當前層進行一定的包裝,當到達目的主機時,也會進行拆包裝操作。
每一層給數據包做了哪些包裝?
- 傳輸層:在數據包前面增加了TCP頭
- 網絡層:在傳輸層數據包的基礎上增加了IP頭
- 網絡接口層:在網絡層數據包的基礎上增加了幀頭幀尾
物理鏈路中的最大傳輸大小是?
在以太網中規定,最大傳輸單元(MTU)是1500字節,即網絡層IP包的最大值。當IP數據包超過MTU時,就需要在網絡層對其進行分片傳輸。
linux中網絡協議棧大體組成
- 應用程序需要通過系統調用,來跟Socket層交互
- Socket層的下面就是傳輸層、網絡層和網絡接口層
- 最下面的一層則是網卡驅動程序和網卡硬件設備
網絡包接收
主機中網絡包的門神是?
網卡,專門負責接收和發送網絡包,網卡接收到一個網絡包以后,會通過DMA技術,將網絡包放入到Ring Buffer(環形緩沖區)。
操作系統是如何判斷一個網絡包到達?
- 中斷:如果網絡包過多,CPU會被頻繁中斷,影響系統效率
- NAPI機制
NAPI機制是什么?
混合中斷和輪詢的方式來接收網絡包,核心就是首先采用中斷喚醒數據接收的服務程序,然后通過poll方法來輪詢數據。
網絡包到達時,網卡發起硬件中斷,執行網卡驅動程序中的中斷處理函數,中斷處理函數完成以后需要暫時屏蔽中斷,然后通過喚醒軟中斷來輪詢處理數據,直到沒有新數據時才恢復中斷,這樣一次中斷可以處理若干個網絡包。
軟中斷如何處理網絡包?
- 從Ring Buffer中拷貝數據到內核緩沖區中,從而把網絡包交給網絡協議棧處理
- 網絡包首先進入網絡接口層,在這一層會檢查報文的合法性,如果不合法則丟棄,合法則會找出該網絡包的上層協議類型,比如是IPv4還是IPv6,接著去掉幀頭幀尾,交給網絡層
- 在網絡層,會取出IP包,判斷網絡包下一步走向,比如交給上層處理還是轉發出去。當確認這個網絡包是要發送給本機以后,就會從IP頭分析上一層的協議是TCP還是UDP,接著去掉IP頭,然后交給傳輸層。
- 傳輸層會取出TCP頭或UDP頭,根據四元組(源IP、源端口、目的IP、目的端口)作為標識,找出對應的Socket,并把數據拷貝到Socket的接收緩沖區
- 最后,應用層程序調用Sokcet接口,從內核的Socket接收緩沖區讀取新的數據到應用層。
網絡包的發送
發送流程和接收流程相反。
網絡層在給數據包增加IP頭時,會通過查詢路由表確認下一跳的IP,并按照MTU進行分片。
分片后的網絡包,在到達網絡接口層后,會通過ARP協議獲取下一跳的MAC地址,然后增加幀頭幀尾,放到發包隊列中。
一切準備好以后,會觸發軟中斷告訴網卡驅動程序需要發送網絡包,驅動程序通過DMA從發包隊列中讀取網絡包,將其放到網卡的隊列中,隨后網卡將網絡包發出去。