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

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




10.3BSD Socket 接口
這是一個(gè)通用的接口,它不僅支持各種網(wǎng)絡(luò)工作形式,而且還是一個(gè)交互式通訊機(jī)制 。一個(gè)套接字描述一個(gè)通訊連接的一端,兩個(gè)通訊程序中各自有一個(gè)套接字來描述它們自己那一端 。套接字可以被看成一個(gè)專門的管道,但又不象管道,套接字對(duì)它們能容納的數(shù)據(jù)量沒有限制 。Linux支持多種類型的套接字 。這是因?yàn)槊恳活愋偷奶捉幼钟兴约旱耐ㄐ艑ぶ贩椒?。Linux支持下列套接字地址族或域:

UNIXUnix 域套接字
INETInternet地址族支持通過TCP/IP協(xié)議的通信
AX25Amateur radio X25
IPXNovell IPX
APPLETALKAppletalk DDP
X25X25


有一些套接字類型支持面向連接的服務(wù)類型 。并非所有的地址族能支持所有的服務(wù)類型 。Linux BSD 套接字支持下列套接字類型:


Stream
這些套接字提供可靠的雙工順序數(shù)據(jù)流,能保證傳送過程中數(shù)據(jù)不丟失,不被弄混和復(fù)制 。Internet地址中的TCP協(xié)議支持流套接字 。
Datagram
這些套接字提供雙工數(shù)據(jù)傳送,但與流套接字不同,這里不保證信息的到達(dá) 。即使它們到達(dá)了,也不能保其到達(dá)的順序,甚至不能保證被復(fù)制和弄混 。這類套接字由Internet地址族中的UDP協(xié)議支持 。
Raw
允許直接處理下層協(xié)議(所以叫“Raw”) 。例如,有可能打開一個(gè)raw套接字到以太網(wǎng)設(shè)備,看 raw IP數(shù)據(jù)傳輸 。
Reliable Delivered Messages
與數(shù)據(jù)報(bào)很象,但它能保證數(shù)據(jù)的到達(dá) 。
Sequenced Packets
與流套接字相似,但的數(shù)據(jù)包大小是固定的 。
Packet
這不是一個(gè)標(biāo)準(zhǔn)的BSD套接字類型,而是一個(gè)Linux特定的擴(kuò)展,它允許在設(shè)備級(jí)上直接處理包 。
客戶服務(wù)器模式下使用套接字進(jìn)行通信 。服務(wù)器提供一種服務(wù),客戶使用這種服務(wù) 。Web服務(wù)器就是一個(gè)例子,它提供網(wǎng)頁,而客戶端,或者說瀏覽器,來讀這些網(wǎng)頁 。服務(wù)器要使用套接字,首先要建立套接字并將它與一個(gè)名稱綁定 。名稱的格式由套接字的地址族來定,是服務(wù)器的本地有效地址 。套接字的名稱或地址用結(jié)構(gòu)sockaddr來指定 。一個(gè)INET套接字還與一個(gè)端口地址綁定 。已注冊(cè)的端口號(hào)可在 /etc/services 中找到;例如,Web服務(wù)的端口號(hào)是80 。將套接字與地址綁定以后,服務(wù)器不可以監(jiān)聽指定的綁定了的地址上的引入連接請(qǐng)求 。請(qǐng)求的發(fā)起者,客戶端,建立一個(gè)套接字并通過它來發(fā)出一個(gè)連接請(qǐng)求到指定的目標(biāo)服務(wù)器地址 。對(duì)于一個(gè)INET套接字,服務(wù)器地址是它的IP地址和它的端口號(hào) 。這些引入請(qǐng)求必須通過各種協(xié)議層找到目的地址,然后等待服務(wù)器的監(jiān)聽套接字 。服務(wù)器收到引入請(qǐng)求后可以接收或拒絕它 。如果決定接收,服務(wù)器必需建立一個(gè)新一套接字來接收請(qǐng)求 。當(dāng)一個(gè)套接字被用來監(jiān)聽引入連接請(qǐng)求時(shí),它就不能用來支持連接了 。連接建立后兩端就可以自由地發(fā)送和接收數(shù)據(jù)了 。最后,當(dāng)不再需要連接時(shí),就將之關(guān)閉 。要注意保證在傳輸過程正確處理數(shù)據(jù)包 。

對(duì)BSD socket進(jìn)行準(zhǔn)確操作要依賴于它下面的地址族 。設(shè)置TCP/IP連接與設(shè)置amateur radio X.25連接有很大不同 。象虛擬文件系統(tǒng)一樣,Linux從BSD socket層抽象出socket接口,應(yīng)用程序和BSD socket由每個(gè)地址族的特定軟件來支持 。內(nèi)核初始化時(shí),地址族被置入內(nèi)核中并將自己注冊(cè)到BSD socket接口 。之后,當(dāng)應(yīng)用程序建立用使用BDS sockets時(shí),在BSD socket與它支持的地址族之間將產(chǎn)生一個(gè)聯(lián)接 。這一聯(lián)接是由交叉鏈接數(shù)據(jù)結(jié)構(gòu)和地址族表特定支持程序產(chǎn)生 。例如,每當(dāng)應(yīng)用程序建立一個(gè)新的socket,就會(huì)有一個(gè)BSD socket接口用的地址族特定 socket建立程序 。

構(gòu)造內(nèi)核時(shí),一些地址族和協(xié)議被置入 protocols 向量 。每個(gè)由它的名稱來表征,例如,“INET”和它的初始程序地址 。當(dāng)套接口啟動(dòng)時(shí)被初始化時(shí),要調(diào)用每一協(xié)議和初始程序 。對(duì)socket地址族來說,這會(huì)導(dǎo)致它們注冊(cè)一套協(xié)議操作 。這是一套例程,其中的每一例程執(zhí)行一個(gè)特定的針對(duì)那一地址族的操作 。已注冊(cè)的協(xié)議操作被存在 pops 向量,一個(gè)指向 proto_ops 數(shù)據(jù)結(jié)構(gòu)的向量中 。

推薦閱讀