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 官 ...
随机推荐
- bzoj2296【POJ Challenge】随机种子*
bzoj2296[POJ Challenge]随机种子 题意: 求一个≤10^16的数,使这个数包含123456789且为x的倍数.x≤1000000. 题解: 16-6刚好等于10.因此我们可以直接 ...
- js&jsp规范问题
1.js初始化问题 一般与数据库交互的需要进行初始化,固定控件一般不需要初始化.有些需要整体浏览器页面校准的可能需要初始化. //初始化操作按钮 $(function(){ ...
- 【python大牛分享】python——接口自动化测试框架环境的使用
本文总结分享介绍接口测试框架开发,环境使用python3+selenium3+unittest+ddt+requests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用 ...
- OSCP Learning Notes - Enumeration(1)
Installing Kioptrix: Level 1 Download the vm machine form https://www.vulnhub.com/entry/kioptrix-lev ...
- Burp Suite Repeater Module - 中继模块
目的:节省网页应用分析时间 目标对象:http://10.0.0.15/getboo/login.php 通过调整Request的参数,不断尝试,通过Response查看状态.从而节省在浏览器中操作的 ...
- C++ 深搜调错
因为前两天某网站的比赛一个深搜错了,我只得了3等奖,我找不到错误,给别的大佬看他们又嫌恶心.emm……,比赛结束后我自己反思了一下,深搜写错了该怎么办,或者说怎样避免写错. 首先,变量名不要太ex,比 ...
- k8s(00)入门知识介绍
系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 k8s概念入门 目录 系列文章说明 k8s概念 ...
- python-元类和使用元类实现简单的ORM
元类 面向对象中,对象是类的实例,即对象是通过类创建出来的,在python中,一切皆对象,同样,类也是一个对象,叫做类对象,只是这个类对象拥有创建其子对象(实例对象)的能力.既然类是对象,那么类是通过 ...
- springboot文件上传 流的方式 后台计算上传进度
//代码 public static void main(String[] args) throws Exception { String path = "f:/svn/t_dictiona ...
- python基础--小数据池,代码块的最详细、深入剖析
本文转至太白金星 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存 ...