我是靠谱客的博主 精明麦片,最近开发中收集的这篇文章主要介绍用户协议栈之协议设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 前序
    • 七层模型
      • 应用层
      • 表达层
      • 会话层
      • 传输层
      • 网络层
      • 数据链路层
      • 物理层
    • 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地址访问介质,错误发现但不能纠正。

物理层

传输的是光信号或者是电信号,信号是物理层
建立、维护、断开物理连接。(由底层网络定义协议)

五层网络协议自上而下:应用层,传输层,网络层,链路层和物理层 当应用层发送数据,首先加上tcp或者udp头到传输层,加上ip头到网络层,加上以太网头到数据链路层然后再由物理层发出。接收数据是从物理层到数据链路层到网络层到传输层到应用层,一层一层往下拨。这就是协议栈,栈的概念,也叫做协议族 family。

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] = '';

					printf("udp --> %sn", udp->data);

				}

发现问题

在windows下开一个udp的工具发送数据给linux跑的程序,先开始能够收到数据,后来就收不到,而且用windows环境去pinglinux 的ip地址,发现无法ping通。
原因:
由于windows下没有了arp表,在windows下当失去目的ip后,会向目的ip发一帧arp请求,发出去后,如果linux没有去响应win发送的arp请求。

arp协议的工作内容

1定时的发送arp请求 。
2 回一个arp响应的时候,会记录到arp表中

arp发送请求是一种广播式的。所以就有了arp攻击

arp 协议

ARP(Address Resolution Protocol),即地址解析协议,是根据IP地址解析物理地址的一个TCP/IP协议。主机将包含目标IP地址信息的ARP请求广播到网络中的所有主机,并接收返回消息,以此确定目标IP地址的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,以便下次请求时直接查询ARP缓存以节约资源。
在局域网中,主机和主机之间的通讯是通过MAC地址来实现的,而主机的MAC地址是通过ARP协议获取的。ARP负责将网络中的IP地址转换为MAC地址,来保证局域网中的正常通讯。在局域网中实际传输的是“帧”,里面包含目标主机的MAC地址。每个安装以太网和TCP/IP的计算机都有一个ARP缓存表,缓存表里保存的IP地址和MAC地址是相互对应的。ARP协议的基本功能就是执行地址解析,以保证通信的顺利进行。

arp攻击

ARP攻击主要是通过伪造IP地址和MAC地址进行欺骗。使以太网数据包的源地址、目标地址和ARP通信数量剧增导致网络中断或中间人攻击。ARP攻击主要存在于局域网中。若其中一台计算机感染ARP病毒。就会试图通过ARP欺骗截获局域网内其他计算机的信息,造成局域网内的计算机通信故障

arp协议协议头

在这里插入图片描述

struct arphdr {

	unsigned short h_type;
	unsigned short h_proto;

	unsigned char h_addrlen;
	unsigned char h_protolen;

	unsigned short oper;

	unsigned char smac[ETH_ADDR_LENGTH];
	unsigned int sip;

	unsigned char dmac[ETH_ADDR_LENGTH];
	unsigned int dip;
};
struct arppkt {

	struct ethhdr eh;
	struct arphdr arp;

};

arp协议解析

else if (ntohs(eh->h_proto) ==  PROTO_ARP) {

				struct arppkt *arp = (struct arppkt *)stream;

				struct arppkt arp_rt;

				if (arp->arp.dip == inet_addr("192.168.0.123")) { //

					echo_arp_pkt(arp, &arp_rt, "00:50:56:33:1c:ca");

					nm_inject(nmr, &arp_rt, sizeof(arp_rt));

					printf("arp retn");
				
				}

源码链接

https://github.com/xiaoyeyihao/xioayeyihao.github.io/blob/master/net_family.c

最后

以上就是精明麦片为你收集整理的用户协议栈之协议设计的全部内容,希望文章能够帮你解决用户协议栈之协议设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部