原始套接字
直接在网络接口上、IP 之下发送和接收以太网帧。完全不通过 TCP 或 UDP 承载的协议——例如 PROFINET 实时流量——就需要这种方式。
它通过 libpcap 进行捕获和注入,因此主机需要安装 libpcap(Linux、macOS)或 Npcap(Windows),并且进程需要具备以捕获模式打开接口的权限——root、CAP_NET_RAW,或属于该抓包设备所属的某个用户组。
传输语法
该传输方式所需的一切都来自其配置参数,连接字符串的地址部分不会被解析。因此,使用它的驱动程序要么将其留空,要么填入对该驱动程序本身有意义的内容。
示例
profinet://?raw-socket.interface-name=en0&raw-socket.remote-address=00:0e:cf:12:34:56&raw-socket.protocol-id=34962| Name | Type | Default Value | Required | Description |
|---|---|---|---|---|
| Name | Type | Default Value | Required | Description |
Raw Socket(以太网)
Code
raw-socket
Maven 依赖
<dependency>
<groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-transports-raw-socket</artifactId>
<version>1.0.0</version>
</dependency>配置选项:
raw-socket.interface-name
STRING
要使用的网络接口名称(例如 "eth0"、"en0"、Windows 上的 "\\Device\\NPF_{GUID}")。若未指定,将使用第一个可用的接口。
raw-socket.local-address
STRING
用于发送数据的本地 MAC 地址。如果未设置,则使用该接口的 MAC 地址。
raw-socket.remote-address
STRING
必填
要发送到的远程 MAC 地址。
raw-socket.protocol-id
INT
必填
EtherType / 协议号(例如,PROFINET 为 0x88B5,LLDP 为 0x88CC,也可使用自定义值)
raw-socket.promiscuous-mode
BOOLEAN
false
混杂模式 —— 捕获网络上的所有数据包,而不仅仅是发送到该接口的数据包。
raw-socket.capture-timeout
INT
1000
以毫秒为单位的数据包捕获超时时间。
raw-socket.snapshot-length
INT
65536
快照长度 - 每个数据包捕获的最大字节数。0 表示捕获整个数据包。
raw-socket.buffer-size
INT
1048576
用于抓包的缓冲区大小,单位为字节。
raw-socket.receive-queue-size
INT
1048576
被捕获帧在被丢弃前,可供消费者等待处理的字节数。
raw-socket.vlan-id
INT
0
VLAN ID(0 表示无 VLAN 标签)。范围:0-4095
raw-socket.vlan-priority
INT
0
VLAN 优先级(0-7)。仅在 vlanId > 0 时使用。
raw-socket.reuse-interface
BOOLEAN
false
跨多个传输实例复用底层网络接口。当设置为 true 时,使用相同接口和协议的实例将共享同一个 pcap 句柄。这对于多个逻辑连接共用同一以太网类型的协议非常有用。
raw-socket.bpf-filter
STRING
用于过滤数据包的 BPF(伯克利包过滤器,Berkeley Packet Filter)表达式。
raw-socket.max-frame-size
INT
1500
以字节为单位的最大帧大小 (MTU)。
raw-socket.read-timeout-ms
INT
0
用于阻塞读取的读取超时时间,单位为毫秒。
raw-socket.include-ethernet-header
BOOLEAN
false
将完整的以太网帧传递给驱动程序,并在发送时接受原始以太网帧。对于自行构建自身以太网帧头的 L2 协议,这是必需的。
raw-socket.remote-address 和 raw-socket.protocol-id 没有合理的默认值,必须显式指定。协议 id 即 EtherType —— PROFINET 为 0x88B5 (34997) 和 0x8892 (34962),LLDP 为 0x88CC (35020)。
如果在高负载下出现帧丢失,请调高 raw-socket.receive-queue-size —— 该值限定了在丢弃最旧帧之前,允许等待驱动程序处理的已捕获帧字节数上限。 |
|---|
评论
登录后参与评论
KnowForge