福哥答案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 后敲回车,发包前会发生什么?的更多相关文章

  1. 2020-07-02:在浏览器输入一个url后按回车,会发生什么?

    福哥答案2020-07-02: 简单回答: 域名解析. 建立TCP连接. 请求. 处理. 响应. 释放TCP连接. 页面渲染. 中级回答: 域名解析 浏览器DNS缓存. 操作系统DNS缓存. 路由器缓 ...

  2. 用WPF写一个登录界面,我想在输入完密码后按回车就能够验证登陆,而不需要用鼠标单击登陆按钮

    在wpf中,将按钮的IsDefault设置为true ​​​​

  3. CENTOS7配置静态IP后无法ping通外部网络的问题

    我今天想谈论的并不是如何配置静态IP,这样的话题已经有好多高手再谈. 我想谈的是为什么,我按照他们的教程无论如何也要发生各种问题,没办法连接外网的问题. 先给大家看我的最终版配置方案:我只修改了一个文 ...

  4. 网易笔试题:浏览器中输入一个url后回车到返回页面信息的过程

    You enter a URL into the browser输入一个url地址 The browser looks up the IP address for the domain name浏览器 ...

  5. 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程

    第一步:登录阿里云官网,获取服务器ECS的指定公网IP地址. 1.输入阿里云官网账号进入首页,如下图: 2.点击进入"管理控制台",如下图: 3.点击"云服务器ECS&q ...

  6. 您为这个网络适配器输入的IP地址xxx.xxx.xxx.xx已经分配给另一个适配器xxx...

    您为这个网络适配器输入的IP地址xxx.xxx.xxx.xx已经分配给另一个适配器‘xxx NIC’.... 2008年11月03日 星期一 08:51 问题现象:   在网卡的TCP/IP属性中无法 ...

  7. vmware中nat模式中使用静态ip后无法上网的问题

    在/etc/network/interfaces中添加静态ip auto eth0iface eth0 inet staticaddress 192.168.31.133netmask 255.255 ...

  8. Linux设置静态IP后出现的几种问题

    一.设置静态IP后无法重启网卡 如下图所示 原因分析:control process exited with error code.控制进程存在错误代码. 解决方案:可以检查网卡配置文件是否修改错误. ...

  9. 经典面试题:在浏览器地址栏输入一个 URL 后回车,背后发生了什么

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...

随机推荐

  1. PHP 反序列化漏洞入门学习笔记

    参考文章: PHP反序列化漏洞入门 easy_serialize_php wp 实战经验丨PHP反序列化漏洞总结 PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患 利用 pha ...

  2. MySQL事物原理及事务隔离级别

    mysql事物 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换为另一种状态. 事务必须服从ISO/IEC所制定的ACID原则.AC ...

  3. Java多线程原理+基础知识(超级超级详细)+(并发与并行)+(进程与线程)1

    Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...

  4. lua的table表去重

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客 方法一 用过lua的人都知道,lua的table中不允许存在相同的key,利用这个思想,我们可以将原始table ...

  5. Jexl表达式引擎-根据字符串动态执行JAVA.md

    Table of Contents generated with DocToc 一.使用场景 二.市面上表达式引擎比较 2.1 Aviator 2.2 Jexl 一.使用场景 在做某些项目的时候,有时 ...

  6. k_means算法+python实现

    文章目录 一.原理 二.算法步骤 三.实例如下: 四.python代码实现: 一.原理 K均值算法使用的聚类准则函数是误差平方和准则,通过反复迭代优化聚类结果,使所有样本到各自所属类别的中心的距离平方 ...

  7. 01 安装Linux虚拟机

    平常的工作学习中,Linux成为了一项比不可少的需要的掌握的技能,但是大部分人又不习惯于使用Linux进行生活,所以你需要在你的Windows电脑上安装一个虚拟机,那如何安装呢?其实不难,跟着我一步步 ...

  8. 高效C++:实现

    本章主要是解决如下问题: 类的声明和定义在什么时候提出 类与类之间的耦合关系如何降低 类型转换怎么正确使用 尽可能延后变量定义式的出现 变量用到时在定义,不要提前定义,防止变量定义而没有使用的情况,因 ...

  9. 字符串学习总结(Hash & Manacher & KMP)

    前言 终于开始学习新的东西了,总结一下字符串的一些知识. NO.1 字符串哈希(Hash) 定义 即将一个字符串转化成一个整数,并保证字符串不同,得到的哈希值不同,这样就可以用来判断一个该字串是否重复 ...

  10. Android中Activity的启动模式和使用场景

    一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...