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上:
欢迎訪问!
linux Packet socket (1)简单介绍的更多相关文章
- Linux 内核开发—内核简单介绍
内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态 ...
- socket通信简单介绍
“一切皆Socket!” 话虽些许夸张,可是事实也是,如今的网络编程差点儿都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通信,如我们每天打开浏 ...
- linux视频学习(简单介绍)20160405
看一周学会linux系统的学习笔记. 1.linux系统是一个安全性高的开源,免费的多用户多任务的操作系统. 2.linux工作分为linux系统管理员,linux程序员(PC上软件开发,嵌入式开发) ...
- Linux C Socket TCP编程介绍及实例
转自:https://blog.csdn.net/lell3538/article/details/53335231 { printf("向服务器发送数据:%s\n",sendbu ...
- linux文件系统的权限简单介绍
linux系统下,文件的权限是这样表示的: - --- --- --- 一共用10位的二进制进行表示,其中 位置 0 : - :文件 d :目录剩下的9个位置:位置1-3 当前用户(应 ...
- jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...
- Linux命令之---which简单介绍
命令简介 which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果.也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的 ...
- Linux的简单介绍和常用命令的介绍
Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...
- Linux curl使用简单介绍
在两台新搬迁的微信服务器上执行命令: curl -H "Content-Type: application/json" -d '{"partner_no":&q ...
随机推荐
- 打印出所有"水仙花数
时间限制: 1 Sec 内存限制: 128 MB 提交: 695 解决: 352 [提交][状态][讨论版] 题目描述 打印出所有"水仙花数",所谓"水仙花数&quo ...
- Notification和Activity交互
概述 通知(Notification)就是程序在不影响用户操作的情况下,通过手机顶部弹出消息告诉用户的一种信息通知方式,而且能够通过下拉通知操作抽屉通知,实现Notification与活动.通知和服务 ...
- C++它tinyXML使用
tinyXML一个非常好的操作C++图书馆,文件不大,但方法非常丰富.和apache的Dom4j能够披靡啊! 习惯了使用java类库的我看到这么丰富的c++类库,非常高兴!它使用非常easy.仅仅须要 ...
- LeetCode219:Contains Duplicate II
Given an array of integers and an integer k, find out whether there there are two distinct indices i ...
- 经纪xx系统节点VIP案例介绍和深入分析异常
系统环境 硬件平台 & 操作 IBM 570 操作系统版本号 AIX 5.3 物理内存 32G Oracle 产品及版本号 10.2.0.5 RAC 业务类型 OLTP 背 ...
- 具体说明 Flume介绍、安装和配置
社论: 本文总结"Hadoop生态系统"中的当中一员--Apache Flume 写在前面二: 所用软件说明: 一.什么是Apache Flume 官网:Flume is a di ...
- poj3624Charm Bracelet
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23025 Accepted: 103 ...
- 实例教程Unity3D单例模式(一)通经常使使用方法
unity3d教程 中的单例模式通经常使使用方法 通经常使使用方法是在相关类增加GetInstance()的静态方法,检查实例是否存在.假设存在,则返回.假设不存在.则返回一个"须要用游戏元 ...
- EF操作sqlite数据库时的项目兼容性问题
问题:vs2015打不开vs2010建的操作sqlite的实体数据模型edmx文件 原因: 当前电脑必须先安装:驱动库及sqlite的vs拓展 正常情况下安装驱动和拓展后,vs2015就应该可以正常打 ...
- Event Sourcing - ENode(三)
接上一篇 http://www.cnblogs.com/dopeter/p/4903328.html 老板昨天在第二篇介绍中回复代码和文字无法一一对应.为了更好的让老板为大家解惑,把第二篇最后的猜测的 ...