2020-08-02:输入ping IP 后敲回车,发包前会发生什么?
福哥答案2020-08-02:
首先根据目的IP和路由表决定走哪个网卡,再根据网卡的子网掩码地址判断目的IP是否在子网内。如果不在则会通过arp缓存查询IP的网卡地址,不存在的话会通过广播询问目的IP的mac地址,得到后就开始发包了,同时mac地址也会被arp缓存起来。
知乎答案:
大体上思路差不多,先查路由表,再查ARP表,最后发送ICMP(ping)包,
(1) 查路由表
目的: 找到网关,
由于网关都会跟本地某一个网卡在一个网段,因此发包的网卡也就找到了,
如果你网关跟本地任何一个网卡都没在一个网段,那么配置此网关时,不会在路由表里生成路由,也就是配置不生效。
怎么实现:
源主机系统拿要访问的目的IP跟路由表的每一条路由项进行匹配,先跟路由项的掩码进行与运算,得出目的网络号,再与该路由项的目的网络进行比对。
如果相同,则记录该路由项的网关,如果不同,也就无需记录,找完这项,继续查询找下一项,直到查完整个路由表。
查完以后,存在三种情况,一个网关都找不到,找到一个网关,找到多个网关。
一个网关都找不到,也就意味着到目的IP路由不可达,发送失败。找到一个网关,那就可以下一步,找ARP表。
找到多个网关,根据最长匹配机制,选出一个,如果根据最长匹配机制还是找不出,那就随机选择一个,这里有太多细节,一般对于路由器而言,才存在这种可能,对于我们平时的主机而言,这种情况百年难遇,不做过多讨论。
看到这里,可能有同学问,每发一个包,都要把路由表找个遍,岂不是很慢?是的,不过我们平时路由表里面也没有几条路由,漫不了多少。
但对于运营商的路由器而言,可是百万级别的路由,而且数据发送频率不要太快,是的,因此在运营商的路由器里面有个快速转发表,由专业的芯片实现,快速转发表,其实就是经常查找的路由项组成的缓存,优先级比路由表高,缓存表找不到才查路由表。当然还有它技术的结合,不做那一块,没必要了解那么多,就此打住。
(2) 查找ARP表
目的: 找到目的IP的MAC地址或者网关的MAC地址
怎么实现:
上一步,查找要路由表后,找不到网关就到不了这一步,找到网关后(无论是一选一,还是多选一,到这一步就剩一个)。
网关可能有两种情况,一是为本地网卡ip或on-link (windows系统这么叫,linux或者其他路由器可能叫directly connected,反正都一个意思),一是为第三方ip地址(该ip地址,一定会很本地网卡的某一个在一个网段,原因前面说了)。
如果网关为本地网卡ip或on-link,说明目的IP地址跟自己的某个网卡在一个网段,也就是我们说的直连。
如果网关为第三方IP,说明目的IP地址跟自己任何一个网卡都不在一个网段,也就是跨网段。
(2.1) 当直连时
源主机就会拿目的IP地址查ARP表,找其对应的MAC地址。
如果ARP表里没有就发送ARP广播包,去问连在同一个网络内的所有设备,如果某一台设备拥有此目的IP,它就回复其MAC地址。
本机收到后会缓存下来,写到ARP表,方便下一次查找,当然不是永久存储,有超时时间,一般是五分钟。
如果没有人回复,也就意味着查找ARP表失败,因此发送数据失败。
(2.2) 当跨网段时
其实跟一步一样,不同的是,拿网关的IP去查,而不是目的IP,这样子要么查找失败,要么找到网关的MAC地址。
(3) 发送ping包
到了这一步,也就意味着要么找到目的IP的MAC地址,要么找到目的IP所经过的网关的MAC地址。
源主机利用目地主机的IP为目的IP,以目的IP的MAC地址或者网关的MAC地址为目的MAC。
利用本地多网卡中与目的网关在一个网段的网卡的IP地址为源IP,以其MAC地址为的源MAC。
开始构造ICMP报文,从上一步选出的网卡发送出去。
(4) 后续
网关收到后如何处理?目的主机收到后如何处理?
不说了,手机打了一个小时,我太难了, ,把这个搞清楚,也算半个CCNA了吧。
2020-08-02:输入ping IP 后敲回车,发包前会发生什么?的更多相关文章
- 2020-07-02:在浏览器输入一个url后按回车,会发生什么?
福哥答案2020-07-02: 简单回答: 域名解析. 建立TCP连接. 请求. 处理. 响应. 释放TCP连接. 页面渲染. 中级回答: 域名解析 浏览器DNS缓存. 操作系统DNS缓存. 路由器缓 ...
- 用WPF写一个登录界面,我想在输入完密码后按回车就能够验证登陆,而不需要用鼠标单击登陆按钮
在wpf中,将按钮的IsDefault设置为true
- CENTOS7配置静态IP后无法ping通外部网络的问题
我今天想谈论的并不是如何配置静态IP,这样的话题已经有好多高手再谈. 我想谈的是为什么,我按照他们的教程无论如何也要发生各种问题,没办法连接外网的问题. 先给大家看我的最终版配置方案:我只修改了一个文 ...
- 网易笔试题:浏览器中输入一个url后回车到返回页面信息的过程
You enter a URL into the browser输入一个url地址 The browser looks up the IP address for the domain name浏览器 ...
- 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程
第一步:登录阿里云官网,获取服务器ECS的指定公网IP地址. 1.输入阿里云官网账号进入首页,如下图: 2.点击进入"管理控制台",如下图: 3.点击"云服务器ECS&q ...
- 您为这个网络适配器输入的IP地址xxx.xxx.xxx.xx已经分配给另一个适配器xxx...
您为这个网络适配器输入的IP地址xxx.xxx.xxx.xx已经分配给另一个适配器‘xxx NIC’.... 2008年11月03日 星期一 08:51 问题现象: 在网卡的TCP/IP属性中无法 ...
- vmware中nat模式中使用静态ip后无法上网的问题
在/etc/network/interfaces中添加静态ip auto eth0iface eth0 inet staticaddress 192.168.31.133netmask 255.255 ...
- Linux设置静态IP后出现的几种问题
一.设置静态IP后无法重启网卡 如下图所示 原因分析:control process exited with error code.控制进程存在错误代码. 解决方案:可以检查网卡配置文件是否修改错误. ...
- 经典面试题:在浏览器地址栏输入一个 URL 后回车,背后发生了什么
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...
随机推荐
- PHP 反序列化漏洞入门学习笔记
参考文章: PHP反序列化漏洞入门 easy_serialize_php wp 实战经验丨PHP反序列化漏洞总结 PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患 利用 pha ...
- MySQL事物原理及事务隔离级别
mysql事物 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换为另一种状态. 事务必须服从ISO/IEC所制定的ACID原则.AC ...
- Java多线程原理+基础知识(超级超级详细)+(并发与并行)+(进程与线程)1
Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...
- lua的table表去重
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 我的个人博客 方法一 用过lua的人都知道,lua的table中不允许存在相同的key,利用这个思想,我们可以将原始table ...
- Jexl表达式引擎-根据字符串动态执行JAVA.md
Table of Contents generated with DocToc 一.使用场景 二.市面上表达式引擎比较 2.1 Aviator 2.2 Jexl 一.使用场景 在做某些项目的时候,有时 ...
- k_means算法+python实现
文章目录 一.原理 二.算法步骤 三.实例如下: 四.python代码实现: 一.原理 K均值算法使用的聚类准则函数是误差平方和准则,通过反复迭代优化聚类结果,使所有样本到各自所属类别的中心的距离平方 ...
- 01 安装Linux虚拟机
平常的工作学习中,Linux成为了一项比不可少的需要的掌握的技能,但是大部分人又不习惯于使用Linux进行生活,所以你需要在你的Windows电脑上安装一个虚拟机,那如何安装呢?其实不难,跟着我一步步 ...
- 高效C++:实现
本章主要是解决如下问题: 类的声明和定义在什么时候提出 类与类之间的耦合关系如何降低 类型转换怎么正确使用 尽可能延后变量定义式的出现 变量用到时在定义,不要提前定义,防止变量定义而没有使用的情况,因 ...
- 字符串学习总结(Hash & Manacher & KMP)
前言 终于开始学习新的东西了,总结一下字符串的一些知识. NO.1 字符串哈希(Hash) 定义 即将一个字符串转化成一个整数,并保证字符串不同,得到的哈希值不同,这样就可以用来判断一个该字串是否重复 ...
- Android中Activity的启动模式和使用场景
一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...