1006 计算机网络学习 第一篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_30531261/article/details/82950717

前言

工作中,时不时会接触到跟计算机网络有关的问题,虽然很多时候,不需要我去解决,但是也发现,如果我能看懂听懂,那我就能更好的理解系统,以及学到更多的东西。但是现在由于我懂得太少,以至于白白错过了好些知识。因此,下定决心好好学习计算机网络!

工作遇到的问题

前段时间在工作中弄的一个模块,是跟情报板有关的。系统的功能就是定时从消息队列根据订阅的主题获取数据(路况信息),然后通过soekct通信将信息发送到相应的机器(后面称为下位机)上,然后下位机就会将路况信息显示到大屏幕上。当时有的下位机是连接网线的,有的下位机由于环境不支持所以只能通过连接WiFi的方式连网。
当时遇到的问题就是,有线的渠道,我们系统发送信息过去,下位机能收到。而无线的方式,系统发送数据过去,下位机收不到。一直在排查问题,但是一直没能找出是哪里出问题。最后发现问题是在这边系统和那边下位机之间的路由上。由于路由分段发送数据的时间间隔出厂设置是7秒,导致下位机接收数据时段间间接数据过长,而无法正常接收数据。最后通过修改路由的发送分段信息的时间间隔,解决了这个问题。

当时一脸懵逼。路由是个什么东西?数据为什么会分段传输?也开始意识到,计算机网络的知识很重要,也发现,自己欠缺的知识太多了,只停留在编程语言上是不行的。

如果能让我回头再读大学,我一定会好好学计算机网络,当然,操作系统和计算机组成原理也很重要!。既然时光不能倒退,那就现在再把计算机网络给学一遍吧。

零散的知识的学习

下面记录一下零散的知识,主要关于ping指令、ICMP协议、MTU、MSS、以太网帧。也算是学习计算机网络的一个开头吧。

看了一篇mtu有关的文章:https://yq.aliyun.com/articles/222535, 然后又顺带看了下ISO7层模型的一些文章。

下面是整理的一些收获。

ping指令和ICMP

首先是ping指令,在测试mtu值的时候用到了ping命令,虽然开始的时候测出了mtu值,但是发现自己好多东西都没搞懂。

带着最初的疑问:为什么是mtu是1500,而ping指令写的是1472,一边思考,一边查阅各种相关文章,又引出了各种问题,然后发现自己计算机网络的知识真的忘得一干二净了。

譬如说,ping是什么,为什么写个ping www.baidu.com就可以知道该url能不能访问。譬如说,为什么mtu是1500,而ping指令是这么写:ping -l 1472 -f www.baidu.com,为什么是1472,另外的28字节去哪了。ping和ICMP协议有关联?

首先,从ping指令入手,ping指令常用来判断目标服务器是否能访问,通过ping ip地址来测试。ping是简称,全称是什么?package internet grope,译为因特网包探索器。ping的过程使用的协议就是ICMP协议。

ICMP是简写,全称是什么?Internet Control Message Protocol,译为Internet控制报文协议,是TCP/IP协议族的一个子协议,用于在IP主机、路由之间传递控制信息。控制信息指的是网络通不通、主机是否可达、路由是否可用等网络本身的消息。而ICMP协议规定,目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。

因此,当我们执行ping www.baidu.com时,当目的主机即域名www.baidu.com所在的主机可达时,会返回应答报文。正是因为ping的底层是通过ICMP协议,所以可以起到测试目的主机是否可达的作用。

当我们通过ping -l 1472 -f www.baidu.com时,表示什么?表示的是向目的主机发送一个报文数据指定为1472字节且不可分片的ICMP报文。因此。这个1472表示的是ICMP报文数据域信息为1472字节。

MTU是什么

MTU是简称,全称是Maximum Transmission Unit,译为最大传输单元。是数据链路层的一个概念。MTU限制的是数据链路层的payload,即上层协议的大小,例如IP、ICMP等。

一个标准的以太网数据帧的大小是:1518字节。头信息占14字节,尾部CRC占4字节,另外的1500字节就是MTU,就是留给上层协议传输数据的大小。
数据帧结构分为三部分:帧头+数据部分+帧尾,具体如EthernetII帧的结构 = DMAC(6Bytes) + SMAC(6Bytes) + Type(2Bytes) + Data + CRC(4Bytes)。
对了,数据帧,是数据链路层的传输单元。局域网中,一般是以太网帧,除此之外,还有其他类型的帧。数据帧数据链路层之上,是网络层。即数据链路层的payload,装载的就是网络层的数据。

那当mtu是1500时,为什么ping -l 1472 -f www.baidu.com这里写的是1472呢?前面说了,这个命令的含义是向域名为www.baidu.com的主机发送报文数据域为1472字节的ICMP报文。因此,这个1472表示的是ICMP的报文数据域信息的大小。这个数值表示的是ICMP报文的数据域大小。

那当mtu为1500时,它和1472这个数字之间的关联是怎样的呢?

