本文主要来自于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

欢迎訪问!

转载于:https://www.cnblogs.com/mfrbuaa/p/4480380.html

linux Packet socket (1)简单介绍相关推荐

  1. linux packet socket,linux Packet socket (1)简单介绍

    本文主要来自于linux自带的man packet手冊: http://man7.org/linux/man-pages/man7/packet.7.html 平时常常使用的INET套接字提供的是7层 ...

  2. Linux的SOCKET编程 简单演示

    转载:http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源 ...

  3. 简述linux系统引导流程,简单介绍如何用WinGrub 引导Linux系统简述

    以下主要介绍我的第一次安装Linux系统遭遇,以及怎么度过这个遭遇的,希望对大家有所帮助.不喜欢的可以略过. 一.开篇叙述我第一次安装Linux系统和接下来的经历 开篇:按照北南兄弟的<FC4菜 ...

  4. 查看linux vnc用户名,Linux-VNC简单介绍

    Linux-VNC 一.VNC简单介绍: VNC,全称为Virtual NetworkComputing,它是一个桌面共享系统.它的功能,类似于windows中 的远程桌面功能.VNC使用了 RFB( ...

  5. Linux开源沙箱Lisa简单介绍

    Lisa简单介绍 Lisa是一款开源的Linux沙箱,她使用Docker进行部署,通过qemu提供虚拟化能力,目前暂支持arm32/64.x86/x64.mips平台架构. 跳转链接:https:// ...

  6. linux ps le hrtime,Linux 高精度定时器hrtimers简单介绍和应用场景

    hrtimer:high-resolution kernel timers: hrtimers的诞生是由于内核开发者在使用过程中发现,原始的定时器kernel/timers.c,已经可以满足所有场景的 ...

  7. socket通信简单介绍

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

  8. Linux操作系统启动流程简单介绍

    Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程.了解 Linux操作系统的启动过程,对Linux操作系统更深入认识和日常的运维工作非常有帮助,感兴趣的朋友可以了解一 ...

  9. Linux下Socket的简单使用及最简化封装

    /* * 文件功能: linux 下套接字简化操作函数 * 文件名称: linux_socket.h * 建立时间: 2007 年 07 月 19 号 * 创建作者: wlzqi * 使用语言: C ...

最新文章

  1. 《C++ primer》--第1,2章小结
  2. Java异常ClassCastException
  3. 安装docker和docker-compose
  4. java下拉框查询_[Java教程]jQuery实现联动下拉列表查询框
  5. 安卓学习-界面-布局-FrameLayout
  6. Storm【实践系列-如何写一个爬虫】 - ParserBolt
  7. 微软对外开放更多软件技底层代码术文档
  8. vim自己主动缩进配置
  9. 安卓系统怎么安装软件_「软件」怎么在虚拟机里安装系统
  10. 畅销书系列:《引爆点》、《异类》、《从0到1》
  11. android多媒体框架学习 详解
  12. 使用Flask-Migrate进行管理数据库升级
  13. Eureka Server 开启身份验证与客户端注册
  14. android token加密_Android使用token维持登陆状态的方法
  15. 深入浅出Mybatis系列(五)Mybatis事务篇
  16. vue中computer和watch的区别和使用
  17. Codeforces Raif Round 1 (Div. 1 + Div. 2) 1428D Bouncing Boomerangs 贪心+构造
  18. 【Mybatis从入门到实战教程】第一章 Mybatis 入门
  19. 一张H5游戏页引起的思考
  20. DB2入门(1)--安装、启动、连接

热门文章

  1. HTML——meta标签
  2. 方法有多少个参数才算多?
  3. easyui Combotree 怎么加载数据 支持多选
  4. mybatis里oracle与MySQL的insert_update
  5. 第一次冲刺阶段(三)
  6. (剑指Offer)面试题5:从尾到头打印链表
  7. 是隐极电机_资料 | 发电机定子绕组端部动态特性试验详解
  8. javascript中对一个对象数组按照对象某个属性进行排序
  9. Android 常见内存泄漏及解决方法
  10. Android 自定义操作成功的loading动画