【计算机网络 - 基础问题】每日 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>" 来配置一条默认路由。

相关推荐
喵叔哟2 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生8 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow22 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
郑祎亦31 分钟前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
小牛itbull31 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i40 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落43 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
本当迷ya44 分钟前
💖2025年不会Stream流被同事排挤了┭┮﹏┭┮(强烈建议实操)
后端·程序员
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++