概述
文章目录
- 前序
- 七层模型
- 应用层
- 表达层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
- netmap(此次文章的重点,手撕代码的实现)
- 拷贝与零拷贝
- 手撕用户协议栈设计代码(展示关键代码)
- 从抓取的数据提取用户数据
- 发现问题
- arp协议的工作内容
- arp 协议
- arp攻击
- arp协议协议头
- arp协议解析
- 源码链接
前序
网络协议栈 内核已经实现了。站在一个设计者的角度,我们需有必要深入理解如何实现的,自己去实现协议栈可以更好的学习网络协议方面的知识和验证网络协议理论知识七层模型
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP…
表达层
数据的表示、安全、压缩。
格式有,JPEG、ASCll、EBCDIC、加密格式等。
会话层
建立、管理、终止会话。
对应主机进程,指本地主机与远程主机正在进行的会话。
例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD socket
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层。
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6)
数据链路层
传输的是数字信号 0101
建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
传输的是光信号或者是电信号,信号是物理层
建立、维护、断开物理连接。(由底层网络定义协议)
netmap(此次文章的重点,手撕代码的实现)
网卡作为外设也有一块存储空间,netmap 通过mmap的方式将网卡上的存储空间映射到内存中。
网卡将光电信号转换成数字信号存储在网卡的存储空间中。映射到内存中,相当于我们能够用操作内存的方式去操作这一片空间。
拷贝与零拷贝
拷贝:实际上是由CPU的操作,通过cpu的mv指令完成的操作我们叫做拷贝
但是从网卡中的数据到达内存中来,cpu并没有参与。
零拷贝:所以零拷贝的意思是cpu没有参与,是以一种dma的方式参与
1 sendfile
2 netmap网卡数据映射到内存
3 mmap
这三种方式都是DMA方式,零拷贝方式,而不是拷贝,都是由dma芯片来参与的而不是cpu参与。
手撕用户协议栈设计代码(展示关键代码)
以太网协议头
代码中以太网协议
IP协议头
代码中IP协议封装
udp协议头
struct udphdr {
unsigned short sport;
unsigned short dport;
unsigned short length;
unsigned short check;
}; // 8
struct udppkt {
struct ethhdr eh; // 14
struct iphdr ip; // 20
struct udphdr udp; // 8
unsigned char data[0];
}; // sizeof(struct udppkt) ==
从抓取的数据提取用户数据
if (ntohs(eh->h_proto) == PROTO_IP) {
struct udppkt *udp = (struct udppkt *)stream;
if (udp->ip.type == PROTO_UDP) { //
int udplength = ntohs(udp->udp.length);
udp->data[udplength-8] = '