歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux協議棧pf_packet相關分析

一:名詞解釋:

1,BSD socket層:

bsd socket是Berkeley套接字應用程序接口(API)包括了一個用C語言寫成的應用程序開發庫,主要用於實現進程間通訊,在計算機網絡通訊方面被廣泛使用。

Berkeley套接字接口的定義在幾個頭文件中。這些文件的名字和內容與具體的實現之間有些許的不同。 大體上包括:
<sys/socket.h><netinet/in.h><sys/un.h><arpa/inet.h><netdb.h>

這個列表是一個Berkeley套接字API庫提供的函數或者方法的概要:
socket() 創建一個新的確定類型的套接字,類型用一個整型數值標識,並為它分配系統資源。
bind() 一般用於服務器端,將一個套接字與一個套接字地址結構相關聯,比如,一個指定的本地端口和IP地址。
listen() 用於服務器端,使一個綁定的TCP套接字進入監聽狀態。
connect() 用於客戶端,為一個套接字分配一個自由的本地端口號。 如果是TCP套接字的話,它會試圖獲得一個新的TCP連接。
accept() 用於服務器端。 它接受一個從遠端客戶端發出的創建一個新的TCP連接的接入請求,創建一個新的套接字,與該連接相應的套接字地址相關聯。
send()和recv(),或者write()和read(),或者recvfrom()和sendto(), 用於往/從遠程套接字發送和接受數據。
close() 用於系統釋放分配給一個套接字的資源。 如果是TCP,連接會被中斷。
gethostbyname()和gethostbyaddr() 用於解析主機名和地址.
select() 用於修整有如下情況的套接字列表: 准備讀,准備寫或者是有錯誤。


poll() 用於檢查套接字的狀態。 套接字可以被測試,看是否可以寫入、讀取或是有錯誤。
getsockopt() 用於查詢指定的套接字一個特定的套接字選項的當前值。
setsockopt() 用於為指定的套接字設定一個特定的套接字選項。

http://zh.wikipedia.org/wiki/Berkeley套接字

2,協議棧 Protocol Stack

協議族是一組協議的集合, 協議棧是協議的實現,指網絡中各層協議的總和(有順序的一組協議), 協議棧的工作原理類似於棧,遵守FIFO的原則。其形象的反映了一個網絡中文件傳輸的過程:由上層協議到底層協議,再由底層協議到上層協議。使用最廣泛的是英特網協 議棧,由上到下的協議分別是:應用層(HTTP,TELNET,DNS,EMAIL等),運輸層(TCP,UDP),網絡層(IP),鏈路層(WI- FI,以太網,令牌環,FDDI等),物理層.

TCP/IP也稱”國際協議簇”, 即不僅指 TCP/IP協議本身,而且包括與其有關的協議。 TCP為傳輸控制協議,IP為網際協議,是網絡層最重要的協議。采用TCP/IP協議通過互聯網傳送信息可減少網絡中的傳輸阻塞,方便大批量的數據在網上 傳輸,從而提高網絡的傳輸效率。 TCP/IP協議族中包括上百個互為關聯的協議,其中有:Telnet(Remote Login):提供遠程登錄功能; FTP (FileTransfer Protocol):遠程文件傳輸協議,允許用戶將遠程主機上的文件拷貝到自己的計算機上; SMTP (Simple Messagetransfer Protocol):簡單信息傳輸協議,主要用於傳輸電子郵件;NFS(Network File Server):網絡文件服務器,可使多台計算機透明地訪問彼此的目錄 ; UDP ( User DatagramProtocol):用戶數據包協議。

3,INET socket層

BSD socket向用戶提供了一個一致性的網絡編程接口,他的底層是INET PF_UNIX PF_IPX PF_PACKET PF_INET6 等協議棧。INET socket層是其中的IPv4網絡協議的接口,相當於建立了AF_INET形式的socket,該層使用sock結構保存接口上額外的參數,主要的文件有net/ipv4/protocol.c、net/ipv4/af_inet.c和net/core/sock.c。

socket層支持包括TCP/IP協議在內的Internet協議族,一個協議使用另一個協議的服務。它與BSD socket層的接口要通過一系列Internet協議簇,socket操作,這一操作是在網絡初始化時就已經注冊到BSD socket層的。BSD socket層從已注冊的INET proto_ops數據結構中調用INET層socket支持例程來為它執行工作。例如,一個地址族為INET的BSD socket建立請求,將用到下層的INET socket的建立函數。。在這些操作中,BSD socket層把用來描述BSD socket的socket 結構傳構到INET層。為了不把BSD socket與TCP/IP的特定信息搞混,INET socket層使用它自己的數據結構 --sock,它與BSD socket結構相連。這意味著後來的INET socket調用能夠很容易地重新找到sock結構。sock結構的協議操作指針(sock->sk_prot)也在初始化時建立,它依賴與被請求的協議。如果請求的是TCP,那麼sock結構的協議操作指針將指向TCP連接所必需的TCP協議操作集。proto_ops(socket->ops)結構由地址族類型和一系列指向與特定地址族對應的socket操作例程的函數指針組成。

推斷:bsd socket層封裝了操作inet socket層的函數,inet socket層可以替換成其他協議層,比如pf_packet

4,TCP/UDP層,IP層;

實現傳輸層和網絡層的操作,TCP/UDP層使用inet_protocol和proto結構,主要文件有

net/ipv4/udp.c、net/ipv4/datagram.c、net/ipv4/tcp_input.c和net/ipv4/tcp_out.c。ip層使用packet_type結構表示,主要文件包括net/ipv4文件夾下的ip_forward.c,ip_fragment.c,ip_input.c,ip_output.c。

5,驅動硬件接口層:

實現網絡層操作,該層使用net_device結構表示,主要的文件包括net/core/dev.c和driver/net目錄下的所有文件。使用PPP,SLIP,Eethernet協議。

6,總結

本文要使用的Linux Net/4網絡源代碼的,其中大部分位於目錄/usr/src/linux-2.x/net,列表如下, 插口層 BSD Socket /net/socket.c /net/protocols.c INET Socket /ipv4/protocol.c /ipv4/af_inet.c /net/ipv4/core/sock.c 協議層 TCP/UDP /net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_timer.c etc... IP /net/ipv4/ip_forward.c /net/ipv4/ip_fragment.c /net/ipv4/ip_input.c /net/ipv4/ip_output.c 接口層 net/core/dev.c driver/net Ethernet
Copyright © Linux教程網 All Rights Reserved