mtu1500字节 = ip报头(20字节)+ icmp报头(8字节)+icmp报文数据域最大值(1472字节)。
前面说了,ICMP报文是包含在IP数据报中的。因此ICMP报文中是以ip报头开头,然后紧接着icmp报头,这里共占28字节。因此,ICMP报协议在实际传输过程中数据包为:20字节IP报头+8字节ICMP报头+ICMP报文数据域(最大值为mtu-28字节)。即ICMP报文的最大值位为mtu值。

如何查看网关的mtu值?通过netsh interface ipv4 show subinterfaces,如:

[c:\~]$ netsh interface ipv4 show subinterfaces

   MTU  MediaSenseState   传入字节  传出字节      接口
------  ---------------  ---------  ---------  -------------
4294967295                1          0     122675  Loopback Pseudo-Interface 1
  1500                1  1894223553   42059628  WLAN
  1500                5          0          0  本地连接* 1
  1500                5          0          0  本地连接* 3

可以看到,默认的mt都是1500。这里因为本机使用的是wifi上网,因此只有WLAN那行的传入字节和传出字节不为0,其他的本地连接1和本地连接3都为0。

一个有助于理解的MTU的例子

这里举一个具体的例子说明IP包分片的原理。以太网的MTU值是1500 bytes,假设发送者的协议高层向IP层发送了长度为3008 bytes的数据报文,则该报文在添加20 bytes的IP包头后IP包的总长度是 3028 bytes,因为3028 > 1500,所以该数据报文将被分片,
注意:分片时仅仅对上层的数据进行分片,不需要对原来的IP首部分片,所以要分片的数据长度只有3008,而不是3028. 这特别容易出错。
分片过程如下:

  1. 首先计算最大的IP包中IP净荷的长度 =MTU-IP包头长度=1500-20= 1480 bytes。
  2. 然后把3008 bytes按照1480 bytes的长度分片,将要分为3片,3008= 1480+1480+48。
  3. 最后发送者将为3个分片分别添加IP包头,组成3个IP包后再发送,3个IP包的长度分别为1500 bytes、1500 bytes和 68 bytes。
    从以上分片例子可以看出第一、二个分片包组成的IP包的长度都等于MTU即1500 bytes。

mtu值过大过小会怎样?
如果本机的mtu比网关的mtu大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。如果本机的mtu比网管的mtu小,则不能充分利用资源,没有发挥出最大传输能力。

MSS及其与MTU的关系

MSS是简称,全称是Maximum Segment Size,译为最大报文段长度。MTU是数据链路层的概念,而MSS是传输层中TCP协议的一个概念。前面我们说的ping用的是ICMP协议,即ICMP报文,但并非所有报文都是使用ICMP协议,还有TCP协议。ICMP协议是不传递用户数据的,TCP报文才传送用户数据。当数据链路层的payload即数据域装在的是IP报文中是TCP报文时,当使用的是以太网帧,即数据帧的大小是1518字节时,mtu是1500字节,即IP报文的最大值时1500字节。那么此时最大报文段长度MSS=1500字节的MTU - 20字节的IP报头 - 20 字节的TCP报头=1460字节,即MSS=1460字节。MSS就是TCP数据包每次能够传输的最大数据分段。

网络层协议如IP协议会根据MTU值来决定是否要把上传传下来的数据进行分片。IP协议是TCP/IP协议簇中最为核心的协议。在局域网环境中,IP协议往往被封装在以太网帧中传输,而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传输。

感想

这篇文章是在原本写的两篇文章上再整理的,因为发现之前写的太过零散。一开始觉得,看懂了,但是一写下来,发现自己千头万绪,十分凌乱。似懂非懂。写的很勉强,但是,也在做笔记的过程中,思路逐渐变得清晰。能把一些信息关联起来,串起来理解。

虽然写的很不容易,不过可能在别人眼里还是很零散吧。哈哈我尽力了。也有了不少收获。可能文章会有错漏之处,如有看到,还请指出。下面是参考文章,有的写的真的很棒但是感觉自己没看懂多少,一遍没看懂,再看再看再看,慢慢就理解了。

我也在想,别人常说程序员科班出身和半路出家,思维、知识体系还是差很多的。我想,说的就是对计算机网络、操作系统、计算机组成原理这些知识的了解吧。如果说,我连这些知识都忘关了,那我和半路出家的又有什么区别?

最后还想说,写这种文章真的不容易啊,心里更加佩服那些能把计算机网络写的很有趣的大神了,真的太厉害了。

参考文章:

http://www.elecfans.com/news/wangluo/20171103574448.html
https://www.cnblogs.com/softidea/p/5541302.html
https://blog.csdn.net/u011784495/article/details/71743516
https://baike.baidu.com/item/mtu/508920?fr=aladdin
https://blog.csdn.net/stpeace/article/details/74078916
https://zhidao.baidu.com/question/471136333.html
https://jingyan.baidu.com/article/ad310e80ff9bf81849f49ea9.html
https://zhidao.baidu.com/question/110409984.html
https://blog.csdn.net/msdnchina/article/details/78145385
https://yq.aliyun.com/articles/222535

猜你喜欢

转载自blog.csdn.net/weixin_30531261/article/details/82950717