本文主要来自于linux自带的man packet手冊:

http://man7.org/linux/man-pages/man7/packet.7.html

平时常常使用的INET套接字提供的是7层的抓包能力,抓上来的data直接就是tcp或者udp的payload,无需关心L3和L4的头部信息。

Packet套接字提供的是L2的抓包能力,也叫raw socket,意思就是不经过操作系统tcp/ip协议栈处理的packet,抓上来的包须要自己处理tcp/ip的头部信息。

眼下使用packet套接字的主要有libpcap,netsniff-ng,hostapd(hostapd是一个用户层的无线AP管理程序)。

linux提供了的packet 套接字函数API例如以下:

       #include <sys/socket.h>
#include <netpacket/packet.h>
#include <net/ethernet.h> /* the L2 protocols */ packet_socket = socket(AF_PACKET, int socket_type, int protocol);

socket_type有SOCK_RAW 和 SOCK_DGRAM,这两个的主要差别是2层的头部处理。

假设指定SOCK_RAW, 那么我们得到的数据包括全部的L2 header和payload,

假设指定SOCK_DGRAM, 那么我们收到的数据会去掉L2的header,是IP header和payload。

二层的头部信息会放到一个通用的struct sockaddr_ll结构体中。

protocol主要是<linux/if_ether.h>中定义的协议类型,我们能够指定ETH_P_IP来抓取IP  packet,ETH_P_ARP 来抓取ARP的packet,普通情况下我们能够指定ETH_P_ALL来抓取全部类  型的packet。

注意:传入參数的时候应该转化成网络字节序htons(ETH_P_ALL)。

sockaddr_ll结构体用来表似乎一个设备独立的物理层地址信息,定义例如以下:

struct sockaddr_ll {
unsigned short sll_family; /* Always AF_PACKET */
unsigned short sll_protocol; /* Physical layer protocol */
int sll_ifindex; /* Interface number */
unsigned short sll_hatype; /* ARP hardware type */
unsigned char sll_pkttype; /* Packet type */
unsigned char sll_halen; /* Length of address */
unsigned char sll_addr[8]; /* Physical layer address */
};

每一个域的定义例如以下:

sll_family:  总是AF_PACKET

ssll_protocol: <linux/if_ether.h>中定义的那些协议类型,也就是我们传给socket的第二个參    数,注意是网络序。

sll_ifindex: 内核中网卡的index,定义在ifreq结构体中,能够參考以下的链接:

http://man7.org/linux/man-pages/man7/netdevice.7.html

if_nametoindex()函数提供了从网卡名到index的转换,后面的演示样例代码中会用到这个函数。如

果man找不到这个函数使用方法,那么须要安装 manpages-posix-dev 。

sll_hatype: ARP硬件类型,在头文件<linux/if_arp.h>中定义,比方ARPHRD_ETHER表示

10Mbps 的Ethernet网卡类型。内核使用ARPHDR_XXX来表示网卡类型。

sll_pkttype: 表示当前接收的数据包的类型,主要有以下几种合法的值:

       PACKET_HOST 发送给当前主机的包,
PACKET_BROADCAST 广播数据包,
PACKET_MULTICAST 多播数据包
PACKET_OTHERHOST 因为网卡设置了混杂模式收到的发送给别的主机的包
PACKET_OUTGOING 从本机发出的,不小心loopback到当前socket了
这些类型仅仅有接收的时候才有意义。

sll_halen: 表示当前mac地址的长度

sll_addr: 存储当前的mac地址

发送数据包的时候仅仅要设置以下几个域就足够了:

sll_family, sll_addr, sll_halen, sll_ifindex. 其余的都应该设置为0

sll_hatype 和 sll_pkttype在接收数据包的时候会被设置为当前数据包的信息。

对于bind()函数来说,仅仅有sll_protocol 和 sll_ifindex会被用到。

本文兴许系列packet socket 选项以及mmap相关都在个人的独立blog上:

www.hiyoufu.com

欢迎訪问!

linux Packet socket (1)简单介绍的更多相关文章

  1. Linux 内核开发—内核简单介绍

    内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态 ...

  2. socket通信简单介绍

    “一切皆Socket!” 话虽些许夸张,可是事实也是,如今的网络编程差点儿都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通信,如我们每天打开浏 ...

  3. linux视频学习(简单介绍)20160405

    看一周学会linux系统的学习笔记. 1.linux系统是一个安全性高的开源,免费的多用户多任务的操作系统. 2.linux工作分为linux系统管理员,linux程序员(PC上软件开发,嵌入式开发) ...

  4. Linux C Socket TCP编程介绍及实例

    转自:https://blog.csdn.net/lell3538/article/details/53335231 { printf("向服务器发送数据:%s\n",sendbu ...

  5. linux文件系统的权限简单介绍

    linux系统下,文件的权限是这样表示的: - --- --- --- 一共用10位的二进制进行表示,其中 位置 0 :  - :文件        d :目录剩下的9个位置:位置1-3 当前用户(应 ...

  6. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

  7. Linux命令之---which简单介绍

    命令简介 which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果.也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的 ...

  8. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  9. Linux curl使用简单介绍

    在两台新搬迁的微信服务器上执行命令: curl -H "Content-Type: application/json" -d '{"partner_no":&q ...

随机推荐

  1. Base64加密解密原理以及代码实现

    1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符.    2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字 ...

  2. IIS使用 URL Rewrite Module 2.0组件 设置伪静态的方法

    简体中文版WIn10无法安装,需要改注册表, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp  MajorVersion 项,这个也是 dword 值 10 ...

  3. jconsole 连接 eclipse启动项

    eclipse 启动java项目默认情况下不开启jmx远程观看,假设需要看看内存使用情况对项目执行的线程等信息,能eclipse添加启动参数: -Dcom.sun.management.jmxremo ...

  4. LeetCode Solutions : Reorder List

    →-→Ln-1→Ln, reorder it to: L→Ln-2→- You must do this in-place without altering the nodes' values. Fo ...

  5. Twitter 新一代流处理工具——Heron 该纸币Storm Limitations

    Twitter 新一代流处理工具--Heron 该纸币Storm Limitations (空格分隔): Streaming-Processing Storm Problems scalability ...

  6. POJ 3691 DNA repair 基于AC自己主动机DP

    dp[i][j] 它表示的长度 i 下游前缀 j 更改节点的最小数量. 很清楚dp[0][0] = 0; dp[ i ][ j ] = min(dp[ i ][ j ],dp[i-1][k] + (j ...

  7. 【高德地图API】从头德国高中生JS API(三)覆盖物——大喊|折线|多边形|信息表|聚合marker|点蚀图|照片覆盖

    覆盖物,是一张地图的灵魂.有覆盖物的地图.才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具).最重要最必不可少的就是覆盖物了.覆盖物有多种.包含.标注.折线.多 ...

  8. URL压缩算法的短地址

    时下,短网址应用已经在全国各大微博上開始流行了起来.比如QQ微博的url.cn,新郎的t.cn等. 我们在新浪微博上公布网址的时候.微博会自己主动判别网址.并将其转换,比如:http://t.cn/h ...

  9. NUnit3 Test Adapter vs2015

    NUnit的安装 前言:NUnit是什么? NUnit 是一个单元测试框架,专门针对于.NET来写的.NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NE ...

  10. HDU--3829--Cat VS Dog【最大点独立集】

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些 ...