前言

从我面试的经验来看,网易这个公司是很会深究的一个公司,会努力在一个点上将面试者问倒的公司,所以对于网易游戏的面经我不会倾向于简单的罗列问题,而是对他们提出的问题从原理上进行深度的理解。正因为被他们问的很深,所以对于问的问题我有很深的印象,前面的两篇博客分别是关于python的特性,关于python的部门还没有完,后续还会再写一些面试题目的,今天要说的是一个网络程序——traceroute,面试官当时让我讲述traceroute的原理,这个在之前我知道他使用ICMP结合TTL来实现的,实现也是相当巧妙,今天的博文参考TCP/IP详解卷一,来彻底的搞清楚这个程序。

正文

在Windows下,相同的功能的实现命令为:tracert,首先至关的感受下traceroute命令的效果。我执行了两次tracerout百度的命令,结果如下:

根据上面的执行结果包括对于程序的名字traceroute相信没有接触过这个命令的人也可以大体猜出来这个命令的作用——路由跟踪,即确定IP数据包访问目标所经过的路径,当然这些路径指的是路由器。对于执行结果的每一行来说,比如3 2ms 1ms 1ms 10.6.17.1表示从本机出发的第三跳路由器地址为10.6.17.1,中间的三列时间显示了RTT,即数据包到达此跳路由或主机再返回你的主机所需要的时间,单位是毫秒,为什么是三列呢?因为traceroute发送了三个独立的数据包,统计出了每个RTT,而国内很多博客在这里存在误区,认为三列分别代表最小,平均和最大时间,有的时间栏没有具体的数字,只是一个星号,这个可能有多种多样的原因,比如路由器禁止了ICMP数据包,traceroute程序本身就被用来发现网络故障,如果从某跳开始所有的时间都成了星号,即超时,则网络故障很有可能就出现在了这一跳。从上面两次执行结果可以看到,traceroute命令执行的结果不是完全相同的,这个也是很容易理解的,毕竟网络是动态时时变化的。
Traceroute程序使用ICMP报文和IP首部中的TTL字段,TTL由发送端初始化,当路由器接收到一份IP数据包,如果TTL字段是0或者1,路由器将该数据包丢弃,并给源主机发一个ICMP“超时”信息。按照这个基本的相应过程,可以猜想traceroute程序的完整过程,首先它发送一份TTL字段为1的IP数据报给目的主机,处理这个数据报的第一个路由器将TTL值减1,然后丢弃该数据报,并给源主机发送一个ICMP报文,这个报文包含了路由器的IP地址,这样就得到了第一个路由器的地址,然后,traceroute发送一个TTL为2的数据报来得到第二个路由器的IP地址,继续这个过程,直至这个数据报到达目的主机。按照这个原理我们也可以很好的解释了上面tracert www.baidu.com的结果了,即所有显示的13跳是从我到百度119.75.218.70这个服务器所经过的所有路由器的信息,而且由于网络是动态变化的,路径也可能会发生变化,所以如果追踪同样的目的IP,发现不同的路径当属于正常情况。
****
这里必须加一条分割线,因为这个知识我相信很多人在很早之前就知道了,但是面试官的面试重点显然不在上面的知识点,如果你回答了上述过程,面试官肯定会接着问一个问题:目的主机在接收到TTL值为1的IP数据报是不会丢失的吧,这样也不会产生一个超时的ICMP数据报文了,那么程序如何判断是否已经到达目的主机了呢?
在Linux下,traceroute程序发送一个UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,因此,当该数据报达到目的主机的时候,目的主机会产生一个“端口不可达”错误的ICMP报文,这样,traceroute程序要做的就是区分接收到的ICMP报文是超时还是端口不可达,从而来区分是路由器还是目的主机。
****
下面进行实验验证,仍然用上面的例子,用wireshark抓取数据报来验证。由于主机上有大量的数据报文,所以我们根据本地IP地址和百度服务器的IP地址进行数据报过滤,按照我的例子过滤条件应该为:ip.src==192.168.99.200&&ip.dst==119.75.218.70,首先整体看一个过滤之后的报文总体情况,如下图:

其中浅色背景的表示本机构造的ICMP数据报文,深色的表示超时ICMP报文,如果细心的人就会发现:所发送的数据报的数量要大于路径上的路由器的数量,这个上文也提到过,每一跳都会发送三个报文,同时相应报文的数量少于构造报文数量,因为有些路由器禁止相应ICMP数据报,只提供转发功能,所有本地发出的构造ICMP数据报源IP都是本地,目的IP都是百度的IP地址,所有相应的超时ICMP数据报的目的IP都是本地,源IP地址分为为路由器的IP地址,首先来看一个本机构造的ICMP数据报文:

在这个报文中,可以注意他的TTL的值为1,同时他填充的负载为0,相同的报文会发送3次,接着再看这个报文的响应报文:

在这个响应报文中应该注意的点我都用红色方框圈出来了。
关于最后确定是否达到目的主机则和具体的操作系统有关系,在Windows下,我猜测他可以通过正确的回应ICMP数据报得出已经到达目的主机,而在Linux下面,则是通过上文所说的原理实现的,附图如下:

总结

