Linux 資料鏈路訪問

2021-06-16 05:12:40 字數 2501 閱讀 2662

緬懷stevens大師。

1.師從網際網路。

2.linux man 命令:man   netlink,man rtnetlink。

3.unp v1第29章 。

原始套介面使得我們可以讀寫核心不處理的ip資料報,而對資料鏈路層訪問則把這種能力進一步擴大——讀寫任何型別的資料鏈路幀,而不僅僅是ip資料報。

訪問資料鏈路提供如下兩種能力:

1.監視由資料鏈路層接收的分組。

2.讓某些程式作為普通的應用程序而不是核心的一部分執行,這對於減小核心大小是非常有益的。

建立資料鏈路socket需要root許可權!

可以使用兩種方法建立資料鏈路socket描述符

int sockfd=socket(af_inet, sock_raw, ipproto_***);

方法二:傳送接收乙太網資料幀有兩種方法:

sock_type引數的值:

sock_dgram:表示扣除鏈路層頭部的「煮熟」分組(cooked)。

sock_raw:表示「未煮」的完整的鏈路層分組——乙太網幀(raw)。

可以將這個套介面設定為混雜模式(promiscuous mode),如下:

int sockfd=socket(pf_packet,sock_raw,htons(eth_p_ip));

struct ifreq ifr;

struct packet_mreq mreq;

bzero(&ifr,sizeof(ifr));//初始化ifr

strcpy(ifr.ifr_name,"eth0");//這裡的「eth0」可以換成其他裝置的名字

if(ioctl(sockfd,siocgifindex,&ifr)<0)//得到裝置對應的索引

perror("ioctl siocgifindex:");            

mreq.mr_type=packet_mr_promisc;//混雜模式

mreq.mr_ifindex=ifr.ifr_ifindex;//設定套介面將要投入的混雜模式的裝置索引號

mreq.mr_alen=0;

mreq.mr_address[0]='/0';

if(setsockopt(sockfd, sol_packet, packet_add_membership, &mreq, sizeof(mreq)) < 0)

perror("setsockopt");

exit(0);

舊方法:int sockfd=socket(af_inet,sock_packet,eth_protocol);//unpv1中:這個方法可用面廣,但缺乏靈活性。只返回乙太網幀。

同樣也可將舊方法建立socket投入到混雜模式:

int sockfd=socket(pf_packet,sock_raw,htons(eth_p_ip));

struct ifreq ifr;

bzero(&ifr,sizeof(ifr));

strcpy(ifr.ifr_name,"eth0");

if(ioctl(sockfd,siocgifflags,&ifr)<0);

struct sock_fprog ;

struct sock_fprog filter;

這裡對filter初始化;

setsockopt(sockfd, sol_socket, so_attach_filter, &filter, sizeof(filter));//安裝過濾器

setsockopt(sockfd, sol_socket, so_detach_filter, null, 0);//解除安裝過濾器。若之前close了sockfd過濾器將自動解除安裝!!

關於這so_attach_filter、so_detach_filter:man 7 socket中指出:

bugs:

the  config_filter socket options so_attach_filter and so_detach_filter are not documented.  the suggested inte***ce to use  them  is  via  the  libpcap library。

struct sockaddr_ll addr;//linux/if_packet.h

bzero(&addr, sizeof(addr));

addr.sll_family   = pf_packet;

addr.sll_protocol = htons(eth_p_all);

addr.sll_ifindex  = ifr.ifr_ifindex;//此值獲取方法,見上面。

if( bind(sockfd, (struct sockaddr*) &addr, sizeof(addr))<0)

perror("bind error:");

libnet/libnids庫函式介紹:

linux下libnet程式設計:

libpcap函式庫詳細介紹:

資料鏈路協議

鏈路就是一條無源的從點到點的物理線路段,中間沒有任何其他的交換節點。在進行通訊時,兩台計算機的通訊通路是由多條鏈路串接而成的。當需要在一條鏈路上通訊時,除了需要物理鏈路,還需要一些規程來控制這些資料的傳輸,把實現這些規程的硬體和軟體加到鏈路上,就構成了資料鏈路 差錯控制自動請求重發又可以稱為後向糾錯...

資料鏈路相關技術

mac位址是用來識別資料鏈路中相互連線的節點。大多數裝置都是根據ieee802.3規範使用mac位址。第3 24位 有ieee管理的廠商識別碼,每個廠商都有自己唯一的識別碼。第25 48位 廠商管理的產品識別碼,每個網絡卡都有自己唯一的識別碼。ieee802.3在指定mac位址規範的時候沒有限制資料...

資料鏈路相關技術

mac位址是用來識別資料鏈路中相互連線的節點。大多數裝置都是根據ieee802.3規範使用mac位址。第3 24位 有ieee管理的廠商識別碼,每個廠商都有自己唯一的識別碼。第25 48位 廠商管理的產品識別碼,每個網絡卡都有自己唯一的識別碼。ieee802.3在指定mac位址規範的時候沒有限制資料...