Linux内核数据包格式
LInux kernel中MAC头,IP头,TCP头结构体定义,内核打印方式。
MAC头:
//内核中MAC头结构体
#defein ETH_ALEN 6
struct ethhdr {unsigned char h_dest[ETH_ALEN]; //48位目的MAC地址 unsigned char h_source[ETH_ALEN]; //48位源MAC地址__be16 h_proto; //16位协议类型
} __attribute__((packed));
//有这样两个宏可以方便地打印mac地址:
#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]//使用样例如下:
const struct ethhdr* eh = eth_hdr(skb);
printk(KERN_INFO "source mac:" MAC_FMT "\n", MAC_ARG(eh->h_source));
printk(KERN_INFO "dest mac:" MAC_FMT "\n", MAC_ARG(eh->h_dest));
IP头:
//linux kernel中ip地址结构体
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)__u8 ihl:4, version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)__u8 version:4, //4位版本号ihl:4; //4位首部长度
#else
#error "Please fix <asm/byteorder.h>"
#endif__u8 tos; //8位服务类型__be16 tot_len; //16位总长度__be16 id; //16位标识__be16 frag_off; //3位标志,13位片偏移__u8 ttl; //8位生存时间__u8 protocol; //8位协议__sum16 check; //16位首部校验和__be32 saddr; //32位源地址__be32 daddr; //32位目的地址/*The options start here. */
};
//打印IP地址
#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]struct iphdr *nh;
struct sk_buff *skb;
nh = ip_hdr(skb);
printk(KERN_INFO "src: %u.%u.%u.%u, dst: %u.%u.%u.%u\n",
NIPQUAD(nh->saddr), NIPQUAD(nh->daddr));
TCP头定义:
//linux kernel 中tcp结构体
struct tcphdr {__be16 source; //16位源端口号__be16 dest; //16位目的端口号__be32 seq; //32位序号__be32 ack_seq; //32位确认序号
#if defined(__LITTLE_ENDIAN_BITFIELD)__u16 res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)__u16 doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif__be16 window;__sum16 check;__be16 urg_ptr;};
//打印tcp端口号
const struct tcphdr* th = tcp_hdr(skb);
printk(KERN_INFO "src_port: %d, dst_port: %d\n", ntohs(th->source), ntohs(th->dest));
uint32_t htonl(uint32_t hostlong);//32位的主机字节序转换到网络字节序
uint16_t htons(uint16_t hostshort);//16位的主机字节序转换到网络字节序
uint32_t ntohl(uint32_t netlong);//32位的网络字节序转换到主机字节序
uint16_t ntohs(uint16_t netshort);//16位的网络字节序转换到主机字节序
Linux内核数据包格式相关推荐
- Linux内核数据包L3层转发处理流程
转载: https://blog.csdn.net/eric_liufeng/article/details/10789811 https://blog.csdn.net/shichaog/artic ...
- Linux网络 - 数据包的接收过程
Linux网络 - 数据包的接收过程 嵌入式Linux中文站 嵌入式Linux中文站 微信号 emblinux 功能介绍 嵌入式Linux中文站提供专业嵌入式Linux开发技术资讯 Table of ...
- IPv4与IPv6数据包格式
https://blog.csdn.net/frank_jb/article/details/45093615 本文给出IPv4与IPv6数据报格式示意图,并整理了各个字段含义,最后对比IPv4与IP ...
- IP数据包格式(ICMP协议与ARP协议)
这里写目录标题 IP数据包格式 网络层的功能 IP数据包格式 ICMP协议 ping 广播域 ARP协议(地址解析协议) 无故ARP ARP工作原理: ARP报文 查看arp缓存表(静态arp和动态a ...
- Linux网络数据包接收处理过程
因为要对百万.千万.甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化.而很多时候,如果你对Linux底 ...
- Linux网络数据包的揭秘以及常见的调优方式总结
Linux网络数据包的揭秘以及常见的调优方式总结 (网易游戏运维平台) 关注我们,获一手游戏运维方案 lott 网易游戏业务 SRE, 专注于业务运维的质量和效率 , 喜欢研究 Linux 系统原理. ...
- 【FPGA】SRIO中的关键问题总结(一)SRIO中的关键数据包格式总结
目录 1 SRIO事务及其类型 2 常用的I/O逻辑操作事务 3 HELLO包格式(重点) 4 SRIO数据包包格式 5 控制符号数据包格式 1 SRIO事务及其类型 SRIO(Serial Rapi ...
- 计算机网络数据分析报告,贵州大学计算机网络实验报告-实验四-分析IP协议数据包格式...
贵州大学计算机网络实验报告-实验四-分析IP协议数据包格式 (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 贵州大学GUIZHOU UN ...
- iBeacon的数据包格式
Ibeacon 是apple开发的基于BLE(Bluetooth low energy)的精确定位技术.常常用来做室内定位. 这里简单讲解下ibeacon的数据包格式 这里以UUID为B9407F30 ...
最新文章
- 七夕节,阿里云AI发女朋友了
- iOS11和机器学习CoreML库
- 模型预测控制c语言程序_基于数据驱动的模型预测控制
- MyBatis-Plus——增删查改
- 创业,“玩”的就是心态
- Java前端顺序,java种初始化顺序
- 在CentOS/RHEL/Scientific Linux 6 7 上安装Telnet
- 微型计算机相关的英文文献,微型计算机控制系统(单片机控制系统)外文文献翻译.doc...
- 后端学习 Java 面向指挥官的操作系统
- 篮球中的PG,SG,SF,PF 英文全称分别是什么
- 11111122266666
- Adobe ——pdf文档加密且不可编辑
- php修改qq举报按钮,自定义修改QQ在线状态
- PJzhang:关闭wps小广告和快速关闭445端口
- Ubuntu下tc命令配置网络时延、丢包、带宽
- 开发落网电台windows phone 8应用的计划(2)
- 100部优秀英文小说
- 中国手机芯片市场份额将变
- Win7 Print Spooler服務自动关闭
- JAVA开发学习——欢迎来到JAVA开发世界!