【计算机网络 - 基础问题】每日 3 题(三十九)

✍个人博客:https://blog.csdn.net/Newin2020?type=blog

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)

115. traceroute ------ 差错报文类型的使用

有一款充分利用 ICMP 差错报文类型的应用叫做 traceroute(在 UNIX、MacOS 中是这个命令,而在 Windows 中对等的命令叫做 tracert )。

1. traceroute 作用一

traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。

traceroute 的参数指向某个目的 IP 地址:

traceroute 192.168.1.100

这个作用是如何工作的呢?

它的原理就是利用 IP 包的生存期限 从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的一种方法。

比如,将 TTL 设置 为 1,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时。

接下来将 TTL 设置为 2,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。

这样的过程,traceroute 就可以拿到了所有的路由器 IP。

当然有的路由器根本就不会返回这个 ICMP,所以对于有的公网地址,是看不到中间经过的路由的。

2. traceroute 作用二

traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。

这么做是为了什么?

这样做的目的是为了路径 MTU 发现。

因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500 字节,但是非以太网的 MTU 值就不一样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。

116. 如何判断收到的报文是一个完整的 IP 数据报而不是某个 IP 数据报的分片?

IP 数据包的包头存在三个 bit 的表示位,第一个标识位备用,中间位 DF(Don't Fragment),DF = 0 表示能分片,DF = 1 表示不能分片。最低位为 MF(More Fragment) ,MF = 1 表示后面还在传输数据报的分片,MF = 0 表示最后一个报文段。

IP 数据包还有一个片偏移的字段,当片偏移为 0 时,表示这个数据报文没有分片,或者第一个分片。

两者可以结合来进行判断。

117. 路由表示做什么用的?在 Linux 环境中怎么来配置一条默认路由?

简:路由表是用来决定如何将包从一个子网传送到另一个子网的,换句话说就是用来决定从一个网卡接收到的包应 该送的哪一张网卡上的。在 Linux 上可以用 "route add default gw <默认路由器IP>" 来配置一条默认路由。

详:路由表是用来决定如何将包从一个子网传送到另一个子网的,换局话说就是用来决定从一个网卡接收到的包应 该送的哪一张网卡上的。路由表的每一行至少有目标网络、netmask、到这个子网应该使用的网卡。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的 netmask 和包里的目标 IP 地址做并逻辑运算 (&) 找出目标网络号,如果此网络号和这一行里的网络号相同就将这条路由保留下来做为备用路由,如果已经有备用路由了就在这两条路由里将网络号最长的留下来,另一条丢掉,如此接着扫描下一行直到结束。如果扫描结束任没有找到任何路由,就用默认路由。确定路由后,直接将包送到对应的网卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。

题外话:路由算法其实效率很差,而且不 scalable,解决办法是使用 IP 交换机,比如 MPLS。 在 Linux 上可以用 "route add default gw <默认路由器IP>" 来配置一条默认路由。

相关推荐
boligongzhu几秒前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee2021几秒前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
goTsHgo3 分钟前
在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
spring boot·后端·mvc
7yewh3 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha15 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
打鱼又晒网15 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
_WndProc17 分钟前
C++ 日志输出
开发语言·c++·算法
Q_192849990625 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
qq_4335545425 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
良许Linux29 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网