关于终端设备的设备唯一性的那些事之MAC地址

最近和别人聊起来数据上报,一起讨论到imei和MAC地址,然后发现一个问题:知道这两个东西都不唯一,但是不知道为什么…………

回来上各种小网站巴拉巴拉找了一下,终于大概了解了前世今生,这里简单汇总一下MAC地址相关的内容。会在另一篇文章汇总imei相关的内容。链接如下:

关于终端设备的设备唯一性的那些事之IMEI

什么是MAC地址?

MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。

MAC地址的组成?

MAC(Media Access Control,介质访问控制)地址,也叫硬件地址,长度是48比特(6字节),由16进制的数字组成,分为前24位和后24位:

  • 组织唯一标志符

MAC地址前24位叫做组织唯一标志符(Organizationally Unique Identifier,即OUI),是由IEEE的注册管理机构RA给不同厂家分配的代码,区分了不同的厂家。

  • 扩展标识符

MAC地址后24位称为扩展标识符,是由各厂家自行指派给生产的适配器接口。同一个厂家生产的网卡中MAC地址后24位是不同的。

为什么需要MAC地址?

MAC地址对应于OSI参考模型的第二层数据链路层,工作在数据链路层的交换机维护着计算机MAC地址和自身端口的数据库,交换机根据收到的数据帧中的“目的MAC地址”字段来转发数据帧。

MAC地址与IP地址

MAC地址对应于OSI参考模型的第二层数据链路层,IP地址工作在OSI参考模型的第三层网络层。两者之间分工明确,默契合作,完成通信过程。

IP地址专注于网络层,将数据包从一个网络转发到另外一个网络;而MAC地址专注于数据链路层,将一个数据帧从一个节点传送到相同链路的另一个节点。

数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过MAC地址),而网络层协议使数据可以从一个网络传递到另一个网络上。

MAC地址与Android设备

MAC地址保存在什么地方?

网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM,它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。

MAC地址可修改么?

可以确定,可以。修改方法自行百度或者谷歌。

为什么MAC地址不唯一

只要可以修改就不会唯一,而且修改并不复杂。

关于MAC不可不知的一段代码

不废话,先上代码:

The offending kernel code:

if((tuna_MAC_addr[4] == 0) && (tuna_mac_addr[5] == 0)) {
	srandom32((uint)jiffies); //
	rand_mac = random32(); //
	tuna_mac_addr[3] = (unsigned char)rand_mac;
	tuna_mac_addr[4] = (unsigned char)(rand_mac >> 8);
	tuna_mac_addr[5] = (unsigned char)(rand_mac >> 16);
}
memcpy(buf, tuna_mac_addr, IFHWADDRLEN);

这段代码的野史解释说最初 Google 和三星不想掏钱买 MAC 地址,某个神一样的的伟大的程序员同学就写了个函数,随机生成 MAC 地址的后六位。然后这段内核的代码被别的厂家直接拿去了,就导致很多手机都有这个问题。

拥有这段代码的手机,在每次启动的时候都会随机生成一个MAC地址。这就更加加剧了MAC地址的不唯一,导致了MAC地址的唯一性不再存在,想用它作为设备唯一标示也不可能了。

参考资料

  1. 为什么说 MAC 是一个存在严重漂移的 ID

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和PYTHON有个约会

30.3. 企业级开发进阶2.3:UDP编程

回顾TCP协议:一个非常重要的数据传输协议,很多网络协议都是以TCP协议为基础的;TCP协议要求服务器和客户端通过三次握手交互的方式建立可靠的连接,然后再进行数...

13130
来自专栏小李刀刀的专栏

前端构建工具 Gulp.js 上手实例

在软件开发中使用自动化构建工具的好处是显而易见的。通过工具自动化运行大量单调乏味、重复性的任务,比如图像压缩、文件合并、代码压缩、单元测试等等,可以为开发者节约...

46470
来自专栏IT技术精选文摘

快速理解网络通信协议

18020
来自专栏技术博文

认识http协议

http:Hyper Text Transfer Protocol,超文本传输协议。是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。...

34270
来自专栏Python中文社区

Python渗透测试之tcp几种端口扫描的讲解

專 欄 ❈exploit,Python中文社区专栏作者,Python渗透测试与安全爱好者。希望与作者交流或者对文章有任何疑问的可以与作者联系: QQ:1585...

310100
来自专栏Golang语言社区

linux服务器开发三(网络编程) --二

半关闭 当TCP链接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),B没有立即发送FIN给A时,A方处在半链接状态,此时A可以接收...

74670
来自专栏Golang语言社区

优化Linux的内核参数来提高服务器并发处理能力

PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题。要提高Linux系统下的负载能力,可以使...

35040
来自专栏企鹅号快讯

如何解决web系统session劫持

往期精选 session劫持是一种比较复杂的攻击方法。大部分互联网上的电脑多存在被攻击的危险。这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持 ...

246100
来自专栏任浩强的运维生涯

优化内核参数提高服务器的并发处理能力

PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题。要提高Linux系统下的负载能力,可以使...

53380
来自专栏Web 开发

涨姿势 – 不一样的服务端长连接方案 – 客户端代理

传统的 LAMP 架构,PHP-CGI  这种方式是很难处理长连接的。要么写死循环的方式来握住请求,要么使用 swoole 这种,通过 C 拓展来支持。

18920

扫码关注云+社区

领取腾讯云代金券