首先,请那些只会复制粘贴的高手高抬贵手,请明白的达人用自己的理解帮助我吧.
arp协议是属于网络层的,比如二层交换机就不能得到ip地址和mac地址的映射关系
帧中的目的mac地址是不是这样获取的:提取ip包首部获取目的主机ip地址,然后查找arp缓存表,如果有此ip的mac地址映射,那么就把此mac地址添加到帧中存放目的地址的字节处,如果arp缓存表中没有目的ip地址的映射,那么就调用arp进程,发出arp请求包以获取目的ip的mac地址映射并加到帧中.我的主要疑问就是ip包传到链路层后链路层是不是通过ip包头来获取目的ip地址,并找到此ip的mac映射.我想,目的mac地址在封装帧时不会从天而降吧.
电脑中链路层在封装帧时是如何获取目的主机的mac的(我认为二层交换机和HUB没有自己的ip,就不需要arp协议)
答案:5 悬赏:80 手机版
解决时间 2021-02-24 23:13
- 提问者网友:世勋超人
- 2021-02-24 17:26
最佳答案
- 五星知识达人网友:北方的南先生
- 2021-02-24 18:46
ip地址和mac的对应表是在电脑端缓存的,交换机存储的是mac和端口的映射表。电脑发送数据到B电脑时,首先查看本地缓存的ip地址和mac的映射表,如果存在,则在数据链路层打包时,用目的mac,如果不存在,则启用ARP协议,用ffffffff作为目的mac发起ARP询问,目的ip的mac地址是什么,交换机收到后检测到目的mac是fffffff,则在所有端口进行广播,交换机下其他电脑收到检测问的ip是不是自己,B电脑检测到是自己,然后回复A自己的mac,交换机收到B发来的消息,记录下B的Mac和端口对应关系到映射表,转发给A电脑,此时A电脑知道了B电脑的Mac,就可以发起二层通信了,ARP协议不是二层协议,因此交换机并不能解析,只是透明转发。ARP协议实际是三层的补充协议,只有路由器和电脑才能解析。
所以,电脑发送数据时,到数据链路层,填写目的mac是根据查表获得的。
所以,电脑发送数据时,到数据链路层,填写目的mac是根据查表获得的。
全部回答
- 1楼网友:刀戟声无边
- 2021-02-24 22:17
说实话不太明白你在纠结的东西是啥。我觉得其他人的解释其实很清楚的,补充一些吧。
你考虑正常的网络编程,打开一个 socket 然后往里头写数据,这时候一层层协议驱动就开始工作,数据外面就开始封装一层层的协议头包括DLC 头,最后保存在 socket buffer 中,接着内核在把包交给网卡之前,它会先去调用网卡设备上的 dev->rebuild_header() 的方法,这是Linux 网卡驱动强制要求实现的,调用参数是 socket buffer 的指针。目标 IP 本身就保存在 socket buffer 的结构中,程序中自然可以拿到(h->h_dest)。 rebuild_header 方法就负责 IP 到 MAC 的查询工作,可以是查本地表、可以是广播进行 ARP 查询 ,也可以是其他方法(比如非以太网),无论如何,这个方法需要取回 MAC ,并更新 socket buffer 的链路层包头,完事了就可以调用网卡的 Tx 方法,发送出去了。大概如此吧。
static int fwnet_header_rebuild(struct sk_buff *skb) {
struct fwnet_header *h = (struct fwnet_header *)skb->data;
if (get_unaligned_be16(&h->h_proto) == ETH_P_IP)
return arp_find((unsigned char *)&h->h_dest, skb);
dev_notice(&skb->dev->dev, "unable to resolve type %04x addresses\n", be16_to_cpu(h->h_proto));
return 0;
}arp_find 来自 arp 协议驱动,它的职责主要是在 arp 协议驱动维护的缓存表中先查表,如果找不到,就调用 arp_send 执行网络查询,而 arp_send 则更简单粗暴,直接再申请一个 socket buffer , 构造出一个 arp 数据包调用网卡的 Tx 方法发送到线路上。。
//arp_ptr的内存布局为:源mac地址 | 源ip地址 | 目的mac地址 | 目的ip地址
arp_ptr=(unsigned char *)(arp+1);
//源mac地址设置
memcpy(arp_ptr, src_hw, dev->addr_len);
arp_ptr+=dev->addr_len;
//源ip地址设置memcpy(arp_ptr, &src_ip,4);
arp_ptr+=4;
//ip地址长度固定为4,定位到目的mac地址
if (dest_hw != NULL)
memcpy(arp_ptr, dest_hw, dev->addr_len);
else
memset(arp_ptr, 0, dev->addr_len);//传参为空,就赋0
arp_ptr+=dev->addr_len;
memcpy(arp_ptr, &dest_ip, 4);//目的ip地址设置
//将该数据包传递给驱动程序,由驱动程序最终将数据发送到物理介质上d
ev_queue_xmit(skb, dev, 0);//数据包发送
- 2楼网友:鸽屿
- 2021-02-24 21:39
arp是数据链路层的协议,只用二层交换机。二层交换机就是接入交换机,接二层交换机的终端通过mac地址通信,arp协议就是终端必须将广播过来的相邻主机的mac地址ip写入自己的arp表,二层交换机和所接的主机都有一张arp表。
数据包传到数据链路层后再组合成比特流。
传输层及以下是用来传输数据的,网络层的包到到数据链路层组合成帧再组合成字节,到物理层组合成比特流,比特发送给交换机,交换机看掩码是不是该网段的主机,如果是则搜寻arp表,里面是否有该主机,如果有,则发送给该主机,如果没有,则发送一个广播,如果交换机发现掩码不是该网段的,则交换机再向上发送数据给三层交换机。
所以说,接在二层交换机上的主机互相通信是用mac的,用arp广播就是获取mac和ip的,如果该主机的包发送到其他网络中,那么就要经过路由器了,
- 3楼网友:逃夭
- 2021-02-24 21:14
ARP 是通过二层数据帧来实现 IP和MAC的对应的
比如A 想找到B的 MAC
1 A发二层广播讯问B的MAC 格式 : 源MAC=A 目地MAC= FFFFFF 数据内容:B MAC=空
2 当B收到数据口看到数据内容中的IP是自己的 就把自己的MAC填空 并发还给A了 ,并且在缓存中同时也记下了A的映射.
- 4楼网友:大漠
- 2021-02-24 20:01
你这个情况可能是:
1、有人用
p2p终结者、网络执法官、聚生网管等软件限制别人的速度
3、有些电脑中了arp病毒(由于开网页、下载的过程中中病毒)对其他电脑进行攻击导致掉线
3、内网有人更改ip产生冲突
建议你用免疫墙把网络升级成免疫网络,让网络像人和动物一样具有免疫力,遇到了问题能及时抵挡反馈,免疫网络还有网络监控,监控整个网络上网质量,有什么异常状况直接从网卡上面拦截,还在监控中报警,一台电脑上不了网和别人没有关系。免疫墙能直接从从网卡上面拦截每一台电脑发出的病毒攻击,从网卡上面限制上传和下载、发包大小,进行统一管理,网络管理员只有一个,还能监控整个内网电脑的上网状况上网的质量、每一台式电脑的内外网上传和下载,连接数,有异常情况准确定位报警,整个网络看得到,摸得着。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