永发信息网

电脑中链路层在封装帧时是如何获取目的主机的mac的(我认为二层交换机和HUB没有自己的ip,就不需要arp协议)

答案:5  悬赏:80  手机版
解决时间 2021-02-24 23:13
首先,请那些只会复制粘贴的高手高抬贵手,请明白的达人用自己的理解帮助我吧.
arp协议是属于网络层的,比如二层交换机就不能得到ip地址和mac地址的映射关系
帧中的目的mac地址是不是这样获取的:提取ip包首部获取目的主机ip地址,然后查找arp缓存表,如果有此ip的mac地址映射,那么就把此mac地址添加到帧中存放目的地址的字节处,如果arp缓存表中没有目的ip地址的映射,那么就调用arp进程,发出arp请求包以获取目的ip的mac地址映射并加到帧中.我的主要疑问就是ip包传到链路层后链路层是不是通过ip包头来获取目的ip地址,并找到此ip的mac映射.我想,目的mac地址在封装帧时不会从天而降吧.
最佳答案
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是根据查表获得的。
全部回答
说实话不太明白你在纠结的东西是啥。我觉得其他人的解释其实很清楚的,补充一些吧。 你考虑正常的网络编程,打开一个 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);//数据包发送
arp是数据链路层的协议,只用二层交换机。二层交换机就是接入交换机,接二层交换机的终端通过mac地址通信,arp协议就是终端必须将广播过来的相邻主机的mac地址ip写入自己的arp表,二层交换机和所接的主机都有一张arp表。 数据包传到数据链路层后再组合成比特流。 传输层及以下是用来传输数据的,网络层的包到到数据链路层组合成帧再组合成字节,到物理层组合成比特流,比特发送给交换机,交换机看掩码是不是该网段的主机,如果是则搜寻arp表,里面是否有该主机,如果有,则发送给该主机,如果没有,则发送一个广播,如果交换机发现掩码不是该网段的,则交换机再向上发送数据给三层交换机。 所以说,接在二层交换机上的主机互相通信是用mac的,用arp广播就是获取mac和ip的,如果该主机的包发送到其他网络中,那么就要经过路由器了,
ARP 是通过二层数据帧来实现 IP和MAC的对应的 比如A 想找到B的 MAC 1 A发二层广播讯问B的MAC 格式 : 源MAC=A 目地MAC= FFFFFF 数据内容:B MAC=空 2 当B收到数据口看到数据内容中的IP是自己的 就把自己的MAC填空 并发还给A了 ,并且在缓存中同时也记下了A的映射.
你这个情况可能是: 1、有人用 p2p终结者、网络执法官、聚生网管等软件限制别人的速度 3、有些电脑中了arp病毒(由于开网页、下载的过程中中病毒)对其他电脑进行攻击导致掉线 3、内网有人更改ip产生冲突 建议你用免疫墙把网络升级成免疫网络,让网络像人和动物一样具有免疫力,遇到了问题能及时抵挡反馈,免疫网络还有网络监控,监控整个网络上网质量,有什么异常状况直接从网卡上面拦截,还在监控中报警,一台电脑上不了网和别人没有关系。免疫墙能直接从从网卡上面拦截每一台电脑发出的病毒攻击,从网卡上面限制上传和下载、发包大小,进行统一管理,网络管理员只有一个,还能监控整个内网电脑的上网状况上网的质量、每一台式电脑的内外网上传和下载,连接数,有异常情况准确定位报警,整个网络看得到,摸得着。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
数码港幼儿园地址在什么地方,想过去办事
上海市免检车辆领取检验标志要准备什么材料 s
可不可以用javascript编写留言板?
魔域登陆密码跟99登陆密码是一样的吗
你好,新买的小米路由器,它说提供网路运营商
二环/永内大街(路口)我想知道这个在什么地方
希望之星英语大赛的各个组的前三名
电脑开机后只显示j_
你好三岁的泰迪。昨晚开始一直在吐拉稀。每个
安徽省马鞍山市 火葬场在哪里
佛山市祥口福食品有限公司这个地址在什么地方
下列材料的导热系数由小到大排列正确的是()。
请问淘汰老旧车辆,取得国家补助时的这笔收入
我的手机以前充电很快,现在充电很慢,是什么
中国移动极速电讯地址在哪,我要去那里办事
推荐资讯
新捷达换右侧车门,右侧车头盖,全部撞坏,修理
应用生物工程技术能获得人们需要的生物新品种
【strcpy】...以下选项中正确运用了strcpy函
[1/3-(-11/4)]×[(-2)÷4]是几分之几?现在就
三元一次方程组和二元一次方程组用代入法解下
用story造句
三仁面馆·餐厅这个地址在什么地方,我要处理
铝合金门窗与墙体的连接应为弹性连接,在下述
坚持换护理液但半年里只带了几次的年抛美瞳还
居民楼更换电梯物业不同意,如何继续更换流程
韩国两人女团一首歌啊里蹦蹦加
课题应用价值怎么写
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?