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 ...
随机推荐
- Linux下 高性能、易用、免费的ASP.NET服务器
Linux下 高性能.易用.免费的ASP.NET服务器 http://www.jexus.org/#
- DisplayContent、StackBox、TaskStack笔记
文章仅零散记录自己的一点理解,仅供自己參考. 每一个显示设备,都有一个Display对象,DisplayManagerService专门管理这些Display. 1.DisplayContent() ...
- C# 中使用WebClient 请求 https
WebClient 请求 启用SSL的站点 时,如果站点的证书是不可信的,请求会被阻止,解决办法如下: 添加以下代码: ServicePointManager.ServerCertificateVal ...
- 二维码简单Demo
二维码简单Demo 一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name=&qu ...
- Boost.Asio c++ 网络编程翻译(26)
Boost.Asio-其他特性 这章我们讲了解一些Boost.Asio不那么为人所知的特性.标准的stream和streambuf对象有时候会更难用一些,但正如你所见.它们也有它们的益处.最后,你会看 ...
- python 基础知识点整理 和详细应用
Python教程 Python是一种简单易学,功能强大的编程语言.它包含了高效的高级数据结构和简单而有效的方法,面向对象编程.Python优雅的语法,动态类型,以及它天然的解释能力,使其成为理想的语言 ...
- POJ - 2828 Buy Tickets (段树单点更新)
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- JSCover+WebDriver/Selenium获得JS
代码覆盖
我们看JSCover(http://tntim96.github.io/JSCover/manual/manual.xml)介绍及使用说明的时候,往往被图形界面所吸引.这样的方式比較适合手工操作,点击 ...
- SpringMVC注释启用
这篇文章是我学习的网络视频SpringMVC写的过程. 谢谢公布各位前辈的视频 以下评论SpringMVC几个关键步骤,注意事项启用: 首先需要加载配置文件(假设请使用自定义路径) <? xml ...
- 类(class)能不能自己继承自己(转)
类(class)能不能自己继承自己不行,继承关系会出现环. 假设类A继承类A.那么要新建一个类A的对象,就必须先建立一个类A父类的对象.这是一个递归的过程,而且没有终止条件.会死循环的. 从编译的角度 ...