基于MAC地址进行通讯

charryli 2016-05-11 09:37:04
加精
与西门子PLC通讯,因为西门子PLC没有设置IP(不能修改),只能通过MAC地址通讯,西门子SimaticNET软件可以实现基于MAC地址通讯,现在我想实现链路层通讯,应该怎么办?就是建立Socket的过程。

...全文
3629 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jenkins2012 2018-12-18
  • 打赏
  • 举报
回复
引用 29 楼 charryli 的回复:
[quote=引用 19 楼 shenyi0106 的回复:]
[quote=引用 15 楼 bsnry 的回复:]
[quote=引用 12 楼 shenyi0106 的回复:]
如果是在二层网络传输数据的话,有MAC地址就够了,因为交换机只认MAC地址。
但是如果你要用socket来传输数据的话,需要驱动层协议栈的支持,并且提供socket相关的接口,不知道你的系统有没有对应的驱动接口?如果没有,自己写或者移植linux内核的,估计工作量很大。

给你的一个建议:
如果没有完整的协议栈和socket接口的话,你可以尝试自己组包UDP和解析,这种四层协议很简单,不需要复杂的协议栈,不需要维护连接状态,组包后直接通过硬件发送就可以了(没有IP的话,路由表也就省掉了);接收时,自己分析协议,拆掉二层头,三层头,四层头,然后提取数据



socket api, 能够直接传输以太帧,表示很好奇?

arp包到时在数据链路层上, 不知道是怎么发送,接受的, [/quote]

提出这个问题的时候,请童靴自觉去看一下计算机网络基础。。。。

基于以太网的通讯协议,所有在链路上传输的数据都会被网卡(网卡驱动)封装成以太网帧,封装以太网帧时发送过程的倒数第二步,最后一步就是通过硬件发送以太网帧到物理链路上(双绞线或者光纤介质)。socket(严格来说,是socket相应的驱动部分)负责封装四层头(也就是tcp或者udp帧,ICMP等也可以勉强算作是四层协议),然后协议栈(严格来说,还应该加上路由表以及路由选路相关的驱动部分)负责封装三层头(也就是IP帧),最后由网卡驱动把IP帧封装成以太网帧,由网卡送往物理链路。

好了,以上是理论,给你个实际点的,linux下的socket编程,可以通过PF_PACKET这个选项创建一个RAW socket,这个socket是可以直接发送以太网帧的,不过这个以太网帧是需要你自己组包的,socket只负责帮你送到物理链路上。

话题在转回来,如果知道MAC地址,且只在二层网络上传输数据的话,那么只要知道对方的MAC地址就可以了,交换机就可以帮你把你的数据转发给目的MAC所对应的主机,这时三层头上的src和dst,以及四层头上sport和dport都可以瞎写(但是要注意效验和问题,有些效验和是硬件做的,如果效验和不正确,网卡直接就把数据包丢了),因为这些信息交换机并不提取,你写啥对交换机而言都是无所谓的。

如果在二层网络上,你的数据能够正确被送达目的地,那么接收的时候,就需要在网卡驱动这一层做处理(因为你的三层头和四层头都是瞎写的,没有相应的路由和协议栈来支撑你的数据到达应用层),在网卡驱动的收包很简单,只要判断目的MAC是否和网卡的MAC一致,一致就把包收上来,不一致就丢掉(注意ARP广播和01开头的组播,这两个包网卡也会收上来),然后判断一下,自己把瞎写的三层和四层头去掉,剩下的就是你所传输的数据了。

这里有个大胆的设想,我觉得你甚至可以去掉三层和四层头,直接用以太网帧包你的数据,我觉得应该也可行,你可以尝试一下。[/quote]


谢谢回复,你的思路对我很有用,非常感谢![/quote]


这个思路很棒,可以直接绕过IP做通讯传输,一大突破。
qq_27638253 2016-05-21
  • 打赏
  • 举报
