08_原始套接字
创始人
2024-02-03 13:09:46
0

知识点1【原始套接字概述】

 1、UDP封包格式

​IP封包格式:

Ethernet封包格式 

TCP封包格式: 

 ICMP封包格式:ping

知识点2【数据包的分析】

 案例:网络分析器:

知识点2【混杂模式】接受数据(了解) 

知识点3【原始套接字发送数据】sendto 

1、本机的接口地址结构

2、获取我们的本地接口

知识点4【案例:扫描mac地址 ARP】

 ARP协议格式:

知识点1【原始套接字概述】

ubuntu12.04中描述网络协议结构的文件如下

 在TCP/IP协议栈中的每一层为了能够正确解析出上层的数据包,从而使用一些“协议类型”来标记,详细如下图

组装/拆解udp数据包流程

 1、UDP封包格式

IP封包格式:

Ethernet封包格式 

TCP封包格式: 

 ICMP封包格式:ping

知识点2【数据包的分析】

链路层数据格式

 demo:recvfrom接受链路层帧数据

 案例:网络分析器:

#include
#include
#includeint main()
{//1、 创建一个原始套接字 ETH_P_ALL收发任何数据类型int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));if(sockfd < 0){perror("socket");return 0;}printf("sockfd = %d\n", sockfd);//2、使用recvfrom接受网络数据 数据很多while(1){//定义buf存放帧数据 大小1500 unsigned charunsigned char buf[1500]="";int len = recvfrom(sockfd, buf, sizeof(buf),0,NULL,NULL);printf("len = %d\n", len);//buf不要用%s遍历 帧数大多都是不识别的ASCII值  有太多的0x00//printf("buf=%s\n",buf);//sleep(1);//别sleep会丢失数据//解析buf-->mac头信息-->必须明白mac头的结构//1、mac头部:目的mac(6B) 源mac(6B) 类型(2B)//[mac][ip][tcp/udp][data] ff:ff:ff:ff:ff:ffchar src_mac[18]="";char dst_mac[18]="";sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x",\buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]);sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x",\buf[0+6],buf[1+6],buf[2+6],buf[3+6],buf[4+6],buf[5+6]);printf("%s--->%s\n", src_mac, dst_mac);//判断mac头部中协议类型 0x0800 IP  0x0806 ARP 0x8035 RARPunsigned short mac_type = ntohs(*(unsigned short *)(buf+12));if( mac_type == 0x0800 ){printf("mac_type = %#x IP报文\n",mac_type);//2、分析IP头部unsigned char *ip_addr = buf+14;//+14跳过mac头//ip_addr跳到源IP的起始位置ip_addr += 12;char src_ip[16]="";char dst_ip[16]="";sprintf(src_ip,"%d.%d.%d.%d", \ip_addr[0],ip_addr[1],ip_addr[2],ip_addr[3]);ip_addr += 4;sprintf(dst_ip,"%d.%d.%d.%d", \ip_addr[0],ip_addr[1],ip_addr[2],ip_addr[3]);printf("%s--->%s\n",src_ip,dst_ip);//判断完成网路层的上一层协议类型ip_addr = buf+14;unsigned char *ip_type = ip_addr +9;if(*ip_type == 1){printf("ICMP报文\n");}	else if(*ip_type == 2){printf("IGMP报文\n");}else if(*ip_type == 6){printf("TCP报文\n");ip_addr = buf+14;//ip报文起始位置int ip_head_len = (*ip_addr&0x0f)*4;//提取ip报文的头部长度unsigned char *tcp_addr = buf+14+ip_head_len;unsigned src_port = ntohs(*(unsigned short *)tcp_addr);unsigned dst_port = ntohs(*(unsigned short *)(tcp_addr+2));printf("%hu--->%hu\n", src_port, dst_port);//调到tcp首部长度的位置unsigned char *tcp_headLen_addr = tcp_addr+12;int tcp_head_len = ((*tcp_headLen_addr>>4)&0x0f)*4; printf("TCP:%s\n", tcp_addr+tcp_head_len);}else if(*ip_type == 17){printf("UDP报文\n");ip_addr = buf+14;//ip报文起始位置int ip_head_len = (*ip_addr&0x0f)*4;//提取ip报文的头部长度unsigned char *udp_addr = buf+14+ip_head_len;unsigned short src_port = ntohs(*(unsigned short *)udp_addr);unsigned short dst_port = ntohs(*(unsigned short *)(udp_addr+2));printf("%hu--->%hu\n", src_port, dst_port);printf("%s\n", udp_addr+8);//应用层数据}}else if(mac_type == 0x0806){printf("mac_type = %#x ARP报文\n",mac_type);}else if(mac_type == 0x8035){printf("mac_type = %#x RARP报文\n",mac_type);}}//关闭套接字close(sockfd);return 0;
}

 运行结果:

 

知识点2【混杂模式】接受数据(了解) 

linux下设置

1、设置混杂模式:ifconfig eth0 promisc

