緬懷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位址規範的時候沒有限制資料...