回复
你直接设个IP,只下载这个模块的硬件配置,对运行系统没有影响呀
charryli 2016-05-20
  • 打赏
  • 举报
回复
关于ip的问题 西门子plc可以通过tcp/ip通讯,也可以直接根据MAC地址通讯,由于现场没有启用ip,且运行系统不能修改,所以只能通过MAC进行通讯。
charryli 2016-05-20
  • 打赏
  • 举报
回复
引用 19 楼 shenyi0106 的回复:
[quote=引用 15 楼 bsnry 的回复:] [quote=引用 12 楼 shenyi0106 的回复:] 如果是在二层网络传输数据的话,有MAC地址就够了,因为交换机只认MAC地址。 但是如果你要用socket来传输数据的话,需要驱动层协议栈的支持,并且提供socket相关的接口,不知道你的系统有没有对应的驱动接口?如果没有,自己写或者移植linux内核的,估计工作量很大。 给你的一个建议: 如果没有完整的协议栈和socket接口的话,你可以尝试自己组包UDP和解析,这种四层协议很简单,不需要复杂的协议栈,不需要维护连接状态,组包后直接通过硬件发送就可以了(没有IP的话,路由表也就省掉了);接收时,自己分析协议,拆掉二层头,三层头,四层头,然后提取数据
socket api, 能够直接传输以太帧,表示很好奇? arp包到时在数据链路层上, 不知道是怎么发送,接受的, [/quote] 提出这个问题的时候,请童靴自觉去看一下计算机网络基础。。。。 基于以太网的通讯协议,所有在链路上传输的数据都会被网卡(网卡驱动)封装成以太网帧,封装以太网帧时发送过程的倒数第二步,最后一步就是通过硬件发送以太网帧到物理链路上(双绞线或者光纤介质)。socket(严格来说,是socket相应的驱动部分)负责封装四层头(也就是tcp或者udp帧,ICMP等也可以勉强算作是四层协议),然后协议栈(严格来说,还应该加上路由表以及路由选路相关的驱动部分)负责封装三层头(也就是IP帧),最后由网卡驱动把IP帧封装成以太网帧,由网卡送往物理链路。 好了,以上是理论,给你个实际点的,linux下的socket编程,可以通过PF_PACKET这个选项创建一个RAW socket,这个socket是可以直接发送以太网帧的,不过这个以太网帧是需要你自己组包的,socket只负责帮你送到物理链路上。 话题在转回来,如果知道MAC地址,且只在二层网络上传输数据的话,那么只要知道对方的MAC地址就可以了,交换机就可以帮你把你的数据转发给目的MAC所对应的主机,这时三层头上的src和dst,以及四层头上sport和dport都可以瞎写(但是要注意效验和问题,有些效验和是硬件做的,如果效验和不正确,网卡直接就把数据包丢了),因为这些信息交换机并不提取,你写啥对交换机而言都是无所谓的。 如果在二层网络上,你的数据能够正确被送达目的地,那么接收的时候,就需要在网卡驱动这一层做处理(因为你的三层头和四层头都是瞎写的,没有相应的路由和协议栈来支撑你的数据到达应用层),在网卡驱动的收包很简单,只要判断目的MAC是否和网卡的MAC一致,一致就把包收上来,不一致就丢掉(注意ARP广播和01开头的组播,这两个包网卡也会收上来),然后判断一下,自己把瞎写的三层和四层头去掉,剩下的就是你所传输的数据了。 这里有个大胆的设想,我觉得你甚至可以去掉三层和四层头,直接用以太网帧包你的数据,我觉得应该也可行,你可以尝试一下。[/quote] 谢谢回复,你的思路对我很有用,非常感谢!
inviteezhao 2016-05-17
  • 打赏
  • 举报
回复
没有ip,基于tcp/ip协议的通讯不可能实现。
Java_er 2016-05-13
  • 打赏
  • 举报
回复
要是MAC改了怎么半?
qq_27638253 2016-05-13
  • 打赏
  • 举报
