日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--11.網(wǎng)絡(luò)( 六 )



無論何時(shí),一個(gè)激活的監(jiān)聽socket接收一個(gè)連入的TCP連接請(qǐng)求,TCP都要建立一個(gè)新的 sock 結(jié)構(gòu)來描述它 。最終接收時(shí),這個(gè) sock 結(jié)構(gòu)將成為TCP連接的底層 。它也復(fù)制包含連接請(qǐng)求的 sk_buff,并將它放到監(jiān)聽 sock 結(jié)構(gòu)的 receive_queue 中排隊(duì) 。復(fù)制的 sk_buff 包含一個(gè)指向新建立的 sock 結(jié)構(gòu)的指針 。

10.4.5接收連接請(qǐng)求
UDP不支持連接的概念,接收INET socket連接請(qǐng)求只適用于TCP協(xié)議,一個(gè)監(jiān)聽socket接收操作從原始的監(jiān)聽socket中復(fù)制新的socket結(jié)構(gòu) 。接收操作透過支持的協(xié)議層,本例是INET,來接收任何連入連接請(qǐng)求 。如果下層協(xié)議,如UDP,不支持連接,INET協(xié)議層接收操作將失敗 。否則接收操作透過真實(shí)協(xié)議層,本例是TCP 。接收操作可以是阻塞或非阻塞 。在非阻塞情況下,如果沒有連入連接可接收,則接收操作失敗,新建的socket 結(jié)構(gòu)被廢棄 。在阻塞情況下,網(wǎng)絡(luò)應(yīng)用程序執(zhí)行接收操作將加上一個(gè)等待隊(duì)列并將之掛起,直到接收到TCP連接請(qǐng)求 。當(dāng)接收一個(gè)連接請(qǐng)求后,包含請(qǐng)求的 sk_buff 被廢棄,并且 sock 數(shù)據(jù)結(jié)構(gòu)返回到INET socket層,在那與一個(gè)新的更早建立的socket結(jié)構(gòu)連接 。新socket文件描述符(fd)號(hào)返回給網(wǎng)絡(luò)應(yīng)用程序,然后,應(yīng)用程序就能在socket操作中將這一文件描述符用于新建立的INET BSD socket 。

10.5IP層
10.5.1Socket 緩存
每一層協(xié)議用另外層提供的服務(wù),這樣使用多層網(wǎng)絡(luò)協(xié)議會(huì)有一個(gè)問題:每個(gè)協(xié)議都要在傳送數(shù)據(jù)時(shí)都要 加上協(xié)議頭和協(xié)議尾,而數(shù)據(jù)到達(dá)時(shí)又要將之去掉 。這樣,在不同的協(xié)議間要有數(shù)據(jù)緩存,每一層需要知道特 定協(xié)議的頭和尾放在哪個(gè)位置 。一個(gè)解決辦法就是在每一層中都拷貝緩存,但這樣做效率就很低 。Linux用 socket緩存或者說 sk_buffs 來在協(xié)議層與網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)之間交換數(shù)據(jù) 。sk_buffs 包括指針和字段長(zhǎng)度,這樣每 個(gè)協(xié)議層就可以通過標(biāo)準(zhǔn)的函數(shù)或“方法”來操作應(yīng)用程序數(shù)據(jù) 。





圖 10.4: Socket 緩存 (sk_buff)

圖10.4 顯示了 sk_buff 數(shù)據(jù)結(jié)構(gòu);每個(gè) sk_buff 有一個(gè)數(shù)據(jù)塊與之相連 。sk_buff 有四個(gè)指針,這些指針 用來操作和管理socket緩存的數(shù)據(jù):

head
指向內(nèi)存中數(shù)據(jù)區(qū)的開頭 。這一指針在 sk_buff 和其相關(guān)的數(shù)據(jù)塊分配時(shí)就固定了 。
data
指向當(dāng)前協(xié)議數(shù)據(jù)的開頭 。這一指針是隨當(dāng)前擁有 sk_buff 的是哪個(gè)協(xié)議層而變化的 。
tail
指向當(dāng)前協(xié)議數(shù)據(jù)的結(jié)尾 。同樣,這一指針也是隨當(dāng)前擁有 sk_buff 的是哪個(gè)協(xié)議層而變化的 。
end
指向內(nèi)存中數(shù)據(jù)區(qū)的結(jié)尾 。這一指針在 sk_buff 和其相關(guān)的數(shù)據(jù)塊分配時(shí)固定 。
 len 和 truesize 這兩個(gè)字段分別用來描述當(dāng)前協(xié)議包長(zhǎng)度和數(shù)據(jù)緩存總體長(zhǎng)度 。sk_buff 處理代碼提供標(biāo)準(zhǔn)的操作來向應(yīng)用程序增加和移除協(xié)議頭和協(xié)議尾 。這就可以安全地操作 sk_buff 中的 data , tail 和 len 字段 。

push
它把 data 指針指向數(shù)據(jù)區(qū)的開始并增加 len。用于在要傳輸?shù)臄?shù)據(jù)開始處增加協(xié)議頭 。

pull
它把 data 指針從數(shù)據(jù)區(qū)的開始處移到數(shù)據(jù)區(qū)的結(jié)尾處,并減小 len。用于在已接收的數(shù)據(jù)開始處移除協(xié)議頭 。

put
它把 tail 指針指向數(shù)據(jù)區(qū)的結(jié)尾處,并增加 len。用于在要傳輸?shù)臄?shù)據(jù)結(jié)尾處增加數(shù)據(jù)或協(xié)議信息 。

trim
它把 tail 指針指向數(shù)據(jù)區(qū)的開始處,并減小 len。用于在已接收的數(shù)據(jù)尾移除數(shù)據(jù)或協(xié)議信息 。

sk_buff 結(jié)構(gòu)還包含了用于一些指針,用于在處理過程中存入 sk_buff 的雙連接環(huán)路列表 。通用sk_buff例 程可以將 sk_buff 加入到這些列表的前面或后面,也可以刪除它們 。

推薦閱讀