捕获并分析帧和IP报文

计算机网络实验3

实验目的

  • 捕获并分析以太网的帧,获取目标与源网卡的MAC 地址
  • 获取本机地址
  • 获取远端MAC地址

实验环境

  • Windows 10
  • C#
  • Visual Studio 2017

实验结果

测试时,设置为超过10000Bps就会报警

实验结果

实验总结

全局初始化

安装WinPcap和SharpPcap

using

struct

全局变量

初始化

查看网卡信息

通过调用ipconfig.exe实现

ipconfig

适配器

适配器

计时动作

计时动作

载入适配器列表

load_devices

载入适配器信息

载入适配器信息

开始侦听

start

收包动作

收包

成帧

成帧1

成帧2

成帧3

成帧4

成帧5

成帧6

成帧7

BitConverter

成帧时修改流量统计

更新流量统计

监视流量

计算流量

报警

暂停侦听

pause

继续侦听

continue

停止侦听

stop

保存日志

save_diary

退出程序

exit

技术细节

计算流量的方法

构建新结构体(mac + ip +mode)放进dictionary当key,各key累计收发包大小当value。

新建线程,每隔1s遍历各来源的收发流量,超过1MB的,可以认为在这1s内平流量达到1MBps以上,故而给本机警告

遍历dictionary

因为多线程同时在访问dictionary,所以会出现在一个线程遍历dictionary的时候,另一个线程正在新增dictionary的项。此时采用foreach遍历会报错,因为foreach要求正在遍历的对象不能有变化

有网络但侦听不到包体

如果确认程序没错,那么可能是

  1. 选错网卡,要注意选一个有网络的网卡
  2. 当前的网络收发包类型不是ip and tcp,应该是filter的问题,关掉filter即可

BitConverter

会反向获取。

如,现有byte[] test={0x01,0x10,0x0f,0xff};

二进制为00000001 00010000 00001111 11111111

十进制为17829887

此时进行uint ans=BitConverter.ToUInt32(test,0);

会得到ans= 4279177217

十六进制为ff0f1001

二进制为11111111 00001111 00010000 00000001

可见不能得到想要的结果,因为BitConverter会反向转换所给的byte数组

所以应该先将要转换的数组反向,再使用BitConverter

参考链接

SharpPcap

--It's the end.Thanks for your read.--