bsd socket

bsd socket

bsd socket,是UNIX系統中通用的網路介面,它不僅支持各種不同的網路類型,而且也是一種內部進程之間的通信機制。

目錄

正文


兩個通信進程都用一個套介面來描述通信鏈路的兩端。套介面可以認為是一種特殊的管道,但和管道不同的是,套介面對於可以容納的數據的大小沒有限制。
Linux支持多種類型的套介面,也叫做套介面定址族,這是因為每種類型的套介面都有自己的定址方法。Linux支持以下的套介面類型:
UNIX UNIX域套介面
INET Internet地址族TCP/IP協議支持通信。
AX25 Amateur radio X25
IPX Novell IPX
APPLE TALK Appletalk DDP
X25 X25
這些類型的套介面代表各種不同的連接服務。
Linux的BSD套介面支持下面的幾種套介面類型:
1、流式(stream)
這些套介面提供了可靠的雙向順序數據流連接。它們可以保證數據傳輸中的完整性、正確性和單一性。I N E T定址族中的T C P協議支持這種類型的套介面。
2、數據報(Datagram)
這種類型的套介面也可以像流式套介面一樣提供雙向的數據傳輸,但它們不能保證傳輸的數據一定能夠到達目的節點。即使數據能夠到達,也無法保證數據以正確的順序到達以及數據的單一性、正確性。UDP協議支持這種類型的套介面。
3、原始(Raw)
這種類型的套介面允許進程直接存取下層的協議。
4、可靠遞送消息(Reliable Delivered Messages)
這種套介面和數據報套介面一樣,只能保證數據的到達。
5、順序數據包(Sequenced Packets)
這種套介面和流式套介面相同,除了數據包的大小是固定的。
6、數據包(Packet)
這不是標準的BSD 套介面類型,而是Linux 中的一種擴展。它允許進程直接存取設備層的數據包。
利用套介面進行通信的進程使用的是客戶機/伺服器模式。伺服器用來提供服務,而客戶機可以使用伺服器提供的服務,就像一個提供w e b頁服務的We b伺服器和一個讀取並瀏覽web頁的瀏覽器。伺服器首先創建一個套介面,然後給它指定一個名字。名字的形式取決於套介面的地址族,事實上也就是伺服器的當地地址。系統使用數據結構sockaddr來指定套介面的名字和地址。一個INET 套介面可以包括一個I P埠地址。你可以在/etc/services中查看已經註冊的埠號,例如,一個web頁面伺服器的埠號是80。在伺服器指定套介面的地址以後,它將監聽和此地址有關的連接請求。請求的發起者,也就是客戶機,將會創建一個套介面,然後再創建連接請求,並指定伺服器的目的地址。對於一個INET 套介面來說,伺服器的地址就是它的I P地址和埠號。這些連接請求必須通過各種協議層,然後等待伺服器的監聽套介面。一旦伺服器接收到了連接請求,它將接受或者拒絕這個請求。如果伺服器接受了連接請求,它將創建一個新的套介面。一旦伺服器使用一個套介面來監聽連接請求,它就不能使用同樣的套介面來支持連接。當連接建立起來以後,連接的兩端都可以發送和接收數據。最後,當不再需要此連接時,可以關閉此連接。
使用BSD套介面的確切含義在於套介面所使用的地址族。設置一個TCP/IP連接就和設置一個業餘無線電X.25連接有很大的不同。和VFS一樣,Linux從BSD 套介面協議層中抽象出了套介面界面,此界面負責和各種不同的應用程序之間進行通信。內核初始化時,內核中的各個不同的地址族將會在BSD 套介面界面中登記。稍後當應用程序創建和使用BSD 套介面時,就將會在BSD 套介面和它支持的地址族之間建立一個連接。此連接是通過交叉關聯的數據結構和地址族表建立的。例如,當一個應用程序創建一個新的套介面時,將產生一個可以被BSD 套介面使用的與特定的地址族有關的套介面創建子過程。
設置系統內核時,一系列的地址族和協議將會保存在協議向量中。每一個協議都由它的名
字代表,例如, I N E T和其初始化進程的地址。當系統啟動並初始化套介面界面時,將會調用每一個協議的初始化進程。對於套介面地址族來說,這意味著它們註冊的一系列有關協議操作。
這是一系列的子程序,每一個都執行一個和特定的地址族有關的操作。已經註冊的和協議相關的操作保存在pops向量中,而此向量由一系列指向數據結構proto_ops的指針組成。
數據結構proto_ops包括地址族的類型以及指向與特定地址族有關的套介面操作程序的指
針。Pops向量用地址族標識符作為索引。