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

欢迎訪问!

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

  1. 网络编程(1)--socket/bind/listen/accept的简单介绍

    网络编程1--socket/bind/listen/accept的简单介绍 背景介绍 网络编程接口 socket bind listen accept 背景介绍 最近在学习APUE和Linux高性能服 ...

  2. 连接服务器用xshell还是linux,【linux☞5】xshell 连接服务器的简单介绍

    前言 linux连接工具有很多,但所有终端工具使用的目的都是为了连接上服务器,从而方便自己在终端工具上直接使用命令来操作想要做的事情.这里我就简单介绍一下xshell这款终端工具安装过程. xshel ...

  3. 嵌入式linux 硬盘录像机,嵌入式硬盘录像机技术的简单介绍

    支持的视音频通道数多,可同时进行几路.十几路.甚至几十路同时录像:记录的时间取决于存储设备的容量,一般可达几百小时:记录图像质量不会随时间的推移而变差:功能更为丰富,不像传统的模拟录像机那么单一. 不 ...

  4. linux fg 参数,Linux的bg和fg命令简单介绍

    我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的 ...

  5. 如何查看linux网络io,linux 查看CPU内存 网络 流量 磁盘 IO

    使用vmstat命令来察看系统资源情况 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? Q: 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? A: 在命 ...

  6. linux Packet socket (1)简单介绍

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

  7. 【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 什么是socket 所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络 ...

  8. Linux C TCP Socket实现客户与服务器简单通信

    在Linux平台下用C语言udp协议实现客户与服务器的简单通信与封装的实现 一.服务器端 1.新建CreateServer.c和CreateServer.h文件,服务器的创建代码在此实现,程序中封装了 ...

  9. 【Linux Socket C++】为什么IO复用需要用到非阻塞IO?EAGAIN的简单介绍与应用

    目录 为什么IO复用需要非阻塞的IO EAGAIN的介绍 EAGAIN的应用 为什么IO复用需要非阻塞的IO 我们可以先看一下官方的回答: 在Linux命令行输入:man 2 select 找到[BU ...

最新文章

  1. 高效办公,如何利用Python自动发送邮件
  2. 做事先做人 --- 我的十三条军规
  3. php 数字转中文函数 1转一,一个阿拉伯数字转中文数字的函数-PHP教程,PHP函数
  4. Spring Boot项目开启异步使用多线程完整代码案例
  5. android 获取apk的版本信息
  6. function函数的使用
  7. 线程与进程的区别_Java线程和PC进程的区别
  8. SpringMVC框架----SpringMVC的自定义类型转换器
  9. 使用NodeJS将文件或图像上传到服务器
  10. JSF使用HTML5的custom attribute
  11. kindle刷机ttl_摔一下变砖了,ttl刷机没效果,谁帮看看最后三行那个error什么意...
  12. Android真正的静默安装
  13. POJ 2387.Til the Cows Come Home
  14. 计算机管理无效,win7右键菜单管理无效恢复方法
  15. WAIC直击:星环科技以大数据AI技术构建新型数字底座
  16. SpringBoot整合模板FreeMarker篇
  17. 超详细,从零开始搭建阿里云服务器(centos7)第一章 远程连接
  18. 双电阻差分电流采样_1206 0.35R采样毫欧电阻等规格参数应用详情
  19. 解决:BT5 /pentest/misc/openvas/openvas-check-setup.sh: No such file or directory
  20. android有声电子书新版本1.61发布

热门文章

  1. python以20字符宽居中输出,Python 字符串内置方法(一)
  2. php对中英文字符串进行截取,利用php怎么对中英文混合的字符串进行截取
  3. xp系统如何开启共享服务器,xp系统怎么关闭共享服务 xp系统共享打印机如何设置...
  4. python获取mysql数据为excel中的sheet_python 从excel、csv、mysql、txt获取数据源
  5. vs使用未初始化的内存怎么解决_遇到C语言内存错误怎么办?一定要找准这六个原因...
  6. 都2021年了,还不会使用GitHub创建、推送、拉取、克隆远程库、团队协作开发?
  7. MongoDB Shell操作
  8. NameError: name 'long' is not defined
  9. 深入理解Angular订阅者模式
  10. P1303 A*B Problem 高精度乘法