L2 socket即链路层socket,用来手动构造frame。我们可以通过这个实验来理解以太网的数据结构。
首先用VMware构造一个虚拟的网络,将3台主机用LINK连接起来。
在其中的主机h1上执行ifconfig找到我们的虚拟链接:
engineer@netlab1:~$ ifconfigens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.40.131 netmask 255.255.255.0 broadcast 192.168.40.255 inet6 fe80::8156:8ce5:6bbf:4579 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:79:b4:8a txqueuelen 1000 (Ethernet) RX packets 4563 bytes 5822993 (5.8 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1279 bytes 153480 (153.4 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0找到对应的MAC地址00:0c:29:79:b4:94
主机1上运行此代码来构造帧:
import socketimport sys通过命令行指定传送的数据大小(字节数)。
engineer@netlab1:~$ sudo python3 l2socket.py 13Traceback (most recent call last): File "/home/engineer/l2socket.py", line 7, in <module> s.send(b'\x31' * data_size)OSError: [Errno 22] Invalid argument我们不难看出,合法的长度是14到1514个字节。即需要至少提供6字节的目标MAC,6字节的源MAC,2字节的类型,以及0-1500个字节的数据。
主机2上运行代码来监听:
import socket现在我们在主机1上运行代码,试图发送一个长度14字节的帧(不包含帧尾的4字节CRC)。
engineer@netlab1:~$ sudo python3 l2socket.py 14来看看主机2上面能收到什么内容:
engineer@netlab2:~/Desktop$ sudo python3 l2socket_listen.pyget [60 bytes]: b'11111111111111\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'收到了60个字节的内容!前面14个字节是我们提供的,后面补全的部分是帧的填充内容,以确保帧的数据部分至少有46字节。这样加上14个字节的头部,一共60字节。
如果我们发送1514个字节的帧呢:
engineer@netlab1:~$ sudo python3 l2socket.py 1514主机2会收到1514个字节:14字节头+1500字节数据
get [1514 bytes]: b'11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'通过wireshark也可以看到相同的结论。