OSI参考模型:开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),
在TCP/IP协议簇中网络接口层对应于OSI的物理层和数据链路层,网络接口层实际上并不是因特网协议组中的一部分,它与OSI模型中的物理层和数据链路层对应。
物理层包含了多种与物理介质相关的协议,这些物理介质用以支撑TCP/IP通信,数据链路层包含了控制物理层的协议,比如如何访问介质。上层协议把数据封装好之后,要经过数据链路层来控制物理层(比如网卡硬件)把数据转换成电信号发送出去,另一端的网卡硬件接收到电信号在通过数据链路层一层一层的上传到上层的协议。这一节,我们就集中在数据链路层的实现上。
1、获取可用的网卡硬件
电脑中只有一个是可以用来收发数据的网卡,其他的是虚拟网卡,我们要找出真正的网卡,
package dataLinkLayer;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
public class ProtocolEntry {
public static void main(String[] args) {
NetworkInterface device = getDevice();
System.out.println("真实网卡名称:" + device.name);
}
private static NetworkInterface getDevice() {
// 获取网卡列表
NetworkInterface[] deviceList = JpcapCaptor.getDeviceList();
// 其中就一个是真实的网卡,其他的是虚拟网卡,是不能发送数据的。
System.out.println("共有网卡数量:" + deviceList.length);
// 找到真实的网卡
int index = 0;
if (deviceList.length > 1) {
index = 1;
}
return deviceList[index];
}
}
打印结果:
共有网卡数量:6
真实网卡名称:\Device\NPF_{B3DA4FD7-C889-42E4-BDD5-CD6FFE81A668}
2、模拟数据链路层
jpcap要想从网卡获取数据,我们创建DataLinkLayer类并且实现PacketReceiver接口,然后把DataLinkLayer类的实例作为参数传入lpcap的loopPacket函数来监听我们的网卡。
下面是DataLinkLayer类,
public class D