linux Packet socket (1)简单介绍
本文主要来自于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)简单介绍相关推荐
- linux packet socket,linux Packet socket (1)简单介绍
本文主要来自于linux自带的man packet手冊: http://man7.org/linux/man-pages/man7/packet.7.html 平时常常使用的INET套接字提供的是7层 ...
- Linux的SOCKET编程 简单演示
转载:http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源 ...
- 简述linux系统引导流程,简单介绍如何用WinGrub 引导Linux系统简述
以下主要介绍我的第一次安装Linux系统遭遇,以及怎么度过这个遭遇的,希望对大家有所帮助.不喜欢的可以略过. 一.开篇叙述我第一次安装Linux系统和接下来的经历 开篇:按照北南兄弟的<FC4菜 ...
- 查看linux vnc用户名,Linux-VNC简单介绍
Linux-VNC 一.VNC简单介绍: VNC,全称为Virtual NetworkComputing,它是一个桌面共享系统.它的功能,类似于windows中 的远程桌面功能.VNC使用了 RFB( ...
- Linux开源沙箱Lisa简单介绍
Lisa简单介绍 Lisa是一款开源的Linux沙箱,她使用Docker进行部署,通过qemu提供虚拟化能力,目前暂支持arm32/64.x86/x64.mips平台架构. 跳转链接:https:// ...
- linux ps le hrtime,Linux 高精度定时器hrtimers简单介绍和应用场景
hrtimer:high-resolution kernel timers: hrtimers的诞生是由于内核开发者在使用过程中发现,原始的定时器kernel/timers.c,已经可以满足所有场景的 ...
- socket通信简单介绍
"一切皆Socket!" 话虽些许夸张,可是事实也是,如今的网络编程差点儿都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通 ...
- Linux操作系统启动流程简单介绍
Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程.了解 Linux操作系统的启动过程,对Linux操作系统更深入认识和日常的运维工作非常有帮助,感兴趣的朋友可以了解一 ...
- Linux下Socket的简单使用及最简化封装
/* * 文件功能: linux 下套接字简化操作函数 * 文件名称: linux_socket.h * 建立时间: 2007 年 07 月 19 号 * 创建作者: wlzqi * 使用语言: C ...
最新文章
- 《C++ primer》--第1,2章小结
- Java异常ClassCastException
- 安装docker和docker-compose
- java下拉框查询_[Java教程]jQuery实现联动下拉列表查询框
- 安卓学习-界面-布局-FrameLayout
- Storm【实践系列-如何写一个爬虫】 - ParserBolt
- 微软对外开放更多软件技底层代码术文档
- vim自己主动缩进配置
- 安卓系统怎么安装软件_「软件」怎么在虚拟机里安装系统
- 畅销书系列:《引爆点》、《异类》、《从0到1》
- android多媒体框架学习 详解
- 使用Flask-Migrate进行管理数据库升级
- Eureka Server 开启身份验证与客户端注册
- android token加密_Android使用token维持登陆状态的方法
- 深入浅出Mybatis系列(五)Mybatis事务篇
- vue中computer和watch的区别和使用
- Codeforces Raif Round 1 (Div. 1 + Div. 2) 1428D Bouncing Boomerangs 贪心+构造
- 【Mybatis从入门到实战教程】第一章 Mybatis 入门
- 一张H5游戏页引起的思考
- DB2入门(1)--安装、启动、连接