传输方式

原始套接字

qianmoQqianmoQ· 更新于 2026-10-01· 阅读 6 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

直接在网络接口上、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
NameTypeDefault ValueRequiredDescription
NameTypeDefault ValueRequiredDescription

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 —— 该值限定了在丢弃最旧帧之前,允许等待驱动程序处理的已捕获帧字节数上限。

评论

登录后参与评论

正在加载评论…