回复
通讯协议经过,tcp/ip封装的,没IP你不可能访问
qq_27638253 2016-05-13
  • 打赏
  • 举报
回复
不可能,西门子所有系列plc的网络模块都能设置IP
理想三旬 2016-05-12
  • 打赏
  • 举报
回复
好奇,,顶一下
hslinux 2016-05-12
  • 打赏
  • 举报
回复
没有设置ip,不等于没有ip,没有分配ip,或者DHCP自动分配ip失败之后,会有一个169.254.xxx.xxx这个类型的ip地址的。 看看是不是会有这样的ip存在。 使用mac地址通讯这么高大上的东西,真心没用过。 个人脑洞大开一下,觉得不可能。如果可以,还要ip地址来干嘛。。。。。。。
u011139493 2016-05-12
  • 打赏
  • 举报
回复
知道MAC地址直接发送数据肯定从逻辑上是没问题的 OSI 7层的模型也就是一层承载一层的“荷载”。。。 要从操作系统的出发点看这个问题,至少你不能直接用操作系统(WIN和*nux都不行)的网络接口API,更深一层是现成的网卡驱动程序API都不能用,要绕过操作系统直接去驱动网卡(写出来的东西肯定是专机专用),而且很少网卡的SDK是开放到数据链路层的(intel的肯定行),那么就直接往网卡I/O硬件地址加载MAC地址,荷载,数据,校验,成帧,TX/RX就行了。 何必要重做轮子?
shenyi0106 2016-05-12
  • 打赏
  • 举报
回复
如果是在二层网络传输数据的话,有MAC地址就够了,因为交换机只认MAC地址。 但是如果你要用socket来传输数据的话,需要驱动层协议栈的支持,并且提供socket相关的接口,不知道你的系统有没有对应的驱动接口?如果没有,自己写或者移植linux内核的,估计工作量很大。 给你的一个建议: 如果没有完整的协议栈和socket接口的话,你可以尝试自己组包UDP和解析,这种四层协议很简单,不需要复杂的协议栈,不需要维护连接状态,组包后直接通过硬件发送就可以了(没有IP的话,路由表也就省掉了);接收时,自己分析协议,拆掉二层头,三层头,四层头,然后提取数据
cattpon 2016-05-12
  • 打赏
  • 举报
回复
learning~
shenyi0106 2016-05-12
  • 打赏
  • 举报
