为什么服务器无法获取客户端的MAC地址,就像获取客户端IP地址一样?

13
根据我的了解,数据包经过的所有MAC地址都在数据包中。这是因为每个进入特定路径的数据包也应该以类似的路径返回。因此,如果服务器的路由器知道客户端的MAC地址(全部),为什么服务器页面(如aspx)不能拥有此信息呢?
请给出解释。(不要只告诉我我错了)
如果我理解正确,客户端发送一个包含其MAC地址的数据包。当数据包通过代理(如客户端路由器)时,代理的地址也会添加到数据包中。依此类推。
以下是维基百科关于TCP/IP数据链路层的摘录: http://en.wikipedia.org/wiki/TCP/IP_model#Data_Link_Layer 数据链路层用于在同一链路上移动两个不同主机的Internet层接口之间的数据包。在网络卡的软件设备驱动程序以及固件或专用芯片组中,可以控制在给定链路上传输和接收数据包的过程。这些将执行数据链路功能,例如添加数据包标头以准备进行传输,然后实际上通过物理介质传输帧。TCP/IP模型包括将Internet协议中使用的网络寻址方法转换为数据链路寻址的规范,例如媒体访问控制(MAC),但是该层以下的所有其他方面都被隐含地认为是存在于链路层中,但没有明确定义。

你是在好奇,还是有实际问题需要解决? - Gabe
我想从Web应用程序中获取客户端的MAC地址。 - stacker
如果客户端和Web应用程序服务器在同一网络中,那么您是可以的,这在一些小型网络中可能是真实的。 - Marc Climent
9个回答

25

实际上,数据包中存储的MAC地址在每个数据包的传输过程中都会改变

MAC是媒体访问控制的缩写,媒体指的是本地通信媒介。虽然源IP地址和目标IP地址在整个传输过程中保持不变(并用于长距离路由决策),但源MAC地址和目标MAC地址只表示下一跳。

因此,您服务器收到的数据包中存储的MAC地址应该是您的POP路由器或供应商设备的MAC地址。

您可能需要查看OSI层模型和封装


3
您将IP堆栈和物理堆栈的关系颠倒了。MAC地址在包含IP信息的部分中,而不是反过来。因此,当我从我的计算机发送东西到您的计算机时,在我的局域网(以太网)中的物理段会围绕IP信息并包含我的MAC地址。路由器然后提取IP信息,并通过其自己的MAC地址将其向上转发(在这种情况下再次使用以太网),传输到我的DSL调制解调器。DSL调制解调器解开IP信息,并使用其所使用的任何协议(在那一点上不知道也不关心)通过电话线发送出去……好吧,您明白了。每个物理链路跳跃都使用底层物理层涉及的任何附加信息包装和解包IP信息,以进行本地传输。

所以,当我想要将某些东西发送回给你时,我会将其发送到你的IP地址。但是你的计算机在以太网后面,而IP是你的路由器的IP。那么你的路由器如何知道识别属于哪台计算机的这个东西,而不需要询问该东西(数据包)的MAC地址呢? - stacker
1
路由器记录IP地址和相关的MAC地址。(这只是一个非常简单的概述,如果您想了解更多细节,我建议阅读一本关于TCP/IP网络的好书,并翻到路由章节以及NAT等其他章节。) - JUST MY correct OPINION

2

1

没有“服务器路由器”。数据包可能从许多路由器到达服务器。

没有“客户端路由器”。数据包可能从客户端发送到许多路由器。

唯一能看到MAC地址的设备是在同一局域网上的设备,可能仅限于同一电缆段上的设备。

顺便说一下,如果客户端在代理服务器的另一侧,服务器也无法获取客户端的IP地址。


如果我理解正确的话,客户端发送一个包含其MAC地址的数据包。当数据包经过代理(例如客户端路由器)时,代理的地址也会被添加到数据包中,以此类推。 - stacker
为了正确性的目的,这很重要,但实际上,服务器看到的MAC地址可能来自同一家庭--是/否?我知道可以从Win32套接字中挖掘物理地址信息,但我怀疑这些信息是否可通过ISAPI或服务器提供的类似接口访问,我假设它是IIS。 - John Leidegren
服务器看到的MAC地址将是从客户端到服务器路径上最后一个路由器的一个端口的MAC地址。来自同一客户端的下一个数据包可能会从同一路由器的不同端口接收,也可能完全来自另一个路由器。这意味着每个数据包可能具有不同的MAC地址。这些地址与家庭无关 - MAC地址已经烧录在计算机的NIC卡中。 - John Saunders

