詳細(xì)了解Linux內(nèi)核網(wǎng)絡(luò)協(xié)議棧socket、sock、sk_buff,etc(含內(nèi)核源碼)
通過前面的分析,可以發(fā)現(xiàn),網(wǎng)絡(luò)協(xié)議棧中的數(shù)據(jù)處理,都是基于各類結(jié)構(gòu)體,所有有關(guān)于網(wǎng)絡(luò)棧中數(shù)據(jù)包的狀態(tài),地址,端口等信息都封裝在對應(yīng)的結(jié)構(gòu)中,可以說,了解這些數(shù)據(jù)結(jié)構(gòu)是理解網(wǎng)絡(luò)棧源碼的基礎(chǔ),這里我們就來了解下網(wǎng)絡(luò)協(xié)議棧中的各類數(shù)據(jù)結(jié)構(gòu)。
1、socket
(include\linux\Socket.h)該結(jié)構(gòu)體socket 主要使用在BSD socket 層,是最上層的結(jié)構(gòu),在INET socket 層面也會有涉及,但很少。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!??!前100名進(jìn)群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?

2、sock
(include\linux\Net.h) sock 使用范圍比socket 要大得多,sock結(jié)構(gòu)的使用基本貫穿硬件層、設(shè)備接口層、ip層、INET socket 層,而且是作為各層之間的一個聯(lián)系,主要是因?yàn)闊o論是發(fā)送還是接收的數(shù)據(jù)包都要被緩存到sock 結(jié)構(gòu)中的緩沖隊(duì)列中。sock 結(jié)構(gòu)與其對應(yīng)的 socket 會相互綁定。
3、sk_buff
(include\linux\Skbuff.h) sk_buff 是網(wǎng)絡(luò)數(shù)據(jù)包在內(nèi)核中的表現(xiàn)形式,通過源碼可以看出,數(shù)據(jù)包在內(nèi)核協(xié)議棧中是通過這個數(shù)據(jù)結(jié)構(gòu)來變現(xiàn)的。
從其中的 union 字段可以看出,該結(jié)構(gòu)是貫穿在各個層次的,可以說這個結(jié)構(gòu)是用來為網(wǎng)絡(luò)數(shù)據(jù)包服務(wù)的。其中的字段表明了數(shù)據(jù)包隸屬的套接字、當(dāng)前所處的協(xié)議層、所搭載的數(shù)據(jù)負(fù)載長度(data指針指向)、源端,目的端地址以及相關(guān)字段等。
最重要的一個字段是 data[0],這是一個指針,它指向?qū)?yīng)層的數(shù)據(jù)報(首部+數(shù)據(jù)負(fù)載)內(nèi)容的首發(fā)地址。怎么解釋呢?
如果在傳輸層,那么data指向的數(shù)據(jù)部分的首地址,其數(shù)據(jù)部分為 TCP 首部 + 有效數(shù)據(jù)負(fù)載。?
如果在網(wǎng)絡(luò)層,data指向的數(shù)據(jù)部分的首地址,其數(shù)據(jù)部分為 IP 首部 + TCP 首部 + 有效數(shù)據(jù)負(fù)載。?
如果在鏈路層,data指向的首地址,其數(shù)據(jù)布局為 MAC 首部 + IP 首部 + TCP 首部 + 有效數(shù)據(jù)負(fù)載。?
所以在該skb_buff結(jié)構(gòu)傳遞時,獲取某一層的首部,都是通過拷貝 data 指向地址對應(yīng)首部大小的數(shù)據(jù)。
4、device
include\linux\Netdevice.h)該結(jié)構(gòu)表明了一個網(wǎng)絡(luò)設(shè)備需要的字段信息。
5、tcp 首部格式
6、ip 首部格式
7、以太網(wǎng)幀幀頭格式
8、ARP報文報頭
