【Linux】IP地址和MAC地址

一、MAC地址

MAC地址是用来识别数据链路层中相连的节点。它的长度为48位比特位,也就是6字节。

MAC地址是具有唯一性的,它的唯一性是在网卡硬件生产时就已经制定,所以一个网卡一个MAC地址。这就意味着,一台主机如果有多个网卡,那么就有多个MAC地址。

二、IP地址

  • IP协议有两个版本,一个IPV4,一个IPV6,通常说的IP默认是指IPV4。

  • 它主要是用来标记网路中不同主机的地址。

  • 对于IPV4来说,IP地址是一个4字节,32位的整数。

*通常IP地址采用点分十进制的字符串来表示IP地址,就比如192.168.1.1,每个位的范围都是【0,255】,每个点区分一个字节。

三、MAC地址和IP地址

IP地址的作用是告诉我们,我们从哪里来,要去的目的地是哪里。相当于一个导向的作用。尤其是目的ip,通常是不会改变的,协助我们进行路由选择。

MAC地址的作用是告诉我们,上次是从哪里来的,下一步要去哪里。

就比如一个例子:就好像唐憎要去西天取经,那么他是从大唐来的,目的地是西天。这就好比是一个IP地址的源IP和目的IP。而他一路上会不断的前进,会经过女儿国,火焰山,狮驼岭。每一步要走的地方都会有所不同,最终是去往西天。这其中的每一步,就是MAC地址,告诉我们下一步要去哪里。而IP地址就是一个导向的作用,协助我们一步步该往哪里走才能到达最终的目的地。

四、本地局域网通信

首先,应用层发送消息你好,传输层进行封装,网络层进行源IP和目的IP封装,数据链路层进行数据帧处理,然后物理层将其再封装,发送到以太网里,以太网找到路由器,进行解包将有效载荷传给上一层的路由器。
在这里插入图片描述
而路由器将收到的消息进行解包,剩下的有效载荷就是这部分
在这里插入图片描述

然后路由器是属于网络层的,它自然可以看的懂网络层的协议,也就能读懂报头的内容,知道目的IP是谁,这个消息应该发送给谁,

然后路由器将其穿给目的IP的局域网内,也就是令牌环,

然后令牌环进行封装,发送到目的IP对应得网卡,网卡接收消息就会进行报头有效载荷分离,然后一步步传到对方得应用层,对方就能收到消息。

在这个过程中,我们可以发现,即使双方的局域网不同,但依然能够通过路由器将消息发送给对方,这就体现了协议栈的分层结构的强大解耦能力,也就是低耦合,层和层之间不会因为对方的改变而使得自己层也要做出改变,我只关心自己的报头消息,无需关心我的下一层是谁,下一层要做什么,具体下一层的封装是由下一层来决定,我不需要关心。

而同层之间,使用相同的协议,也就相当于用了同一份源代码,自然能够看的懂同一层的发来的消息,而我最初发送时封装的报头,最后必然是我的同层看到我发的报头,这就是高内聚

这让我们看到了协议栈的设计是如此的巧妙强大。

一个局域网,要通过路由器将数据发送出去,把数据交给路由器的这个过程,不就是一个局域网的通信吗?路由器再将数据发给对方,这不也是一个局域网的通信吗?
所以,路由器它就必须要横跨这两个网络,对于对方自己而言,都只是在自己的局域网里进行通信,同时网络的不同,并没有影响到双方的通信,本质就是IP协议,网络层屏蔽了底层的网络差异,而网络层工作的路由器,正是屏蔽这种差异化的工具!而路由器工作靠的就是IP协议,只需要关心源IP和目的IP,底层网络的封装交给底层网络去进行。
路由的过程,我们就可以抽象的理解成
发送方到达路由器的时候,脱衣服,路由器经过处理,再发给目的IP的网络进行穿衣服。

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用 Python 中的 `socket` 和 `subprocess` 模块来收集 Linux 系统上的 IP 地址和 MAC 地址。以下是一个示例代码: ```python import socket import subprocess # 获取主机名 host_name = socket.gethostname() # 获取 IP 地址 ip_address = socket.gethostbyname(host_name) # 获取所有网络接口信息 ifconfig_result = subprocess.run(['ifconfig'], stdout=subprocess.PIPE).stdout.decode('utf-8') # 解析出每个网络接口的 IP 地址和 MAC 地址 interface_info = {} for line in ifconfig_result.split('\n'): if line.startswith(' '): # 处理多行输出的情况 interface_info[interface_name]['output'].append(line.strip()) continue if ':' in line: # 解析出网络接口名称和 MAC 地址 parts = line.split() interface_name = parts[0].strip(':') mac_address = parts[1] interface_info[interface_name] = {'mac_address': mac_address, 'output': [line.strip()]} else: interface_name = None # 输出结果 print('Hostname:', host_name) print('IP address:', ip_address) for interface_name, info in interface_info.items(): print('Interface:', interface_name) print(' MAC address:', info['mac_address']) print(' Output:') for line in info['output']: print(' ', line) ``` 这段代码可以输出主机名、主机的默认 IP 地址,以及每个网络接口的 IP 地址和 MAC 地址。注意,如果一个网络接口有多个 IP 地址,这段代码只会输出其中的一个 IP 地址。如果需要获取所有 IP 地址,需要对代码进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ck837

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值