1

它保留源和目标IP地址。互联网络的主要思想基于逐跳传递,中间路由器/主机只理解MAC地址。据我所知,路由表应该理解机器地址。

如果MAC地址能够在数据包的整个旅程中保持不变,则无需发明Internet协议地址。整个互联网将只使用MAC地址 :-)

只有当服务器和客户端都驻留在同一本地网络上(两个主机由某些L1媒体连接)时,才能实现您想要的内容。

话虽如此,您的应用程序看起来像是Web服务器,这告诉我它不必在同一个网络上。

如果您仍然想要在接收主机处获得源主机的MAC地址,请考虑将其作为有效负载发送?

补充:

全球各地的网络不必是相同类型(即以太网、帧中继等)。网络层为我们提供了在没有区分底层层(数据链路层)或者我应该说底层L1技术的情况下进行路由的灵活性。简而言之,IP将为我们提供互联网络,数据链路层(其中涉及MAC地址)将处理微观级别(即本地网络)的通信。这是MAC和IP地址共存的一个很好的理由! :-)


问题是为什么不可能?这就是我试图理解的。 - stacker
@Stacker,我刚才在回应你的问题时添加了一些内容。 - KedarX

0

在理解服务器为什么无法访问其客户端的MAC地址之前,让我们先了解数据包在网络中如何传输。

情况1:

目标IP地址将由网络应用程序知道或从DNS服务器获取(如果应用程序仅知道域名)。然后,主机将目标IP地址与自己的IP地址和子网掩码进行比较。如果目标主机在源主机的网络内,则源主机将向线路发送ARP请求,询问“谁有该IP地址?”目标主机将回复其MAC地址。

情况2:(通常是互联网上的情况)

如果目标主机不在源主机的网络中,比如我们浏览Google.com时,DNS将把名称解析为IP。源主机将发送ARP请求询问“谁有我的默认网关的IP地址?”。在这种情况下,由于它超出了我们的网络范围,我们将向默认网关发送ARP请求(默认网关是计算机网络中使用互联网协议套件作为转发主机(路由器)到其他网络的节点),然后DG用其MAC回复。您将使用Google的目标IP和我们的DG的目标MAC发送数据包。当DG接收到带有自己目标MAC和IP头中的其他目标IP地址的帧时,它知道该数据包不是发往自己的,而只是经过。然后进行Google的IP查找,接着是下一跳的ARP等等。

所以你看,进行物理寻址的数据链路层从未知道目标MAC地址,它只知道下一跳(路由器)的MAC地址。下一个路由器的MAC地址是通过ARP请求获得的。那么接收方如何知道其发送方的MAC地址呢?实际上它从来不知道,也无法知道,因为每次数据包被路由器接收时,它都会在源MAC地址字段中添加自己的MAC地址,或者说用自己的MAC地址替换掉原有的地址。因此,服务器将永远无法知道其接收方的MAC地址,因为它从未出现在数据包中。只有IP地址保留下来。


0

除非客户端在您的服务器本地,否则您无法这样做。 如果是,则可以尝试arp-ping并以此获取客户端的mac地址。


0

你正在考虑服务器 LAN 和客户端 LAN 之间的直接连接,但这并不是互联网工作的方式。两个 LAN 之间可能有任意数量的跳跃 - 另外,没有限制任何一个 LAN 使用类似 MAC 的东西,所以“MAC 地址”不会放置在 IP 数据包中。“MAC”只在 LAN 中才有意义(实际上,只有最底层使用类似 MAC 的协议的 LAN 才有意义;-),并且是通过 ARP 和 RARP 协议(这些协议不会被路由;-)来发现/公告的。


0
简单的区别是:IP地址是端到端地址(在IP数据包中),而MAC地址仅逐跳使用。此外,底层的MAC协议可能在每个跳上更改,而客户端并不知道,因此客户端甚至可能无法理解其IP数据包沿途的所有地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接