以太网数据帧的监听与分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太网数据帧的监听与分析相关的知识,希望对你有一定的参考价值。
当以太网上的两台主机需要通信时,发送方将数据单元DU传送给它下层的服务提供者。DU 在不同层之间传递时,各层按照协议规范对DU 进行封装,到数据链路层时被封装成MAC帧,即数据链路层的协议数据单元。在MAC帧中包含了数据链路层及其以上各层的协议首部及DU,通过帧发送原语从网络上发送出去,对方的协议处理软件接收到MAC帧后,可解释提取其中的DU。本题目要求编程实现MAC帧的捕获及分析。要求能够实时捕获所在以太网内正在传输的数据帧,并能分析帧的结构,给出每一个帧中发送端和接收端的MAC地址,以及承载数据的协议类型。(注:用C++语言实现,谢谢了!!)
1
程序1 利用WinPcap函数库函数解析捕获数据包的以太帧头
程序名:AnalyzeETH_WinPcap.CPP
程序名:AnalyzeETH_WinPcap.CPP
程序2 利用WinPcap函数库函数解析捕获的IPv4数据报包头
程序名:AnalyzeIPv4_WinPcap.CPP
程序名:AnalyzeIPv4_WinPcap.CPP
程序3 利用WinPcap函数库函数解析捕获的IPv6数据报包头
程序名:AnalyzeIPv6_WinPcap.CPP
程序名:AnalyzeIPv4_WinPcap.CPP
程序4 利用WinPcap函数库函数解析捕获的TCP数据报包头
程序名:AnalyzeTCP_WinPcap.CPP
程序名:AnalyzeTCP_WinPcap.CPP
程序5 利用WinPcap函数库函数解析捕获的UDP数据报包头
程序名:AnalyzeUDP_WinPcap.CPP
程序名:AnalyzeUDP_WinPcap.CPP
程序6 利用WinPcap函数库函数发送TCP SYN帧数据报,进行SYN洪水攻击
注意:本程序仅供学习参考,请不要在Internet网络上使用!
程序名:AnalyzeUDP_WinPcap.CPP
程序名:AnalyzeUDP_WinPcap.CPP
程序7 利用原始套接字捕获并解析IPv4数据包
程序名:AnalyzeIPv4_WINSOCK.CPP
程序名:AnalyzeIPv4_WINSOCK.CPP
程序8 利用原始套接字捕获并解析双协议栈下IPv6数据包
程序名:AnalyzeIPv6_WINSOCK.CPP
程序名:AnalyzeIPv6_WINSOCK.CPP
程序9 利用原始套接字捕获并解析TCP数据包
程序名:AnalyzeTCP_WINSOCK.CPP
程序名:AnalyzeTCP_WINSOCK.CPP
程序10 利用原始套接字捕获并解析UDP数据包
程序名:AnalyzeUDP_WINSOCK.CPP
程序名:AnalyzeUDP_WINSOCK.CPP
程序11 利用原始套接字发送TCP SYN帧,对目标主机进行SYN洪水攻击
程序名:SYNFlood_WINSOCK.CPP
注意:本程序仅供学习参考,请不要在Internet网络上使用!
程序名:SYNFlood_WINSOCK.CPP
程序12 采集局域网内若干台主机网络数据并分析网络流量的综合应用程序
可执行程序:LANSecrutiny.exe
程序运行情况:
程序主要源代码:LANScrutinyDlg.cpp
完整程序全部源代码:LANSecrutiny.rar
编说明如下:
1.结构体说明
在程序中,我们将要进行分析的各数据包头格式用结构体进行定义。这样便于对数据
包的解析,使每个字段清楚易懂。
以太帧头格式结构体,共14个字节:
typedef struct ether_header
unsigned char ether_dhost[6]; //目的MAC地址
unsigned char ether_shost[6]; //源MAC地址
unsigned short ether_type; //协议类型
ETHHEADER,*PETHHEADER;
IPv4报头格式结构体,共20个字节:
typedef struct ipv4_header
unsigned char ver_ihl; //版本 (4 bits) + 首部长度 (4 bits)
unsigned char tos; //服务类型
unsigned short tlen; //数据报总长度
unsigned short identification; //标识
unsigned short flags_fo; //标志 (3 bits) + 片偏移 (13 bits)
unsigned char ttl; //生存时间
unsigned char proto; //协议
unsigned short crc; //首部校验和
u_char ip_src[4]; //源IP地址
u_char ip_dst[4]; //目的IP地址
IPHEADER,*PIPHEADER;
IPv6报头格式结构体,共40个字节:
typedef struct ipv6_header
u_char ver_tf; //版本号(4 bit)
u_char traffic; //优先级(8 bit)
u_short label; //流标识(20 bit)
u_char length[2]; //报文长度(16 bit)
u_char next_header; //下一头部(8 bit)
u_char limits; //跳数限制(8 bit)
u_char Srcv6[16]; //源IPv6地址(128 bit)
u_char Destv6[16]; //目的IPv6地址(128 bit)
IPv6_HEADER,*PIPv6_HEADER;
TCP报头格式结构体,共20个字节:
typedef struct tcp_header
WORD SourPort; //源端口号
WORD DestPort; //目的端口号
DWORD SeqNo; //序号
DWORD AckNo; //确认序号
BYTE HLen; //首部长度(保留位)
BYTE Flag; //标识(保留位)
WORD Window; //窗口大小
WORD ChkSum; //校验和
WORD UrgPtr; //紧急指针
TCPHEADER,*PTCPHEADER;
UDP报头格式结构体,共8个字节:
typedef struct udp_header
u_short sport; //源端口号
u_short dport; //目的端口号
u_short len; //数据报长度
u_short crc; //校验和
UDPHEADER,*PUDPHEADER;
2.程序说明
程序1 利用WinPcap函数库函数解析捕获数据包的以太帧头
程序名:AnalyzeETH_WinPcap.htm
该程序通过利用WinPcap提供的捕获数据包函数,对网络中的数据包进行采集分析。
WinPcap中提供的函数pcap_open_live()可以获取网络适配器,通过函数pcap_loop(pcap_t*
p,int cnt,pcap_handle dispatch_handle,u_char* user)直接深入到数据链路层进行网络数据的捕
获,将捕获的数据传到函数dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char
*pkt_data)中,该函数的参数pkt_data指向的即是捕获的数据包。这样,我们可以捕获局域
网内数据链路层的以太帧,并按照以太帧头格式对数据包进行解析,以获得以太帧头中的有
关信息。同时将捕获数据存入磁盘中。通过该程序,可以分析出局域网内传输的各类网络层
数据包的情况。程序完整代码详见程序1(AnalyzeETH_WinPcap.CPP)。
程序2 利用WinPcap函数库函数解析捕获的IPv4数据报包头
程序名:AnalyzeIPv4_WinPcap.CPP
该程序同样通过WinPcap提供的函数,获取网络适配器,利用函数pcap_loop(pcap_t*
p,int cnt,pcap_handle dispatch_handle,u_char* user)捕获数据包。并将捕获的数据传到函数
dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中,在该函数中
对以太帧包进行过滤,将以太帧头中协议类型字段(ether_type)中值为0x0800的数据包进
行解析,即可得到整个IPv4分组的信息,其中从IPv4数据报头开始的前20个字节为IPv4
包头信息字段。同时将解析出的相关数据字段存入磁盘中。通过该程序,可以分析局域网内
各主机的网络使用情况。程序完整代码详见程序2(AnalyzeIPv4_WinPcap.CPP)。
程序3 利用WinPcap函数库函数解析捕获的IPv6数据报包头
程序名:AnalyzeIPv6_WinPcap.CPP
由于WinPcap提供的函数可以深入到数据链路层去捕获数据包,因此无论是IPv4数据
包还是IPv6数据包都是被封装在以太帧头中,因此都能够被捕获。本程序利用WinPcap提
供的函数,实现了过滤捕获并解析在纯IPv6环境或双协议栈环境下传输的IPv6数据包。捕
获的数据包以太帧头中协议类型(ether_type)字段值为0x86DD,则该数据包为纯IPv6环
境下传输的IPv6数据包,将随后的40个字节按照IPv6包头格式解析,即可得到IPv6包头
中携带的信息。对捕获的数据包进行过滤,在过滤出的IPv4数据包中分析IPv4包头,其中
proto字段值为0x29的数据包即为双协议栈下IPv6数据包,于是将IPv4包头后的40个字
节按照IPv6包头格式解析,即可得到IPv6包头中携带的信息。同样,解析过程都在函数
dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中进行。
if(eth_header->Etype[0]==0x86 && eth_header->Etype[1]==0xDD)
//纯IPv6环境下传输的IPv6数据包
else if(eth_header->Etype[0]==0x08 && eth_header->Etype[1]==0x00)
if(ip_header->prote==0x29)
//双协议栈环境下传输的IPv6数据包
该程序还进一步对IPv6中封装的TCP、ICMPv6、UDP包头进行了解析,其中TCP、
UDP包头格式与IPv4版本中的相同。
通过该程序,可以捕获不同网络环境下封装的IPv6数据包,并进行分析。完整代码详
见程序3(AnalyzeIPv6_WinPcap.CPP)。
程序4 利用WinPcap函数库函数解析捕获的TCP数据报包头
程序名:AnalyzeTCP_WinPcap.CPP
该程序通过利用WinPcap提供的函数pcap_loop(pcap_t* p,int cnt,pcap_handle
dispatch_handle,u_char* user)将数据包捕获。并在dispatch_handle(u_char *,const pcap_pkthdr
*header,const u_char *pkt_data)中通过编写代码实现解析。由于pkt_data中存放的是整个以
太帧,因此只要将指针跳到TCP包头开始处,然后按照TCP包头格式解析就可以读出其中
信息。程序中在解析数据包的同时,将解析结果存放到磁盘文件中。该程序通过对TCP包
头的解析,并进行分析,可以推断网络中是否存在某些网络攻击行为。完整代码详见程序4
(AnalyzeTCP_WinPcap.CPP)。
程序5 利用WinPcap函数库函数解析捕获的UDP数据报包头
程序名:AnalyzeUDP_WinPcap.CPP
该程序与AnalyzeTCP.CPP程序基本一样,通过利用WinPcap提供的函数pcap_loop
(pcap_t* p,int cnt,pcap_handle dispatch_handle,u_char* user)将数据包捕获,并在
dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中通过编写代码
实现解析。只要将指针改为跳到UDP包头开始处,然后按照UDP包头格式解析就可以读出
其中信息。程序中在解析数据包的同时,将解析结果存放到磁盘文件中。完整代码详见程序
5(AnalyzeUDP_WinPcap.CPP)。
程序6 利用WinPcap函数库函数发送TCP SYN帧数据报,进行SYN洪水攻击
程序名:SYNFlood_WinPcap.CPP
功能强大的WinPcap函数库不但能够捕获网络中的数据,还能利用它提供的函数,发
送自己构造数据链路层的数据报。因此,在本程序中,我们自己构造了一个SYN帧TCP数
据报,并将其封装到我们自己构造的IP报头和以太帧头中,其中IP报头中的源IP地址(程
序中设为1.1.1.1)和以太帧头中的源MAC地址(程序中设为
0x00,0x00,0x00,0x00,0x00,0x00)都是伪造的不存在的地址。将大量请求联接的数据报源源
不断地发送到目标主机,而对方无法把回应数据报传回源主机,这样就实现了对主机进行
SYN洪水攻击了。程序中的关键在于,封装在数据报中的校验和必须正确,否则目标主机
不会做任何反映。因此,程序中实现了一个计算校验和的函数,用于计算IP报头和TCP报
头中的校验和字段。校验和函数代码如下:
inline USHORT checksum(USHORT *buffer, int size)
unsigned long cksum=0;
while(size >1)
cksum+=*buffer++;
size -=sizeof(USHORT);
if(size )
cksum += *(UCHAR*)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
在计算IP校验和时,buffer中存放的是IP报头数据,而在计算TCP校验和时,buffer
中存放的是TCP伪头部和TCP头部数据。
将构造好的数据报通过函数pcap_sendqueue_queue(pcap_send_queue *squeue,struct
pcap_pkthdr *pktheader,u_char *pktdata)放到发送队列中,再利用函数
pcap_sendqueue_transmit(pcap_t *outdesc, pcap_send_queue *squeue,int sync)向目标主机发送。
即可实现SYN Flood攻击。完整代码详见程序6(SYNFlood_WinPcap.CPP)。
程序7 利用原始套接字捕获并解析IPv4数据包
程序名:AnalyzeIPv4_WINSOCK.CPP
该程序通过使用原始套接字过滤并捕获IPv4数据包,并对捕获数据包进行解析。程序
分为三部分,其中在函数InitWinsock2()内初始化Winsock2。在函数BindSocket()内,
利用winsock2提供的函数WSASocket()建立套接字,由于只有原始套接字可以深入到网
络层捕获数据包,因此WSASocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO
lpPorotocolInfo,GROUP g,DWORD dwFlags)中参数type要设为SOCK_RAW。因为是捕获
IP数据包,参数protocol设为IPPROTO_IP。然后将套接字进行绑定。这样就可以对网络进
行监听,捕获网络中的IPv4数据包了。在函数RecieveIPv4()函数中,对捕获的数据进行
解析。完整代码详见程序AnalyzeIPv4_WINSOCK.CPP。
程序8 利用原始套接字捕获并解析双协议栈下IPv6数据包
程序名:AnalyzeIPv6_WINSOCK.CPP
该程序通过使用原始套接字过滤并捕获双协议栈下IPv6数据包,并对捕获数据包进行
解析。与程序AnalyzeIPv4_WINSOCK.CPP一样,本程序分为四部分,分别完成初始化套接
字,建立并绑定套接字,捕获数据包并分析。因为IPv6数据包封装在IPv4包头中,因此套
接字按IPv4套接字的建立,即WSASocket(int af,int type,int
protocol,LPWSAPROTOCOL_INFO lpPorotocolInfo,GROUP g,DWORD dwFlags)中参数af
设为AF_INET,参数type要设为SOCK_RAW。因为是捕获IP数据包,参数protocol设为
IPPROTO_IP。完整代码详见程序AnalyzeIPv6_WINSOCK.CPP。
程序9 利用原始套接字捕获并解析TCP数据包
程序名:AnalyzeTCP_WINSOCK.CPP
该程序通过使用原始套接字过滤并捕获TCP数据包,并对捕获数据包进行解析。与程
序AnalyzeIPv4_WINSOCK.CPP一样,对套接字进行初始化、建立并绑定后,在RecieveTCP
()函数中获取TCP数据包字段,按照TCP包头格式解析,可获取完整的TCP数据包数据。
完整代码详见程序AnalyzeTCP_WINSOCK.CPP。
程序10 利用原始套接字捕获并解析UDP数据包
程序名:AnalyzeUDP_WINSOCK.CPP
该程序通过使用原始套接字过滤并捕获UDP数据包,并对捕获数据包进行解析。与程
序AnalyzeTCP_WINSOCK.CPP一样,对套接字进行初始化、建立并绑定后,在RecieveTCP
()函数中获取TCP数据包字段,按照TCP包头格式解析,可获取完整的TCP数据包数据。
完整代码详见程序AnalyzeUDP_WINSOCK.CPP。
程序11 利用原始套接字发送TCP SYN帧,对目标主机进行SYN洪水攻击
程序名:SYNFlood_WINSOCK.CPP
本程序利用原始套接字发送TCP数据包,对目标主机进行SYN Flood攻击。程序中函
数socket(AF_INET,SOCK_RAW,IPPROTO_IP);将套接字设为原始套接字。并通过函数
setsockopt(SOCKET s,int level,int optname,const char*optval,int optlen);设置头包含选项,其中
IP_HDRINCL是IPPROTO_IP选项级别,若将IP_HDRINCL选项设为TRUE,发送函数会
将IPv4头包含在自己发送的数据前面,因此,在调用一个Winsock发送函数时,必须在数
据前面包含完整的IPv4头。与WinPcap不同的是,原始套接字只能深入到网络层,故只需
构造IPv4包头和TCP包头。将构造好的、计算出正确校验和的数据包放入缓冲区,通过sendto
(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)向目标主机发
送,即达到攻击目的。
程序12 采集局域网内若干台主机网络数据并分析网络流量的综合应用程序
程序名:LANSecrutiny
本程序分为几个模块:探测局域网内运行主机;后台采用动态链表存放采集到所需的
网络数据;图示局域网及每台主机的网络流量随时间的折线变化;监听结束后多线程进行数
据存盘。
? 探测局域网内运行主机
要对局域网内主机进行监听,采集其网络数据,首先必须知道局域网内正在运行的主
机。为迅速获得主机是否处于运行状态的消息,只要向局域网内所有主机发送ARP数据包,
并根据回应的数据报分析,即可得到答案。因为一局域网的网关和子网掩码是已知的,因此,
我们可以计算出这一局域网的IP地址范围。在本程序中,我们利用WinPcap提供的发送数
据报函数pcap_sendpacket(pcap_t *adhandle,unsigned char*sendbuf,int size),向所有主机分别
发送自己构造的请求ARP数据报,捕获回应的ARP数据报并解析,即可获知网内运行主机
的MAC地址及IP地址。详细代码见程序13中LANSecrutinyDlg.CPP文件内SendARPtoGetIP
()函数。
利用此方法,可使该程序在不同网段使用,增强了程序的灵活性。
? 采用动态链表存放采集到的网络数据
为使程序具有良好的伸缩性,能根据网络数据采集情况动态的分配内存,不致造成内
存浪费或内存空间过小的情况发生。在本程序中,我们将采集的所需数据存放到链表中。在
函数dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中,我们按
照前述几个程序中对数据报解析的方法,将捕获数据报个报头中的所需数据提取出来,并存
入一个链表节点中。然后将该存放完数据的节点插入到链表的结尾处。
本程序设计为可以将IPv4数据报数据和IPv6数据报数据存放如同一链表中,而IPv4
地址为32位,IPv6地址为128位。因此我们将节点中存放IP地址的元素设置为一个有17
个元素的数组,将数组的第一个元素IPaddr[0]作为判断值。如果是IPv4数据报,则IPaddr[0]
的值为0,并将IPv4地址放入随后的4个元素中,如果是IPv6数据报,则IPaddr[0]的值为
1,并将IPv6地址放入随后的16个元素中。
由于ICANN为0~1023端口各命名了一个端口名。因此,我们在程序中,通过函数
getportname()为有端口名的端口查找其端口名,这样便进一步了解数据包的高层协议类型。
void getportname(int portn,char portch[],char *protocol)
if(getservbyport(htons(portn),protocol)!=NULL)
strcpy(portch,getservbyport(htons(portn),protocol)->s_name);
else
sprintf(portch,"%d",portn);
在该函数中,我们将捕获的端口号值portn和协议类型protocol传入,通过Winsock2提供的
函数getservbyport()将找到的端口名传回给节点元素portch。
通过该程序将捕获的数据报中重要数据存放入链表中,我们可以清楚的了解被监听主
机与外界交流的时间、类型以及对放地址等情况。完整代码详见程序LANSecrutiny中
dispatcher_handler()函数。
? 采用多线程技术进行数据存盘
由于程序中我们设计成为每台被监听主机产生两根链表存放进、出数据,因此对n台
主机进行监听时,会产生2*n条链表。为解决多条链表存盘问题,我们采用多线程技术,这
样能使各条链表的存盘工作不相互影响,避免了由于一条链表在存盘过程中出现错误而使其
后其它链表无法再进行存盘,从而造成采集数据的丢失。存盘时,我们将链表中一个节点拷
贝到临时节点中,再进行保存,这样避免了存盘时由于某些原因造成对链表的破坏而影响存
盘工作。详细代码见程序LANSecrutiny中SavePacket()函数。
? 图示网络流量
通过图示的方法,能使我们更快的了解网络流量状况。因此在程序中我们设计了对整
个局域网机每台主机的网络流量图示。
在程序中,为将流量用折线方式绘制出来,我们设计了一个数组,用于存放流量值,
其中,第一个元素存放当前时间流量值,第二个元素存放前一秒流量值,以此类推,第n
个元素存放n秒前流量。这样,在绘图时就能将不同时间的流量用折线连接起来。
在函数OnTimer()中加入以下代码:
if(postion[0]>=360) postion[0]=358;
for(i=125;i>0;i--) postion[i]=postion[i-1];
在函数OnPaint()中加入以下代码:
for(i=0;i<125;i++)
MoveToEx(hdc,15+i*5,385-postion[i],NULL);
LineTo(hdc,15+(i+1)*5,385-postion[i+1]);
完整代码详见程序LANSecrutiny中AnalyzeDlg.CPP内各函数。
以上程序还有很多不足之处,恳请指正。谢谢! 参考技术B 楼上说的对,这不是一句两句话能说玩的,问题也不是一分钟两分钟能解决的了的,编写代码不是一天两天能搞定的。。。楼主,我劝你还是不要对这里报希望了 参考技术C 这个不是一两句就能打完字的。哎
计算机网络湖科大微课堂笔记 p36-37 集线器与交换机的区别以太网交换机自学习和转发帧的流程
集线器与交换机的区别
集线器:共享型以太网
交换机:交换式以太网
早期与集线器
使用集线器HUB在物理层拓展以太网
下面是三个独立的以太网,可以用集线器把它们互联形成更大的以太网。
若一系中的某主机向二系中某主机发送数据帧,则此信号会传遍整个以太网的各主机。
简单对比:集线器HUB VS 交换机SWITCH
ps:忽略ARP过程;假设交换机的帧交换表已经“学习好了”。
以太网交换机
举例对比集线器和交换机
单播帧:
集线器:发送给所有主机,只有目的主机会接收帧。
交换机:发送给目的主机。
广播帧:
从效果上看没什么区别。
多台主机发送单播帧的情况:
使用集线器的以太网:产生碰撞。
使用交换机的以太网:交换机会将要传输的帧存储转发,不会产生碰撞。
使用集线器拓展以太网 和 使用交换机拓展以太网 的区别:
发送单播帧:
广播帧:
从效果上看是一样的。
对于使用集线器拓展以太网:从逻辑上来说它是一个共享信道,参与竞争的主机变多了,碰撞域也变大了,如:
同样的传输任务,在使用交换机拓展以太网上就不会产生碰撞:
集线器:扩大广播域和碰撞域
交换机:扩大广播域、隔离碰撞域
小结
以太网交换机自学习和转发帧的流程
举例说明其自学习流程:
假设这里有两个以太网通过交换机连接起来。
假设:
A->B:A要给B发送帧。
该帧通过交换机1的接口1进入交换机,交换机1 登记 主机A所对应的接口1.
上述登记工作就是 交换机的自学习。
接下来,交换机1对帧进行转发:先查帧交换表看B在哪里,找不到,就盲目地转发,也成为泛洪:即把帧转发给交换机1的除了发送口之外的所有接口。
主机B会接收该帧,主机C会丢弃该帧。
该帧进入交换机2,交换机2会登记主机A的接口为2(交换机2的接口2).
之后,交换机2会对该帧进行转发:先查表找B,找不到,就盲目地转发,然后主机DEF都会将其丢弃。
接下来,B->A:
- 交换机1会登记B的接口号3.
- 交换机1要转发帧,先查表找A
- 找到A的接口为1,就转发。
- 交换机2不会收到该帧(因为交换机1没有泛洪)
接下来:E->A
- 该帧从交换机2的接口3进入交换机,则交换机2把E在接口3登记在帧交换表中
- 交换机2要转发帧,查表找A,找到接口为2,即把帧转发到接口2
- 交换机1收到该帧,先把E登记在接口4登记在帧交换表中
- 查表找A,找到接口为1,既把帧转发到接口1
接下来,为了演示以太网交换机丢弃帧的情况,我们给交换机1的接口1增加一个主机G:
G->A:
- 主机A、G和交换机1都在同一条总线上,主机G想给A发送帧,则A和交换机1都能收到
- A会接收帧
- 交换机1收到该帧后,对G登记其接口为1
- 交换机1要转发该帧,查表找A,发现A的接口与G的接口一样,即目的接口和发送接口一样,则交换机1会丢弃该帧
- 交换机2不会收到该帧
交换机自学习一段时间后,帧交换表中就有了各主机的MAC地址和接口的对应记录。
每条记录都有自己的有效时间。
MAC地址与交换机接口的对应关系不是永久性的: 主机可能更换网络,也可能更换网卡(MAC地址)。
之前提到过的ARP高速缓存表,表中的IP地址与MAC地址的对应关系记录也是会定期自动删除的,原因也如上。
例题
例1:
解:
例2:
解:
A。
例3:
解:
B。
如果错了那就把上面的自学习流程再看一次。
小结
以上是关于以太网数据帧的监听与分析的主要内容,如果未能解决你的问题,请参考以下文章