据我所知,我们只需使用以太网/第 2 层地址即可与 LAN 设备通信。但对于 WAN 设备,则需要 IP/第 3 层地址。
所以 TCP 位于 IP 层上方的 OSI 第 4 层。我的问题是,我是否可以制作一个 TCP 数据包并通过 LAN 网络的以太网/第 2 层地址发送它,这样它基本上绕过了第 3 层/IP 层?
答案1
在 LAN 上,理论上这是可行的,因为您只有交换机和集线器。因此目标 MAC 地址将是正确的。但是...
您必须为源系统和目标系统编写一个操作系统,该操作系统将始终跳过 IP 层并将帧的有效负载读取为 TCP 数据包。
上面的“ALWAYS”是必要的,因为有可能创建一个可以被解释为有效 IP 数据包的 TCP 数据包,但是该数据包永远不会具有相同的含义,因为 TCP 和 IP 执行完全不同的事情。
IP 数据包还定义了内容使用哪种协议,因此通过跳过 IP,也将不再可能使用 UDP、ICMP……
在 WAN 上,这肯定行不通,因为你必须通过路由器。原始数据包需要具有第一个路由器的 MAC,而不是最终系统的 MAC。
因此,实际上,这是一个糟糕的想法:创建操作系统需要做大量工作。它将破坏所有不在 TCP 内的协议,并破坏与 LAN 外系统的通信。
答案2
我的问题是,我能否制作一个 TCP 数据包并通过 LAN 网络通过以太网/第 2 层地址发送它
几乎所有通信介质中的协议都有报头,有时还有尾部。许多协议还规定“字节 X 表示这个”,并且您无法告诉处理该协议的任何东西(如网卡或 TCP/IP 堆栈)做任何不同的事情。除非协议允许,但低级协议通常不会这样做,以提高性能。
以以太网帧为例:
现在与 TCP 段进行比较。
那么,如果网卡获取的是“源端口”和“目标端口”而不是“前导码”,会发生什么情况呢?前导码的作用如下:
以太网数据包的前导码由 56 位(七字节)交替的 1 位和 0 位模式组成,允许网络上的设备轻松同步其接收器时钟,然后由 SFD 标记新的传入帧。
因此,如果使用正确的驱动程序,您设法让以太网收发器发送除前 7 个字节交替的 1 和 0 之外的任何内容,则另一端将无法锁定数据,接收端将无法获取它们。下一个字段“起始帧分隔符”只是一个 1 字节模式,它与打破模式不同,并告诉硬件真正的数据正在进入。
目前大多数网络硬件都有可能自动生成前导码和起始帧定界符。
因此,在最低层,您真正可以控制的可能是目标地址。现在您可以看到,您无法将源端口字节放在这里,然后跟进目标端口字节并到达任何位置,除非网络上的某些东西碰巧有匹配的 MAC 地址,并且除非您的 MAC 地址与源地址匹配,否则您也不会收到回复。
所以你实际上是在问你是否可以自己制作以太网帧与IP 数据包在里面TCP 段包裹在里面。
在 Linux 下是可以的 - 只需搜索“Linux 生成以太网帧”,就会出现各种工具。然后您可以制作帧并输入 IP、TCP 或任何您想要的协议。 读这个。