2、取消混杂模式:ifconfig eth0 -promisc

linux下通过程序设置网卡混杂模式: 

知识点3【原始套接字发送数据】sendto 

sendto(sock_raw_fd, msg, msg_len, 0,(struct sockaddr*)&sll, sizeof(sll));
注意:
1、sock_raw_fd:原始套接字
2、msg:发送的消息(封装好的协议数据)
3、sll:本机网络接口,指发送的数据应该从本机的哪个网卡出去,而不是以前的目的地址
想一想:
如何定义sll?

原始套接字:组帧数据报文----->从本机的哪块网卡sendto发出去

1、本机的接口地址结构

#include 
struct sockaddr_ll sll;

只需要对sll.sll_ifindex赋值,就可使用

sll.sll_ifindex=本地接口;//关键就是本地接口如何获得
sendto(sock_raw_fd, msg, msg_len, 0,(struct sockaddr*)&sll, sizeof(sll));

2、获取我们的本地接口

通过ioctl来获取网络接口地址

struct ifreq:#include 
IFNAMSIZ 16

 ioctl参数对照表:

知识点4【案例:扫描mac地址 ARP】

ARP概述

ARP(Address Resolution Protocol,地址解析协议)

1、是TCP/IP协议族中的一个

2、主要用于查询指定ip所对应的的MAC

3、请求方使用广播来发送请求

4、应答方使用单播来回送数据

5、为了在发送数据的时候提高效率在计算中会有一个ARP缓存表,用来暂时存放ip所对应的MAC,在linux中使用ARP即可查看,在xp中使用ARP -a

在linux与xp系统下查看ARP的方式:

以机器A获取机器B的MAC为例:

 ARP协议格式:

 

 

 

 

相关内容

热门资讯

珍爱生命的名人名言 珍爱生命的名人名言(精选55句)  关于生命的名人名言有哪些?生命,值得我们尊重,你知道哪些关于生命...
关于知音的名言名句  导语:关于知音或者是友谊的古诗词, 名人名言,这里全都有,关于知音的名言名句。  君子之交淡若水,...
清正廉洁格言 清正廉洁格言最短的人生格言1、执政以廉为本,为官以勤为先。2、做人一身正气,为官一尘不染。3、名位利...
罗素名言 罗素名言69句  1、伟大的事业是根源于坚韧不断的工作,以全付精神去从事,不避艰苦。——罗素  2、...
朋友的名人名言 有关朋友的名人名言汇总  在学习、工作、生活中,大家都不可避免地会接触并使用名言吧,名言可以用来鞭策...
乔布斯名言经典摘抄 乔布斯名言经典摘抄  乔布斯出生于美国加利福尼亚州旧金山,美国发明家、企业家、美国苹果公司联合创办人...
夺眶而出的名言名句 关于夺眶而出的名言名句  这里是郁郁葱葱的山神之森,一定,要有一段时间无法再盼望夏天了,心如刀绞,泪...
信仰名言 精选关于信仰名言  关于信仰名言  1、没有信仰的人如同盲人(弥顿)  2、有信仰未必能成大事,而没...
告诉自己珍惜时间的名言名句 志士惜年,贤人惜日,圣人惜时,告诉自己珍惜时间的名言名句。圣人都珍惜时间,我们凡人更要珍惜时间。下面...
工匠精神的名人名言 关于工匠精神的名人名言  1、最佳的创新定义是“不限大小,不限部门”。 最有效的创新都简单得惊人,其...
青春奋斗的名言警句 关于青春奋斗的名言警句1、青春是美妙的,挥霍青春就是犯罪,关于青春奋斗的名言警句。——萧伯纳  2、...
理想的阶梯 理想的阶梯理想的阶梯[教学目标]1.通过学习本文,使学生懂得“奋斗,是实现理想的阶梯”这一道理,并能...
激励的名言警句 激励的名言警句50句  大家都听过哪些激励的话呢?还记得吗?下面,小编为大家分享激励的名言警句,希望...
清明节家风家训的名言 清明节家风家训的名言  家风不仅是民风社风的组成要素,也是中华民族传统价值观的重要组成部分,各位,我...
英文爱情电影名言 英文爱情电影名言1) i love you not because of who you are, ...
霸气青春励志名言英语短句 霸气青春励志名言英语短句  青春是美好的时光,也是很重要的时光,下面unjs小编整理了霸气青春励志名...
文化的名言 关于文化的名言  文化是一种社会现象,是人们长期创造形成的产物,同时又是一种历史现象,是社会历史的积...
每日英语励志名言 每日一句英语励志名言  1、 No one can walk backward into the f...
感谢老师的成语和名言 感谢老师的成语和名言  春风化雨  有教无类  平易近人  古道热肠  十年树木,百年树人  作育英...
孝老敬亲的名人名言 关于孝老敬亲的名人名言  泱泱中华,礼义之邦,道德传统,源远流长。敬老孝老,是我们的传统美德,是我们...