linux packet socket,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

#include

#include /* the L2 protocols */

packet_socket = socket(AF_PACKET, intsocket_type, intprotocol);

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

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

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

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

protocol主要是中定义的协议类型,我们能够指定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: 中定义的那些协议类型,也就是我们传给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硬件类型,在头文件中定义,比方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上:

欢迎訪问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TortoiseGit 修改密码

当TortoiseGi默认设置了凭证助手为“管理器-所有windows用户”,每次向远程git推送时,都会去windows的凭证管理器里读取值,然后推送。 如果密码修改了,或者密码不小心输入错了,每次提交都会报错:HTTP Basic:…

linux系统常见操作,Linux系统基本操作

我们可以认为Linux是一套自由使用的类Unix操作系统,与Windows相比较而言,Linux具有安全、开源、稳定等特点。下面我来介绍Linux中一些的登录登出基本操作。1. 启动系统通常LILO是安装在MBR上的,计算机启动后,MBR上的程序被执行&am…

字符串常见处理

mystr hello world itcast and itcastcpps mystr.find(hello)print(s)ind mystr.index(world)print(ind)cou mystr.count(c)print(cou)rep mystr.replace(c,)print(rep)spl mystr.split( )print(spl)转载于:https://www.cnblogs.com/zxt-cn/p/9714841.html

git 无法访问

git分2种访问方式:ssh,https ssh模式,需要在github或gitlab上配置公钥,本地要生成秘钥。 举例: 公司使用gitlab 张工需要访问公司李工的代码库。 步骤: 1、李工要在gitlab他的项目里,给张…

c语言编程统计单词的个数,使用c语言如何统计单词个数

使用c语言如何统计单词个数发布时间:2020-04-21 13:58:58来源:亿速云阅读:207作者:小新使用c语言如何统计单词个数?相信有很多人都不太了解,今天小编为了让大家更加了解Golang,所以给大家总结了…

10 种保护 Spring Boot 应用的绝佳方法

Spring Boot大大简化了Spring应用程序的开发。它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量,如果你已经习惯了Spring和大量XML配置,Spring Boot无疑是一股清新的空气。 Spring Boot于2014年首次发布,自那以后发生了很多变…

zkServer.cmd 闪退

调用 zkEnv.cmd 查看下 zkEnv.cmd 在\conf下复制zoo_sample.cfg 重命名为 zoo.cfg 再运行,成功

c语言单字符输入和输出函数分别为,第03章单元总练习-实训-知识拓展.doc

第03章单元总练习-实训-知识拓展《C语言程序设计》单元总结单元练习实训指导知识拓展第三章 最简单的C程序设计——顺序结构设计班级:姓名:学号:单元总结提升本单元中,核心内容有C语言中基本的数据类型、常量和变量、运算符和表达式以及算法的概念。通过本单元的学习…

那些你不知道的 getClientRects()

1.getClientRects()。是可以获取内联元素的内容有多少行 最近一个交互,在限定文字展现是5行,超过5行,则在后面添加。。。展开。如果没有展开二字,我们一般用css就能完成了。但是为了交互更人性化 text-overflow: -o-ellipsis-last…

idea统计代码行数

使用统计代码插件,可以统计代码行数。安装插件 Statistic。(这个最好用) File----settiing---plugins---browse repositories 重启idea后,底部会多一个 Statistic 点击刷新,行数就出来了。看最后的 Total

数据结构计算c语言数据步骤,数据结构C语言版视频教程-介绍各种最常用的数据结构 分析各种数据结构运算算法的实现过程-电脑网络视频-星火视频教程 21edu8.com...

这部数据结构C语言版视频教程结构清晰,实例丰富,具有很强的操作性和实用性。 它主要为大家介绍各种最常用的数据结构,以及从编程角度出发,分析各种数据结构运算算法的实现过程。数据结构是计算机存储、组织数据的方式。数据结构是…

极光推送小结 - iOS

此次即友盟分享小结(友盟分享小结 - iOS)之后对推送也进行了一版优化.此次分享内容依然基于已经成功集成 SDK 后 code 层级部分. 注:此次分享基于 SDK 3.1.0,若版本相差较大,仅供参考. 极光推送官方文档: https://docs.jiguang.cn/jpush/guideline/intro/ 首先,为分享单独创建了…

word去除所有的空行

申请软著时,需要复制源代码到word里。每行代码不能有换行,要紧凑的80页代码。每页要50~55行代码。 字体可设置为:宋体,5号,行间距固定值12。 演示实例 去除下面word代码里的空行 第一步: word显示隐藏的…

c语言Wndproc未定义,为什么我的老是未定义

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是源代码#includeLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] TEXT("HelloWin&qu…

spark on yarn

2019独角兽企业重金招聘Python工程师标准>>> spark on yarn 软件安装 当前环境 hadoop环境搭建参考:hadoop集群安装 hadoop2.6spark-2.2.0-bin-hadoop2.6.tgzscala-2.11.12安装scala tar -zxvf scala-2.11.12.tgz vi /etc/profile 添加以下内容 export S…

如何查看SQL Server2000执行过的SQL语句

SQLServer事件探查器可以完整记录SQL服务器执行过的SQL语句以及存储过程等 下面是SQLServer事件探查器的使用方法: 1. 打开SQL Server 企业管理器。 2. 从“工具”菜单选择“事件探查器”。 3. 当“事件探查器”主界面打开后,从“文件”菜单选择“新跟踪…

c语言链表不带头节点的排序,不带头结点的单向链表排序——插入排序(C语言)...

LinkList* LinkListInsertSort(LinkList* pHead){LinkList *pFirst (LinkList *)NULL; /* 原链表剩下未排序节点的头指针 */LinkList *pCurrInsert (LinkList *)NULL; /* 无序链表中当前待插入节点 */LinkList *pPrev (LinkList *)NULL; /* 有序链表中插入位置的前一个节点 …

免费字体

若不想字体版权有问题,可以参考以下几种完全免费的字体: 方正:方正黑体、方正书宋、方正仿宋、方正楷体 思源:思源黑体、思源柔黑体、思源宋体 站酷:站酷酷黑体、站酷高端黑体、站酷快乐体、站酷意大利体 。

【Python爬虫学习笔记12】Ajax数据爬取简介

有时候在我们设计利用requests抓取网页数据的时候,会发现所获得的结果可能与浏览器显示给我们的不一样:比如说有的信息我们通过浏览器可以显示,但一旦用requests却得不到想要的结果。这种现象是因为我们通过requests获得的都是HTML源文档&…

c语言的报告一,C语言实验报告(一).doc

C语言实验报告(一)C语言实验报告(一)一、实验目的掌握C语言中,基本的输入输出函数的使用方法。掌握printf中转义字符’\t’,’\n’的用法。掌握赋值语句的用法。掌握算术表达式、赋值表达式的计算。掌握数学函数的使用。二、实验内容从键盘输入一个6位整…