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

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



proto_ops 結(jié)構(gòu)由地址族類型和一系列指向與特定地址族對應(yīng)的socket操作例程的指針組成 。pops 向量通過地址族標識符來索引,如Internet地址族標識符(AF_INET是2) 。





圖 10.3: Linux BSD Socket 數(shù)據(jù)結(jié)構(gòu)


10.4INET Socket 層
INET socket層支持包括TCP/IP協(xié)議在內(nèi)的internet地址族 。如前所述,這些協(xié)議是分層的,一個協(xié)議使用另一個協(xié)議的服務(wù) 。Linux的TCP/IP代碼和數(shù)據(jù)結(jié)構(gòu)反映了這一分層模型 。它與BSD socket層的接口要通過一系列Internet地址族socket操作,這一操作是在網(wǎng)絡(luò)初始化時就已經(jīng)注冊到BSD socket層的 。這些都與其它已注冊的地址族一起保存在 pops 向量中 。BSD socket層從已注冊的INET proto_ops 數(shù)據(jù)結(jié)構(gòu)中調(diào)用INET層 socket支持例程來為它執(zhí)行工作 。例如,一個地址族為INET的BSD socket建立請求,將用到下層的INET socket的建立函數(shù) 。在這些操作中,BSD socket層把用來描述BSD socket的 socket 結(jié)構(gòu)傳構(gòu)到INET層 。為了不把BSD socket 與TCP/IP的特定信息搞混,INET socket層使用它自己的數(shù)據(jù)結(jié)構(gòu),sock,它與BSD socket 結(jié)構(gòu)相連 。這一聯(lián)接關(guān)系可以從圖10.3 中看出 。它用BSD socket的 data 指針來連接 sock 結(jié)構(gòu)與BSD socket結(jié)構(gòu) 。這意味著后來的INET socket調(diào)用能夠很容易地重新找到 sock 結(jié)構(gòu) 。sock 結(jié)構(gòu)的協(xié)議操作指針也在初始化時建立,它依賴與被請求的協(xié)議 。如果請求的是TCP,那么 sock 結(jié)構(gòu)的協(xié)議操作指針將指向TCP連接所必需的TCP協(xié)議操作集 。


10.4.1建立BSD socket
系統(tǒng)建立一個新的socket時,通過標識符來確定它的地址族,socket類型和協(xié)議 。

首先,從 pops 向量中搜索與被請求的地址族相匹配的地址族 。它可能是一個作為核心模塊來實現(xiàn)的一個特定的地址族,這樣,在其能繼續(xù)工作前,kerneld 守護進程必須加載這一模塊 。分配一個新的 socket 結(jié)構(gòu)來代表BSD socket 。實際上 socket 結(jié)構(gòu)是 VFS inode 結(jié)構(gòu)的一部分,分配一個socket實際上就是分配一個 VFS inode。除非你認為socket操作能和普通的文件操作一樣,否則會覺得這好象很奇怪 。所有的文件用VFS inode結(jié)構(gòu)來表示,為了支持文件操作,BSD socket必須也用 VFS inode 來表示 。

最新建立的 BSD socket 結(jié)構(gòu)包含一個指向地址族特定socket例程的指針,可以用來從 pops 向量中找到 proto_ops 結(jié)構(gòu) 。它的類型被設(shè)置成被請求的socket類型:SOCK_STREAM,SOCK_DGRAM等等之一 。調(diào)用地址族特定創(chuàng)建例程使用保存在 proto_ops 結(jié)構(gòu)中的地址 。

從當前過程 fd 向量中分配一個自由的文件描述符,對 file 結(jié)構(gòu)所指向的進行初始化 。包括將文件操作指針設(shè)置為指向由BSD socket接口支持的BSD socket文件操作集 。任何操作將被引到socket接口,通過調(diào)用它的地址族操作例程將它們傳到支持的地址族 。

10.4.2將地址與INET BSD socket綁定
為了能監(jiān)聽輸入的internet連接請求,每個服務(wù)器必須建立一個INET BSD socket,并將地址與其綁定 。綁定操作主要在INET socket層內(nèi)處理,下面的TCP和UDP協(xié)議層提供一些支持 。與一個地址綁定了的socket不能用來進行任何其它的通訊工作,也就是說:socket的狀態(tài)必須是 TCP_CLOSE。sockaddr 結(jié)構(gòu)包含了與一個任意的端口號綁定的IP地址 。通常綁定的IP地址已經(jīng)分配給了一個網(wǎng)絡(luò)設(shè)備,該設(shè)備支持INET地址族且其接口是可用的 。可以在系統(tǒng)中用ifconfig命令來查看哪一個網(wǎng)絡(luò)接口是當前激活的 。IP地址也可以是廣播地址,全1或全0 。這是些特定的地址,用以表示發(fā)送給任何人3 。如果機器充當一個透明的代理或防火墻,則IP地址可被指定為任一個IP地址,但只有有超級用戶權(quán)限的進程能綁定到任何一個IP地址 。綁定的IP地址被存在sock結(jié)構(gòu)中的 recv_addr 和 saddr 字段 。端口號是可選的,如果沒有指定,將任意指定一個 。按慣例,小于1024的端口號不能被沒有超級用戶權(quán)限的進程使用 。如果下層網(wǎng)絡(luò)沒有分配端口號,則分配一個大于1024的端口號 。

推薦閱讀