时间:2021-05-22
发送端代码:
#!/usr/bin/python# -*- coding: UTF-8 -*-import socketimport structraw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234))raw_socket.bind(("eth0", 0))packet = struct.pack("!6s6sH", "\xff\xff\xff\xff\xff\xff", "\xaa\xaa\xaa\xaa\xaa\xaa", 0x1234)while True: print repr(packet) raw_socket.send(packet + "hello,world!")1.创建套接字使用地址家族PF_PACKET,类型为SOCK_RAW,自定义类型为0x1234,这个和C语言一模一样。自定义类型我们也可以使用0X0800,这个是ETH_P_IP,相当于我们模拟ip包来发送,那么ip包头和mac包头都需要我们自己填写。现在我们使用0x1234,系统定义之外的协议类型。
2.由于是发送二层包,我们默认网卡没有配置网络,也就是ping不通的情况下,直接绑定网卡上。
3.linux内核中定义的mac包头结构
struct ethhdr{ unsigned char h_dest[6]; unsigned char h_source[6]; uint16_t h_proto; //0x1234};第一个是目的mac地址,第二个是本机mac地址,第三个是自定义类型必须填写,这样对方也关心这个自定义类型时,协议栈收到二层包才能正确给到对方的套接字。通过这个结构体,所以使用了pack,”!6s6sH”。我这里使用的广播地址发送。
接收端代码:
以上这篇python使用原始套接字发送二层包(链路层帧)的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
交换机工作在osi第二层,即数字链路层。二层的报头中包含源目MAC地址,最后成帧发送。只有收帧和发帧而不是收包发包。定义了如何标识设备。 网络交换机(英语:N
二层交换机是指只支持OSI第二层(数据链路层)交换技术的交换机,二层交换技术发展比较成熟,二层交换机属数据链路层设备,可以识别数据包中的MAC地址信息,根据MA
交换机二层和三层区别是:二层交换机工作于OSI模型的第2层(数据链路层),故而称为二层交换机。二层交换技术是发展比较成熟,二层交换机属数据链路层设备,可以识别数
网桥工作在osi第二层即数据链路层,数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。 数据链路层定义了在单个链路上如何传输数据。这些协议与被讨
交换机工作在osi第二层,即数字链路层。数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其