
随着互联网的不断发展,用户在访问互联网的时候使用的终端设备类型也在不断的变化,但是这些都是基于>
>
TCP层发送每一个报文的时候,都需要加上自己的地址(即源地址)和它想要去的地方(即目标地址),将这两个信息放到IP头里面,交给IP层进行传输。
IP层需要查看目标地址和自己是否是在同一个局域网。如果是,就发送ARP协议来请求这个目标地址对应的MAC地址,然后将源MAC和目标MAC放入MAC头,发送出去即可。如果不在同一个局域网,就需要发送到网关,还要需要发送ARP协议,来获取网关的MAC地址,然后将源MAC和网关MAC放入MAC头,发送出去。
网关收到包发现MAC符合,取出目标IP地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的MAC地址,将包发给下一跳路由器。这样路由器一跳一跳终于到达目标的局域网。这个时候,后一跳的路由器能够发现,目标地址就在自己的某一个出口的局域网上。于是,在这个局域网上发送ARP,获得这个目标地址的MAC地址,将包发出去。
目标的机器发现MAC地址符合,就将包收起来;发现IP地址符合,根据IP头中协议项,知道自己上一层是TCP协议,于是解析TCP的头,里面有序列号,IT培训建议需要看一看这个序列包是不是我要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。
TCP头里面还有端口号,>
如果两者位于同一网段,那么源主机直接向目的主机发送ARP请求,在收到目的主机的ARP应答后获得对方的MAC地址,就相当于获得目的mac之后进行报文发送。这是二层的情况
三层的话会向网关递交报文,然后以网关的MAC作为目的MAC
为了在数据链路层通讯。
数据链路层通讯是用Mac地址,而不是IP地址。
交换机接口每个Mac地址都会对应一个端口号,每个通信方都能互相识别到,足矣。
IP只是为了寻找对方的Mac用于接下来的通讯做好准备。
一:问题:如何获得本机/远程主机的MAC地址,且不受 *** 作系统类型的限制,也不受本机和远程主机是否在同一个LAN中的限制。
二:解决的方法
注:就我所看到的有关“如何获得本机/远程主机的MAC地址”的方法总结如下。
这些方法及程序参考了本站及其他站点,以及用google搜索到的一些牛人的解法和源代码,我在此对他们深表感谢,在此就不说他们的大名了。
我所总结的方法和以及我写的代码一定存在许多不足,敬请各位同志斧正!!!
欢迎讨论!!!如果您认为值得转载的话,欢迎转载。
(一)获得本机的MAC地址
1:在WINDOWS 2000/XP下,使用ipconfig /all ,或者route print ,或者nbtstat 本机的IP地址;
2:在Linux/UNIX/类UNIX下,使用ifconfig;
3:自己写程序/参考牛人的程序实现,其原理可以参考arp协议;
(二)获得同一个LAN中主机的MAC地址
1:先ping目标主机,然后察看arp表,该方法不受 *** 作系统类型的限制;
2:在WINDOWS 2000/XP下,用nbtstat + 目标主机的IP地址;
3:在Linux下,用nbtstat + 目标主机的IP地址。(Linux系统本身没有提供,
但是在本站的“网络编程”版有一段用C语言写的原码,实现了WINDOWS下的nbtstat命令的部分功能。那段原码里面多了一个“}”符号);
注:2,3两种方法都只适合于目标主机是WINDOWS系统,且目标主机的137(135-139)端口是开放的。
4:自己写程序/参考牛人的程序实现,其原理可以参考arp协议;
(三)获得远程主机的MAC地址
1:在WINDOWS 2000/XP下,用nbtstat + 目标主机的IP地址;
2:在Linux下,用nbtstat + 目标主机的IP地址。(Linux系统本身没有提供,
但是在本站的“网络编程”版有一段用C语言写的原码,实现WINDOWS下的nbtstat命令的部分功能。那段原码里面多了一个“}”符号);
注:1,2两种方法都只适合于目标主机是WINDOWS系统,且目标主机的137(135-139)端口是开放的。
3:自己写程序/参考牛人的程序实现
三:我自己现在不是牛人,没有对问题给出一个圆满的解决方案。下面是我参考各位牛人的一些思想和源代码,在Java中通过系统调用实现的一段程序。该程序我已经在WINDOWS XP和RedHat Linux 90下测试通过。(要求系统只配了一个以太网卡,如有两块网卡,只能检测出其中的一块网卡的MAC地址,且可能造成显示的MAC/IP地址对与实际的MAC/IP地址对不符。)
单播的MAC地址是通过ARP协议桢查询出来并缓存于ARP表中的,多(组)播的MAC地址是通过32位IP地址直接映射成48位MAC地址而得来的(会存在5位的映射偏差),而广播的MAC地址直接是48位全1。
80211桢和Ev2桢中的MAC地址产生方法是一致的,只不过在基础设施型无线网络中多了48位的BSSID地址(从而使得80211桢中的地址个数最多可达到4个),它是AP的无线接口MAC地址,无线工作站(STA)可以通过扫描AP定期(一般每秒10次以上)广播发送的信标桢(Beacon)来了解AP的MAC地址(注:无线产品禁用SSID广播并不是定期不发信标桢,而只是在信标桢中不再包含用户自定义的SSID网络名称),当然STA也可以通过主动扫描形式的广播探查请求桢(Probe Request)去获取AP的MAC地址(此时AP会先查看SSID名称是否匹配,并且MAC过滤表中是否允许连接,过滤后会用单播响应桢予以回复)。
不知我写的是否是你想要的,目前也在做无线的项目,碰巧遇见这个就回了,水平有限,希望能帮到你。
IP和MAC地址相对来说是相互对应的,但是这个只适合在内网的时候去使用。因为本身你如果是通过外网去通信的话,由于有NAT的存在,虽然MAC是不变的,但在传输的过程之中IP是会不断的变化的,在外网你根本就无法直接通过一个IP去判断这个设备的准确的MAC。而且中间还隔了一个供应商就更不用说了。
一句话,局域网里面没有经过NAT可以靠ARP,之后就不是太靠谱了
以上就是关于http协议请求处理过程全部的内容,包括:http协议请求处理过程、构造以太网帧时,使用什么协议获取目的mac、mac帧传递过程中地址一直在变,那么ARP协议获取目的主机mac地址有什么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)