1. 程式人生 > >鏈路層原始套接字程式設計-總結

鏈路層原始套接字程式設計-總結

1、鏈路層原始套接字建立方法:socket(PF_PACKET, SOCK_RAW, htons(protocol)),其中protocal引數為關心的協議型別。
2、預設情況下網絡卡只處理目的地址是本機網絡卡地址的包,可通過設定混雜模式,使網絡卡將收到的所有包(包括組播和廣播)都轉發給作業系統。程式碼如下:
    struct ifreq    ifr;
    strcpy(ifr.ifr_name, if_name);
    ioctl(fd, SIOCGIFFLAGS, &ifr);
    ifr.ifr_flags |= IFF_PROMISC;
    ioctl(fd, SIOCSIFFLAGS, &ifr);
3、對於多網絡卡系統,作業系統在收包時不區分是從哪個網絡卡收到的,統一轉發給使用者程序socket,特別的,當用戶程序建立了原始套接字socket,那麼作業系統在轉發訊息時,將從網絡卡收到的buf複製給所有的、關心的原始套接字(原因是作業系統不知道怎麼區分不同的原始套接字的包)。
4、可通過bind函式將建立的原始套接字繫結到指定的addr,addr的實際型別為struct sockaddr_ll,繫結時需要設定sll_family,sll_protocol,sll_ifindex這幾個引數。其中,sll_ifindex為指定的介面名稱的索引,可通過ioctl函式獲取ioctl(fd, SIOCGIFINDEX, &ifr);
  int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  struct sockaddr_ll{
    unsigned short int sll_family;
    unsigned short int sll_protocol;
    int sll_ifindex;
    unsigned short int sll_hatype;
    unsigned char sll_pkttype;
    unsigned char sll_halen;
    unsigned char sll_addr[8];
  };
5、sendto函式在傳送鏈路層資料時,需要自己組織buf內容,包括乙太網頭和協議內容。其中dest_addr引數必須設定,與應用層sendto函式指定目的地址不同,鏈路層傳送時需要指定將buf從本機的哪個網絡卡傳送出去。同樣,實際型別為struct sockaddr_ll,只需要設定sll_ifindex引數即可。
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
6、recvfrom函式在接收資料時,如果本機的任意一個網絡卡設定了混雜模式,那麼這個函式都能收到鏈路層包,除非sockfd採用bind函式綁定了網絡卡。如果繫結的網絡卡設定了混雜模式,則只能收到發往本網絡卡包(包括組播包和廣播包等)。其中,src_addr為傳送包的源地址。
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
7、應用層socket通過(源IP、源埠、目的IP、目的埠)四元組來確定socket對應的程序,作業系統在轉發包時能夠確定唯一的程序ID;而原始套接字socket沒有埠的概念,所以只能通過(源IP、目的IP)或(源MAC、目的MAC)二元組來區分不同的程序。ping程式通過在協議欄位裡新增程序ID來區分;而Y1731協議裡沒有設定這個欄位的地方。

相關推薦

原始程式設計-總結