关于traceroute的内容,如果在进行深究,还有很多很多,比如他可以通过ICMP,TCP实现,在Windows下面达到目的主机之后会停止发送traceroute数据报,但是在Linux下,会持续发送30个TTL不同的数据报,每个发送三个报文,在达到目的主机之前可以发送ICMP,TCP等,但是在达到之后,开始发送UDP数据报,目的端口从大于30000的某个值开始,没发送一个数据报则加一,这个从上面的截图也可以看出。
好公司在面试的时候都会揪住一个点问的很深很深,所以在自己的领域,将基础知识一定要掌握的十分好。

转载于:https://www.cnblogs.com/cotyb/p/5341439.html

网易游戏面试经验(三)相关推荐

  1. 网易python面试_网易游戏面试经验(一)

    前言 最近一直没有写博客,在忙着准备申请各大公司的实习,现在基本已经定下来了,特将这段时间面试中遇到的问题进行总结和解答,主要包括一些网络.算法.操作系统.python的问题,这些问题并不是以往比较常 ...

  2. 【面试】网易游戏面试题目整理及答案(3)

    网易游戏面试题目整理及答案(3) 数据库部分 MySQL 事务 MySQL锁机制 MySQL调优 MySQL分区.分表.分库 主从复制 其他问题 数据库部分 MySQL 事务 事务的隔离级别有哪些?M ...

  3. 【面试】网易游戏面试题目整理及答案(5)

    网易游戏面试题目整理及答案(5) 算法 操作系统 Linux部分 其他 参考资料 算法 Leetcode 75题:请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征: 1)每一行 ...

  4. 【面试】网易游戏面试题目整理及答案(1)

    网易游戏面试题目整理及题目(1) Python部分 计算机网络 参考资料 Python部分 迭代器生成器,生成器是如何实现迭代的? 答:迭代器iterator:迭代器就是实现了迭代方式的容器,iter ...

  5. 网易python面试经验_【网易游戏Python面试】第一轮hr电话面试-看准网

    10.21终面已参加,希望能顺利通过终面拿到offer-❤一共三轮,电话面试+笔试+视频面试,视频面试3V110月19日投的新媒体运营的简历,HR说因为是周末,等工作日再联系我,在周一下午三点我接到了 ...

  6. 网易电话面试经验——C 游戏服务器开发

    项目 服务器架构 C++基础 1.深拷贝和浅拷贝的区别 默认拷贝构造函数实现的是浅拷贝,浅拷贝只拷贝指针本身,不拷贝指针指向的数据内容 浅拷贝一般情况下没有问题,但类成员出现指针时,会导致指针悬挂 2 ...

  7. 网易python面试经验_Python程序员应该如何准备面试

    当前Python语言的上升趋势非常明显,随着大数据和人工智能领域的发展,Python语言未来的应用前景还是非常值得期待的.另外,Python语言在Web开发.嵌入式开发和各种后端服务开发中也扮演着重要 ...

  8. 网易游戏面试--两次股票买入卖出的最大收益

    第一问: 对于只有一次买入卖出的最大收益可以参照http://blog.csdn.net/calmreason/article/details/7904062,已经将的非常详细了 第二问: 当时做完这 ...

  9. 腾讯,百度,网易游戏,华为笔面经验

    应届生上泡了两年,一直都是下资料,下笔试题,面试题.一直都在感谢那些默默付出的人. 写这个帖子花了我两个夜晚的时间,不是为了炫耀,只是为了能给那些"迷惘"的学弟学妹,一点点建议而已 ...

最新文章

  1. Keras使用多个GPU并行
  2. python爬网页数据到 excel 自动化_Selenium2+python自动化之读取Excel数据(xlrd)
  3. 详解在Visual Studio中使用git版本系统(转)
  4. spring+websocket综合(springMVC+spring+MyBatis这是SSM框架和websocket集成技术)
  5. 机器学习用于数字图像处理_用于创建数字内容的免费电子学习工具
  6. 查看linux cpu负载均衡,关于linux内核cpu进程的负载均衡
  7. JavaScript中注册时间处理程序的方式
  8. 什么是 USB 3.1
  9. oracle 如何添加数据文件,在Oracle数据库里插入excel文件数据的步骤
  10. SignalTap II里面Power-Up Trigger的使用
  11. 插件占坑,四大组件动态注册前奏(二) 系统Service的启动流程
  12. JAVA汽车4S店管理系统
  13. securecrt通过ssh连接板子: 密钥交换失败,没有兼容的加密程序
  14. 推荐几款常用的日志分析利器
  15. 独家 | 强化学习必知二要素——计算效率和样本效率
  16. 数组取第一个元素和最后一个元素
  17. 数学三次危机(二)毕达哥拉斯学派的数学思想
  18. 韩国PAYWAVE认证之韩城攻略
  19. argue的一个用法
  20. 深度学习入门(三)——神经元激活值的计算方法

热门文章

  1. Java中static关键字的作用
  2. 在java中以下 愿意5米的内容_请按时完成并提交作业
  3. Flutter环境搭建
  4. win10系统自定义日历应用背景图片怎么设置
  5. 年终总结—自律给我自由
  6. VLSI数字信号处理系统——第六章折叠
  7. 软考-软件设计师 - 第9章 数据库技术基础【附补充常考知识点】
  8. 与民航同行,更多云和之旅即将启程
  9. OpenCv——5鼠标绘制矩形
  10. 智能门锁丨家电领域中的触摸芯片推荐