回复
引用 15 楼 bsnry 的回复:
[quote=引用 12 楼 shenyi0106 的回复:] 如果是在二层网络传输数据的话,有MAC地址就够了,因为交换机只认MAC地址。 但是如果你要用socket来传输数据的话,需要驱动层协议栈的支持,并且提供socket相关的接口,不知道你的系统有没有对应的驱动接口?如果没有,自己写或者移植linux内核的,估计工作量很大。 给你的一个建议: 如果没有完整的协议栈和socket接口的话,你可以尝试自己组包UDP和解析,这种四层协议很简单,不需要复杂的协议栈,不需要维护连接状态,组包后直接通过硬件发送就可以了(没有IP的话,路由表也就省掉了);接收时,自己分析协议,拆掉二层头,三层头,四层头,然后提取数据
socket api, 能够直接传输以太帧,表示很好奇? arp包到时在数据链路层上, 不知道是怎么发送,接受的, [/quote] 提出这个问题的时候,请童靴自觉去看一下计算机网络基础。。。。 基于以太网的通讯协议,所有在链路上传输的数据都会被网卡(网卡驱动)封装成以太网帧,封装以太网帧时发送过程的倒数第二步,最后一步就是通过硬件发送以太网帧到物理链路上(双绞线或者光纤介质)。socket(严格来说,是socket相应的驱动部分)负责封装四层头(也就是tcp或者udp帧,ICMP等也可以勉强算作是四层协议),然后协议栈(严格来说,还应该加上路由表以及路由选路相关的驱动部分)负责封装三层头(也就是IP帧),最后由网卡驱动把IP帧封装成以太网帧,由网卡送往物理链路。 好了,以上是理论,给你个实际点的,linux下的socket编程,可以通过PF_PACKET这个选项创建一个RAW socket,这个socket是可以直接发送以太网帧的,不过这个以太网帧是需要你自己组包的,socket只负责帮你送到物理链路上。 话题在转回来,如果知道MAC地址,且只在二层网络上传输数据的话,那么只要知道对方的MAC地址就可以了,交换机就可以帮你把你的数据转发给目的MAC所对应的主机,这时三层头上的src和dst,以及四层头上sport和dport都可以瞎写(但是要注意效验和问题,有些效验和是硬件做的,如果效验和不正确,网卡直接就把数据包丢了),因为这些信息交换机并不提取,你写啥对交换机而言都是无所谓的。 如果在二层网络上,你的数据能够正确被送达目的地,那么接收的时候,就需要在网卡驱动这一层做处理(因为你的三层头和四层头都是瞎写的,没有相应的路由和协议栈来支撑你的数据到达应用层),在网卡驱动的收包很简单,只要判断目的MAC是否和网卡的MAC一致,一致就把包收上来,不一致就丢掉(注意ARP广播和01开头的组播,这两个包网卡也会收上来),然后判断一下,自己把瞎写的三层和四层头去掉,剩下的就是你所传输的数据了。 这里有个大胆的设想,我觉得你甚至可以去掉三层和四层头,直接用以太网帧包你的数据,我觉得应该也可行,你可以尝试一下。
gaoawzh 2016-05-12
  • 打赏
  • 举报
回复
ksidesi 2016-05-12
  • 打赏
  • 举报
回复
感谢大神分享
bsnry 2016-05-12
  • 打赏
  • 举报
回复
引用 12 楼 shenyi0106 的回复:
如果是在二层网络传输数据的话,有MAC地址就够了,因为交换机只认MAC地址。 但是如果你要用socket来传输数据的话,需要驱动层协议栈的支持,并且提供socket相关的接口,不知道你的系统有没有对应的驱动接口?如果没有,自己写或者移植linux内核的,估计工作量很大。 给你的一个建议: 如果没有完整的协议栈和socket接口的话,你可以尝试自己组包UDP和解析,这种四层协议很简单,不需要复杂的协议栈,不需要维护连接状态,组包后直接通过硬件发送就可以了(没有IP的话,路由表也就省掉了);接收时,自己分析协议,拆掉二层头,三层头,四层头,然后提取数据
socket api, 能够直接传输以太帧,表示很好奇? arp包到时在数据链路层上, 不知道是怎么发送,接受的,
bsnry 2016-05-12
  • 打赏
  • 举报
回复
引用 15 楼 bsnry 的回复:
[quote=引用 12 楼 shenyi0106 的回复:] 如果是在二层网络传输数据的话,有MAC地址就够了,因为交换机只认MAC地址。 但是如果你要用socket来传输数据的话,需要驱动层协议栈的支持,并且提供socket相关的接口,不知道你的系统有没有对应的驱动接口?如果没有,自己写或者移植linux内核的,估计工作量很大。 给你的一个建议: 如果没有完整的协议栈和socket接口的话,你可以尝试自己组包UDP和解析,这种四层协议很简单,不需要复杂的协议栈,不需要维护连接状态,组包后直接通过硬件发送就可以了(没有IP的话,路由表也就省掉了);接收时,自己分析协议,拆掉二层头,三层头,四层头,然后提取数据
socket api, 能够直接传输以太帧,表示很好奇? arp包到时在数据链路层上, 不知道是怎么发送,接受的, [/quote] arp包到时在数据链路层上, 不知道是怎么发送,接受的, 这句话请无视, 手打字错了
杏雨里云 2016-05-11
  • 打赏
  • 举报
回复
heike1235 2016-05-11
  • 打赏
  • 举报
回复
加载更多回复(6)

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