1、鏈路層原始套接字建立方法:socket(PF_PACKET, SOCK_RAW, htons(protocol)),其中protocal引數為關心的協議型別。 2、預設情況下網絡卡只處理目的地址是本機網絡卡地址的包,可通過設定混雜模式,使網絡卡將收到的所有包(包括組播和

原始程式設計-客戶端

#include <stdio.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #

Linux網路程式設計——原始程式設計

原始套接字的建立 int socket ( int family, int type, int protocol ); 引數: family:協議族 這裡寫 PF_PACKET type:  套接字類,這裡寫 SOCK_RAW protocol:協議類別,指定可以接收或傳送的資料包型別,不能寫

《Unix網路程式設計》卷1:聯網API(第3版):簡介、傳輸程式設計

全書共31章+附錄。 計劃安排:吃透這本書,一天三章+原始碼,並實測程式碼做當天筆記,CSDN見。時間安排:計劃時間1.5個月 == 6個週末 == 12天。 2017.08.05    第01-03章:TCP/IP簡介、傳輸層、套接字程式設計簡介2017.08.06  

linux sock_raw原始程式設計 (轉)和Linux下Libpcap原始碼分析和包過濾機制

sock_raw原始套接字程式設計可以接收到本機網絡卡上的資料幀或者資料包,對與監聽網路的流量和分析是很有作用的.一共可以有3種方式建立這種 socket 1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROT

原始程式設計介面

1.建立套接字 原始套接字可以用socket函式來建立,但第二個引數為SOCK_RAW,第三個引數protocol有使用者設定,可以使用WinSock2.h中定義的字首為IPPROTO_XXX的長值。另外,使用者也可以選擇一個頭檔案中沒有定義的數值,直接在socket函式中

原始學習總結

raw socket(原始套接字)工作原理與規則 原始套接字是一個特殊的套接字型別,它的建立方式跟TCP/UDP建立方法幾乎是 一摸一樣,例如,通過        int sockfd;        sockfd = socktet(AF_INET, SOCK_RAW,

原始-TCP/IP下三數據顯示

pf_packet printf linu 0.11 pes span close double ddr 1 #include <stdio.h> 2 #include <errno.h> 3 #include <unistd.

網路程式設計——原始實現原理

目錄 1. 基礎知識  1.1、概述 1.2、鏈路層原始套接字  1.3、網路層原始套接字 2、原始套接字的實現 2.1  原始套接字報文收發流程 2.2鏈路層原始套接字的實現     2.2.1  套接字建

Windows網路程式設計(七):原始開發

在呼叫socket()函式時,如果將第二個引數填為SOCK_RAW,代表建立的是原始套接字型別,第三個引數可以選擇IPPROTO_ICMP、IPPROTO_TCP、IPPROTO和IPPROTO_RAW。 #include <winsock2.h> #pragma co

Linux網路程式設計——原始例項:MAC 頭部報文分析

通過《Linux網路程式設計——原始套接字程式設計》得知,我們可以通過原始套接字以及 recvfrom( ) 可以獲取鏈路層的資料包,那我們接收的鏈路層資料包到底長什麼樣的呢? MAC 頭部(有線區域網) 注意:CRC、PAD 在組包時可以忽略 鏈路層資料包的其中一

Linux 網路程式設計——原始例項:MAC 地址掃描器

如果 A (192.168.1.1 )向 B (192.168.1.2 )傳送一個數據包,那麼需要的條件有 ip、port、使用的協議(TCP/UDP)之外還需要 MAC 地址,因為在乙太網資料包中 MAC 地址是必須要有的。那麼怎樣才能知道對方的 MAC 地址?答案是:它通

Linux 網路程式設計——原始例項:傳送 UDP 資料包

乙太網(Ethernet)報文格式(MAC頭部報文格式): IP 報文格式: UDP 報文格式: 校驗和函式: /******************************************************* 功能:     

我的Python成長之--Day31-基於TCP和UDP的程式設計

在介紹這兩種套接字程式設計之前,我們需要掌握iso七層協議中傳輸層中的和TCP有關的知識點, 三次握手和四次揮手: 首先傳輸層的由來: 網路層的ip幫我們區分子網,乙太網層的mac幫我們找到主機,然後大家使用的都是應用程式,你的電腦上可能同時開啟QQ、暴風影音等多個應用程

Linux下的raw Socket(原始程式設計

前言 簡介 最近專案需要用到rawSocket來進行自定義IP報文的源地址。 windows從winxp sp2開始便對raw socket進行了限制。 【1】只能傳送UDP包 【2】只能傳送正確的UDP包 【3】不能冒充源地址,即,源地址只能填本機地址。

Linux網路程式設計原始-ping協議實現

1.概述 PING協議是用來檢驗本地主機與遠端主機是否連線,傳送的是ICMP ECHO_REQUEST包。普通的套接字是基於TCP或者是UDP的,無法傳送ICMP包,所以必須用原始套接字來實現。PING協議的客戶端型別值為8,程式碼值為0,表示請求。而PING協議的響應端型別值為0,程式碼值也為

Linux 網路程式設計原始

1. 介紹 前面主要介紹了流式套接字(SOCK_STREAM),資料報套接字(SOCK_DGRAM),基本上能夠滿足TCP與UDP的應用。但一些問題,我們仍然無法解決,如: (1)傳送一個自定義的IP包 (2)傳送ICMP包 (3)偵聽網路上的資料包 (4)偽裝IP地址 (5

Linux網路程式設計原始的魔力【上】

原文:http://blog.chinaunix.net/uid-23069658-id-3280895.html 基於原始套接字程式設計        在開發面向連線的TCP和麵向無連線的UDP程式時,我們所關心的核心問題在於資料收發層面,資料的傳輸特性由TCP或UDP來

網絡駭客初級之原始(SOCK_RAW)

原始套接字 駭客 網絡駭客初級之原始套接字(SOCK_RAW)本文用實際程序完成了MAC數據包分析,網絡數據分析,MAC地址掃描器和飛秋欺騙在這裏我把原來的入門改成了初級,因為對於原始套接字的操作確實在普通的TCP,UDP之上TCP和UDP確實涵蓋了普通的網絡應用程序,但請註意“普通”二字,要成為一名

socket程式設計 程式設計 (純理論,以後補一下實現程式碼)

基本概念   套接字——應用層和傳輸層之間,提供應用傳輸介面 Web/RPC/中介軟體——應用層之上的網路開發 應用程式設計介面API(application programming interface) 套接字介面(socket interface)簡稱套接字,