當(dāng)前位置 主頁(yè) > 技術(shù)大全 >
國(guó)際標(biāo)準(zhǔn)化組織(ISO)制定了開(kāi)放式系統(tǒng)互聯(lián)通信參考模型(OSI模型),該模型分為七層,包括應(yīng)用層、表示層、會(huì)話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層和物理層
然而,由于OSI模型過(guò)于復(fù)雜,實(shí)際應(yīng)用中更常用的是TCP/IP模型,它簡(jiǎn)化為四層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層
Linux系統(tǒng)正是基于TCP/IP模型來(lái)實(shí)現(xiàn)其網(wǎng)絡(luò)協(xié)議棧的
一、TCP/IP模型概述 1.應(yīng)用層:提供用戶所需的各種服務(wù),如HTTP、DNS、FTP等
2.傳輸層:提供端到端的通信功能,確保數(shù)據(jù)包的順序傳送及數(shù)據(jù)的完整性
主要協(xié)議有TCP和UDP
3.網(wǎng)絡(luò)層:解決主機(jī)到主機(jī)的通信問(wèn)題,負(fù)責(zé)數(shù)據(jù)包的路由、轉(zhuǎn)發(fā)和分片
主要協(xié)議有IP、ICMP等
4.網(wǎng)絡(luò)接口層:負(fù)責(zé)數(shù)據(jù)在主機(jī)和網(wǎng)絡(luò)之間的交換,具體協(xié)議由參與互連的各網(wǎng)絡(luò)自行定義
二、Linux網(wǎng)絡(luò)協(xié)議棧 Linux網(wǎng)絡(luò)協(xié)議棧類似于TCP/IP的四層結(jié)構(gòu)
數(shù)據(jù)包的發(fā)送和接收都遵循這一結(jié)構(gòu),從用戶態(tài)的應(yīng)用程序到內(nèi)核態(tài)的網(wǎng)絡(luò)協(xié)議棧,再到硬件網(wǎng)卡,每一層都有其特定的職責(zé)和處理流程
三、Linux鏈路層發(fā)包流程 在Linux系統(tǒng)中,網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送是一個(gè)復(fù)雜但有序的過(guò)程,涉及多個(gè)層次和組件的協(xié)同工作
以下是詳細(xì)的發(fā)送流程: 1.應(yīng)用程序調(diào)用Socket接口 發(fā)送過(guò)程始于應(yīng)用程序調(diào)用Socket接口發(fā)送數(shù)據(jù)包的請(qǐng)求
這是一個(gè)系統(tǒng)調(diào)用,會(huì)從用戶態(tài)陷入到內(nèi)核態(tài)的套接字層
2.數(shù)據(jù)拷貝到內(nèi)核態(tài)sk_buff 套接字層會(huì)申請(qǐng)一個(gè)內(nèi)核態(tài)的sk_buff內(nèi)存,將用戶待發(fā)送的數(shù)據(jù)拷貝到sk_buff內(nèi)存,并將其加入到Socket發(fā)送緩沖區(qū)等待網(wǎng)絡(luò)協(xié)議棧的處理
3.協(xié)議棧逐層處理 網(wǎng)絡(luò)協(xié)議棧從Socket發(fā)送緩沖區(qū)中取出數(shù)據(jù)包,然后按照TCP/IP協(xié)議棧的分層(傳輸層、網(wǎng)絡(luò)層、網(wǎng)絡(luò)接口層),從上到下逐層進(jìn)行處理
-傳輸層:在傳輸層,會(huì)為數(shù)據(jù)包添加TCP頭(如果使用TCP協(xié)議),同時(shí)拷貝一個(gè)新的sk_buff副本
這是因?yàn)閟k_buff在到達(dá)網(wǎng)卡發(fā)送完成的時(shí)候會(huì)被釋放掉,而TCP協(xié)議支持重傳,為確保網(wǎng)絡(luò)包可靠傳輸,在收到對(duì)方的ACK之前,這個(gè)sk_buff不能被刪除
-網(wǎng)絡(luò)層:在網(wǎng)絡(luò)層,主要工作包括選取路由(確認(rèn)下一跳的IP)、填充IP頭、netfilter過(guò)濾、對(duì)超過(guò)MTU大小的數(shù)據(jù)包進(jìn)行分片
處理完這些工作后會(huì)交給網(wǎng)絡(luò)接口層處理
-網(wǎng)絡(luò)接口層:網(wǎng)絡(luò)接口層會(huì)進(jìn)行物理地址尋址,以找到下一跳的MAC地址,填充幀頭和幀尾,將其放到發(fā)送隊(duì)列中
然后觸發(fā)軟中斷告訴網(wǎng)卡驅(qū)動(dòng)程序:隊(duì)列中有新的網(wǎng)絡(luò)包需要發(fā)送
4.驅(qū)動(dòng)程序通過(guò)DMA發(fā)送數(shù)據(jù) 驅(qū)動(dòng)程序收到通知會(huì)通過(guò)DMA(Direct Memory Access,直接內(nèi)存訪問(wèn)),從發(fā)送包隊(duì)列中讀出網(wǎng)絡(luò)幀,并通過(guò)DMA將數(shù)據(jù)寫入網(wǎng)卡的FIFO(First In First Out,先進(jìn)先出)發(fā)送隊(duì)列
5.網(wǎng)卡設(shè)備發(fā)送數(shù)據(jù)包 網(wǎng)卡設(shè)備從FIFO發(fā)送隊(duì)列中取出數(shù)據(jù)包,將其發(fā)送到網(wǎng)絡(luò)
當(dāng)發(fā)送完成的時(shí)候,網(wǎng)卡設(shè)備會(huì)觸發(fā)一個(gè)硬中斷來(lái)釋放內(nèi)存,主要是釋放sk_buff內(nèi)存和清理RingBuffer內(nèi)存
6.傳輸層釋放sk_buff 最