HCIE R&S 3.0第一课笔记:通信基础

学习目的:

• 深入理解数据通信的过程
• 理解数据承载报头各字段意义
• 掌握不同转发形式对数据处理的规则

数据通信的基本要求:

  1. 物理连接
  2. 协议支撑(双方都遵守的一个规则,能互相识别对方传递的内容)

通信过程分析:(由上到下分析)
在这里插入图片描述

首先思考设计网络的时候为什么要使用这样的模型(如果我们是设计者,我们会怎么设计网络呢)当时肯定是因为根据网络的一些特点来设计的,很大的一个考虑的程度其实就是因为协议的繁多(因为要传输各种不同是数据,协议自然而然就变多了),为了简化协议的定义,确保协议具有相应特定的功能和区分,更好的实现产品化,我们根据协议不同的用处,进行了一个网络通信模型的制作。

既然我们现在的网络基本上是按照TCP/IP这样的模型设计的(现在基本都从4层变成5层了,原来没有考虑物理层,与那里物理层和数据链路层统称为网络接入层),并且做的这么的成功,那么肯定是有它的很多优点的,但是我们首先会学习的是OSI七层模型。(TCP/IP模式其实比OSI七层模式还更早的出现)为什么会这样呢?因为OSI七层模型是完全根据ISO组织它的理解,对于数据的传递,识别内容的一个过程,根据不同协议的功能进行了详细的划分的,适合深入仔细的学习,方便掌握现有网络的一个真实的通信过程,那么既然这个模型这么好 ,但是为什么最后还是采用的是TCP/IP协议呢,最大的因素就是因为OSI七层模型过于理想化了,因为分的层次过多,比较复杂(现在一般只在学习上进行使用)在真实的环境下,为了方便产品化,我们利用TCP/IP五层模型进行实际网络的搭建。

TCP/IP五层模型这里就不过多回顾了,因为比较简单,我们从OSI七层模型上重新梳理一下通信的过程和他们制作这个模型的一个思路:从上到下进行分析

  1. 应用层的诞生:首先一个网络最终服务的是人,面对服务的是人这个群体,我们通过应用层的协议将计算机的里面的内容给人做一个展示,让人能够获得相应自己想要的信息,例如http协议,就是将内容转换为一个网页的形式让人能够进行识别的。

  2. 表示层的诞生:人能识别的东西,但是机器不能识别,并且机器是通过二进制的方式进行数据的识别的,我们需要将人能够看懂的信息转换为机器能看懂的信息,并且所有机器都能按照这些标准来进行一个转化(如果标准不同,信息转换成的二进制数机器也不能进行正常是识别),那么这里就需要一个统一的层对人能识别的信息按照一个同一标准转换为机器能够识别的信息(比如按照ASCII码的格式进行一个信息的转换)。(这里还会按照要求进行加密和压缩)

  3. 会话层的诞生:表示层表示出来后,机器就能够进行信息的识别了。现在需要考虑的是在本地设备上如何管理这么多不同的程序,并与对端的设备之间如何建立和维护一个会话了,每一个会话是一个逻辑上,软件层面的,在自己本地上进行的一个区分与连接,可以进行管理或者终止。比如QQ,我QQ发过来的数据到了你的设备上了,只能由你的边把的QQ程序进行接收,而不会让其他程序进行解析,保证了一个会话的独立性和可用性。不仅是QQ,FTP文件下载等也建立的一个会话。

  4. 传输层的诞生:前面三个层次主要是在自己的设备上如何进行实现的,这和真实的通信过程没有太大的关联,比如会话层的数据到底是怎么通过真实的网络传过去的,它并不清楚,它只管对收到的数据进行会话的建立和通过会话区别不同数据的传输就可以了,但是下面四个层次,就需要开始要考虑在真实传输的情况下是真的传输的,我们怎么把这里产生的数据传输到另外一边,并控制其传输的过程,它们的制定也是参考了真实传输的环境所制定的,越往下越接近物理,现在我们需要进行进一步的思考,既然每个程序会话是在主机上运行的,那么怎么保证两个主机之间的程序可以进行的传递和通信呢,我们怎么控制整个传输的过程呢?这样传输层就诞生了,传输层顾名思义,就是为了进行会话中数据的传输的,为了区别各种不同的程序会话,将不同程序的数据准确传输到另外一方的程序,在设计网络的时候就自然而然会考虑用一种编号来表示不同的会话,这里的编号也就是不同的端口号(专业术语),双方利用端口号标识一个传输的会话可以保证为上层不同的程序建立一个连接,进行其中的数据的传递,并且基于不同的建立方法可以进行不同的控制(这是传输层中非常重要的功能,比如一个谈话,当你在别人说话没听清楚时,可以要求对方再说一遍)。这里还需要注意的是传输层的协议分为两类:TCP和UDP,它们有着不同的特点,也在传输中起着不同的作用,TCP是面向连接的,而UDP是不面向连接的,刚刚我们说的端口连接的建立其实说的是TCP,TCP在我们生活中运用的比UDP要多一些。TCP主要用于:文件进行完整,可靠传输的时候,报文比较复杂,并且需要建立连接的报文。UDP主要用于:封装简单,识别效率快,使用在组播中。TCP是一对一,UDP是一对多的。比如发hello包就是使用UDP的。我们可以根据应用层的具体的应用进行选择使用什么封装格式好。例如我们用FTP,这里就用FTP的协议。

  5. 网络层的诞生:传输层解决的是主机到主机之间各个程序会话的一个连接传输控制的问题,他保证的是主机上各个程序能够进行一个连接和数据传输,现在的新的问题又出现了,就是我们保证数据能够到达相应的主机上呢?因为主机上程序之间信息的交互肯定是需要主机能够进行互相的通信的,这个时候,网络层出现了,网络层通过IP地址作为一个标识,实现了数据从任何一个主机到另外一个主机的整个传输的过程。同样,传输层也不会关心怎么到达对方的主机,只会考虑的是怎么和对方程序间建立以一个连接罢了,然后中间主机与主机通信的过程就是交给下层的网络层进行完成了。

  6. 数据链路层的诞生:数据链路层最大作用的体现是在在广播环境中,数据链路层上定义了MAC地址作为一个设备的唯一标识,为什么广播环境中需要MAC地址呢,因为如果数据进行的都是进行三层的转发,也就是网络层的转发,需要将数据解封装到网络层后查看相应的IP地址后才能进行,并且知道的是三层转发是查看路由表,并不会很快,另外在一个广播环境中,一个广播域里面有很多设备,如果每个三层设备每次接收到一个数据报文都需要通国IP地址来识别,最后进行报文的转换或丢弃,效率就太大大低了。为了规避这些缺点,设计者想出了用MAC地址进行一个广播域中传递的方法,我们通过MAC地址的特点设计了二层的交换转发,通过MAC地址的匹配进行同一广播域中的转发(MAC地址表和路由表的转发速度是有差别的,MAC地址只要匹配就转发,而IP路由表是需要全部查看完,然后选择最优的转发),另外三层设备在接收到的目的MAC地址和自己接口的MAC地址不相同就直接丢弃,相同的话再继续进行三层的操作,减少了不要的查表操作,这样可以让一个广播域中的数据能够被需要接受的对象才接收,而且MAC地址的唯一性保证了数据在每一个广播域传输的设备的身份是唯一的,不会出现传递给的设备传错了的这种情况。也就是说IP地址进行的是跨网段的通信,MAC地址是进行每一个网段之间的通信。另外需要注意的是PPP链路上没有MAC地址,可以通过以上的分析,既然对端只有一台设备,也不需要通过MAC地址来标识需要发送给的对方了,但是需要注意的是,PPP链路也有数据链路层,只要数据发送出去,肯定是对方接收到,并且PPP链路也不存在交换机,交换机是通过MAC地址在广播环境下进行转发的。

  7. 物理层的诞生:数据链路层已经很接近物理层了,数据链路层保证了直接相接设备(在一个广播域中)能够准确地传输,但是具体怎么将0,1编码成相应的物理信号,能够在真正的真实环境上传递这就是物理层的作用了,物理层将数据链路层封装好的帧通过编码然后从接口处发送出去,然后对方接收到后首先也会对接收到的信号做复原为0,1的比特流,然后进行下一步的操作。物理层上如果两个接口都是以最大的速率进行传输,接口一般闪绿色的光,如果不是最大速率,但是在运行,一般为橙黄色

我们可以发现,下层都是为上层所需要实现的目的进行进一步上的补充的,比如传输层进行了主机上程序间的传输的连接,但是并不知怎么到达主机,这样产生了网络层解决了主机之间互访的问题,所以说每一层之间的功能是被分开的,上层其实并不会察觉到还有下层是来做什么的,只需要将自己的功能完成,然后交给下层即可,然后再一层一层的封装报文最后到达物理层发送出来,接收时同样也是这样,不过是一层一层的解封装。既然每一层分工如此明确,实现的功能没有重复但是确实在层层递进,这样我们根据每一层的特点,就很方便制定每一层的协议了。对于TCP/IP协议,只不过是把前上三层协议融合成应用层。

由下到上进行每一层的分析+对应常用协议:

数据在物理层上的传递之前做的事情:

  1. 探测电流(保证线路可用,确认对方也是设备)
  2. 链路协商(协商链路的参数,如MTU值等,建立二层链路)
  3. 进行其他功能协议的协商,如OSPF
  4. 进行数据的发送(这个时候还是会发送探测电流进行保证链路没有断开)

这里就出现了一个问题,既然我们同时发数据信息,也发送探测电流,那么是怎么区分的呢?首先我们会将物理信号转换为0,1字符串,这是在数据信息前,都有一个专门表示这个是个信息的专门的信号,如果转换成0,1二进制表示时就是专门的帧界定符,由固定的0,1字符串进行表示,如果读取的字符串是这个帧的界定符,则表示这个是一个数据帧的开始,我们需要向后进行读数据了。

如果我们知道这是一个数据帧了,怎么读取相应的数据出来呢?协议可以分为两类,一类是承载型的协议,就是拿来承载数据用的,如IP协议,802.3,TCP/UDP。另外是应用型协议,如OSPF,rip等。现在我们坐从下往上的分析,也就是分析的是数据链路层中802.3等承载的协议。

数据链路层协议封装:
在这里插入图片描述

如上是数据链路常用的封装格式,数据链路层其实还支持很多种协议,如以太网,令牌环网,FDDI(光纤分布式数据接口)及RS-232串行线路等。但是现在基本上只会使用这两种协议了,当物理层接收到了信号后,转化为0,1比特流以后,我们按照什么标准进行读取呢?怎么判断这个PPP格式的帧,还是以太网格式的帧呢(以太网中只有这两种封装格式)?其实很简单,按照接口类型就是,如果接口是以太网接口,默认读取的帧就是以太网的帧,如果是串口,默认读取的帧格式就是PPP封装的格式。

以太网帧和PPP帧的区别:
最大的区别,以太网是一个广播链路,一个广播域可能有多个设备,所以以太网帧有MAC地址,为了在整个以太网中确定一个唯一确定到底哪个设备进行接收,减少链路的带宽消耗和设备处理时产生的消耗。而ppp帧在一条链路上只有对端,我们不需要通过MAC地址来表示接受方到底是谁,所以来数据帧上没有MAC地址的。其中的address地址全为F,没有实际的意义。

以太网帧字段的详细说明:
无论是哪种以太网的封装的格式,其实大体上都是差不多的,但是还是有一定的区别,但是可以通过字段的不同值分别到底是哪种类型的以太帧,首先当一个以太网接口接收到以后,会从帧界定符以后开始读取源目MAC地址,因为MAC地址长度固定,48bit,连续96bit后就会读取到一个类型/长度字段,这个字段占8个bit,如果表示的值大于1536,表示的是以太网2的帧,其含义为上层是什么协议,如0x0800表示的是IPV4报文,0x86dd表示的是IPV6报文,常用表示的如下:
在这里插入图片描述
这里出现的MPLS,802.1Q字段为在传统以太网上添加的字段,添加的位置是在MAC地址之后,原来协议字段之前,添加的部分它们同样有一个类型字段,告诉设备现在读取的是MPLS标签或者VLAN的tag,当读取完成后继续读取的协议/长度字段才是原来报文中的字段,如果表示的是类型就没有长度字段了怎么知道数据真的总长度呢?这个就只有看上层协议中所表示的长度了。如果协议类型字段小于1500,则表示以太帧中内容的长度,但是这样又不知道了上层是什么协议,这就需要LLC子层来进行表示了。当读取完成后,最后有4个字节的FCS的校验位,防止接收到的数据帧出现了偏差。

这里做一个记忆:
在这里插入图片描述
对于添加字段字段的了解:
802.1Q:
在这里插入图片描述
普通情况下一共四个字节,其中2字节的协议类型字段,表示这是一个tag,3bit的PRI,表示数据真的优先级0-7,7最优。CFI在令牌环网络中有效,以太网中无意义,占有1bit,最优是VLAN的标签,占12bits,范围为(0-4095)QinQ帧就是两个802.1Q字段的叠加,一个为内网tag,一个为外网tag。

MPLS标签字段:
在这里插入图片描述
mpls标签也是4字节,其中标签字段20bit,优先级3bit没有变化,S表示十分为最后一个标签,为1表示为最后一个,TTL字段的作用是进行标签转发防止环路,占8bit。

PPP链路帧说明:
在这里插入图片描述
PPP报文前后有益一个字节固定的flag字段,表示一个数据帧的界定,然后有一个自己的全1分地址字段,控制字段占1自己,默认为0x03,没有什么特别的作用,然后就是一个2字节的协议为,表示information字段包含的是什么报文,information字段是PPP真的载荷数据,长度可变,里面的类容先暂时不进行分析。最后为2字节的差错校验位。

了解了二层封装的协议之后,我们可以进行同一网段中相邻三层设备间的数据准确传输了,但是相邻链路接收到对方发来的信息后,如果自己就是对方发送的目标后,后下一步该怎么做呢,怎么进行不同网段的信息传输呢,就需要进一步了解封装在二层帧中的数据的内容了,一般封装在二层帧中的也就是三层的报文,这一层报文主要是为了进行不同网段的寻路,如ipv4,ipv6等,我们通过二层帧中的类型字段知道了上层的协议是什么,然后再按照对应上层协议的格式进行对格式的读取。

网络层报文格式:
Ipv4报文格式:
在这里插入图片描述
首先是网络层中的IPv4报头就没有在数据的最后有FCS校验位了,但是有头部的校验位,这里需要记住的是,协议中的每一层都有校验的,这使得功能重复繁琐了,所以在ipv6中将其取消了, IP报头范围为20-60字节,其中具体自动的内容如下:
在这里插入图片描述
第一行:
版本号:该字段为4bit,表示IP报文的版本信息,如果为0X4,表示为IPv4报文,如果为0x6,表示一个ipv6报文,注意ipv4报文和ipv6报文是完全不兼容的,所以在ipv4报文中这个字段始终为0x4。既然都是0x4,并且在帧中已经表示出来了上层报文是什么了,所以这个字段没有特别的意义。
首部长度:首部长度4个bit,但是表示的是20-60字节,所以首部长度每加一表示多4字节,最小取值为0101,表示20字节,还需要注意的是IPV4报头有20个字节的固定大小,还有不定大小了选择字段,能实现其他功能,但是这样就会出现一个问题,也就是说选项字段大小不定,那么在表示首部长度时只要不是4字节的倍数都无法表示,所以需要在必要时家伙是哪个值为0的填充字节,保证报文头部为4字节的倍数。
DS字段:8bit,表示优先级,其中的内容暂时不进行分析。
总长度字段:16bit,顾名思义,表示整个IP报文的长度,也就是头部加上数据长度,减去头部字段就是IP报文的数据字段的长度了,这个字段表示的长度在以太网2的数据帧中会进行使用,表示以太网帧中的数据长度。

第二横行是用来进行分片操作的:
ID字段:16个字节,标识不同数据,比如这个数据是用来做语音的,表示为A,另外一个数据是视频的,表示为B。一个数据包分片后的这个字段保持相同,方便同一个数据包进行组合。
Flags:区分分片后的数据包,占3bit,第一位为保留位,保持为 0,第二位DF(不分片)位,表示是否为能进行分片,如果是1,表示不能进行分片,0表示可以进行分片,最后一位为MF(更多的分片)为,表示是不是最后的分片,如果是最后的分片,表示为0,不是最后的分片,表示为1,后面还有更多的分片。
片偏移:占13位,表示分片报文离第原始报文头部相离的长度(比如1600,表示这个分片离最初报文头部有1600字节,如果按照最大1500MTU来分片的话,它离第一个分片的末尾有120字节),第一个分段的片偏移为零。有了片偏移和ID字段,我们就可以按照顺序对分片的报文进行组装了。这里需要补充的是,分片只针对数据部分,不针对报文头部,数据部分最多为1480字节。

第四行:
生存时间:1个字节,0-255,每经过一个路由器,TTL值都会减1, 0表示不可达,也是为了防止环路。另外,tracert命令也是通过这个机制进行检查的经过了什么链路的。
协议字段:1个字节,表示上层的协议是是什么,比如6为TCP,17为UDP,89为OSPF,另外ICMP也有协议字段,为1,这个协议最终被划分到了网络层中。
首部校验和:16字节,起一个IP头部的校验作用

第五行和第六行:
源目IP地址,各自占32bit。

最后一个字段:0-40字节的选项和填充字段
可选项(options)是用来提供一个余地,以允许后续版本的协议中引入最初版本中没有的信息,以及避免为很少使用的信息分配头部位。可选项是变长的,每个可选项都以一个字节标明内容。有些可选项还跟着有一字节的可选项长度字段,其后是一个或多个数据字节。可选项字段的长度以4字节计,现在已经定义了5个可选项,但并不是所有的路由器都支持5个可选项。
1.安全性选项说明信息的安全程度。实际上,所有的路由器都忽略该字段,因此它的唯一实际用途就是使间谍更容易找到好材料。
2.严格的源路由选择选择以一系列的IP地址方式,给出了从源到目的地的完整路径。数据报必须严格地从这条路径传送。当路由选择表崩溃时,系统管理员发送紧急分组,或作时间测量时,该字段很有用。
3.松的源路由选择选项要求分组遍及所列的路由器,而且以所指定的次序。但它可以在其间穿过其他的路由器。
4.记录路由选项让沿途的路由器都将其IP地址加到可选字段后,这为系统管理员以后分析这个数据包的来源提供了方便,可用来为路由选择算法查错。
5.最后,时间标记选项像记录路由选项一样,除了记录32位的IP地址以外,每个路由器还要记录一个32位的时间标记。同样地,这一选项可用来为路由选择算法查错。

Ping的各种参数的含义:
-a source-ip-address:设置发送ICMP ECHO-REQUEST报文的源IP地址。  
-c count:发送ICMP ECHO-REQUEST报文次数,范围1~4294967295。缺省为5次。  
-d:设置socket为debug模式。缺省为非debug模式。  
-f:设置报文发送的过程中不分片,只有IPv4支持。  
-h ttl-value:设置TTL的值,范围1~255。  
-i interface-type interface-number:设置发送ICMP ECHO-REQUEST报文的接口。  说明:  对于广播式链路(以太网),指定的目的地址将作为报文的下一跳地址。  
-m time:设置发送下一个ICMP请求报文的等待时间,取值范围1~10000,单位ms。  
-n:将host参数直接作为IP地址,而不需作域名解析。  
-p pattern:设置ICMP ECHO-REQUEST报文填充字节,格式为16进制,范围是0~FFFFFFFF。缺省情况下,填充方式为从0x00开始,递增至0xFF,然后循环。  -
q:只显示统计信息。缺省情况下,显示全部信息。  
-r:记录路由。缺省情况下,不记录路由。  
-s packetsize:ECHO-REQUEST报文长度(不包括IP和ICMP报文头),单位是字节,范围是20~8100。缺省报文长度是56字节。  
-system-time:显示报文发送时的系统时间。  
-t timeout:为发送完ECHO-REQUEST后,等待ECHO-RESPONSE的超时时间,单位是ms,取值范围是0~65535。缺省超时时间是2000ms。  
-tostos-value:指定发送ECHO-REQUEST报文的TOS值,范围0~255。  
-v:显示接收到的非ECHO-RESPONSE的ICMP报文。缺省情况下,不显示非ECHO-RESPONSE的ICMP报文。  
-v*n-instance v*n-instance-name:v*n实例名,字符串形式,不支持空格,长度范围是1~31。   host:目的主机的域名或IP地址。  
ipv6:对使用IPv6协议的主机进行Ping测试。  
-tc traffic-class-value: 指定回应请求报文中的流量类别,整数形式,取值范围是0~255,缺省值是0。   -v*n6-instance v*n6-instance-name: IPv6 v*n实例名称。字符串形式,长度范围是1~31。

MTU的最大长度指定的是网络层IP头部加上网络层的数据,所以如果网络层以上的数据大于了MTU值就需要分片,如果不允许分片,就无法正常的发出。

IPV6报文:
在这里插入图片描述
在IPV4报头里面,很多字段其实作用不大,比如头校验位,选项字段。为什么没有选项字段呢,是因为很多路由器其实不会去看,但是又必须读取了才会转发,降低了效率。

各个字段的含义:

第一行:
version:4bits 版本号 ipv6为6
Traffic Class: 8 bits,传输类别,可用于源节点或转寄路由器标识和区分IPV6包中的不同类别或优先级;类似于实现IPV4的TOS/DIFF
Flow Label:20bits 流标签,数据流不仅可以通过源目IP地址进行区别,还可以通过流标签进行,数据流是指从某特定的源节点向某特定的目的节点发送的数据包序列。当源节点希望中间的路由器对数据包进行一些特殊处理时,就可以使用数据流标签,不支持数据流标签的可以赋值为0;比如标记FTP等流量

第一行比ipv4报文少了报文总长度和报文头部长度,主要是ipv6报文头部长度是固定的40个字节,没有必要再进行标识,提高了效率。

第二行:
Payload Length: 16bits unsigned integer, ipv6的载荷长度,首部以外的长度(包括扩展首部)
Next Header:8 bits 指明紧跟IP首部后面的下一个首部的类型,包括拓展报头
Hop Limit:8bits unsigned integer,在每个传输此包的节点处减1,如果跳数限制减到0,就抛弃此包

这里我们只需要一个负载长度,就可以算出总长度了。并且没有校验和,这个字段太冗余了,还少了个分片,原来的带宽很小,传输延迟很大,分片的处理延迟就不会很体现出来,然后现在链路带宽已经足够大了,传输延迟已经很小了,所以如果分片,处理延迟就显得很大,并且报文几乎都不用分片就可以传递了,所以IPv6为了效率去掉了这段,

第三,四行:
Source Address:128 bit 源地址
Destnation Address:128 bit 目的地址

我们通过将需要的拓展报头添加在ipv6报头的后面,让ipv6报文更加的灵活。

ARP:ARP包括多种类别(普通ARP、RARP、Gratuitous ARP、InARP)主要掌握普通和无故arp
普通ARP:通过IP地址请求对方MAC地址
RARP:通过MAC地址请求IP地址
无故ARP:改变自己的ARP表项和地址重复检查等,或者更新交换机的MAC地址表(VRRP中)
IARP:在帧中继中使用,在帧中继中进行补充

普通,无故ARP报文格式:
在这里插入图片描述
硬件类型字段:指明了发送方想知道的硬件接口类型,以太网的值为1;
协议类型字段:指明了发送方提供的高层协议类型,IP为0800(16进制);
硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度(MAC地址就为6)(IP地址为4),这样ARP报文就可以在任意硬件和任意协议的网络中使用;
操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;
发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;
发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;
发送方IP(0-1字节):源主机硬件地址的前2个字节;
发送方IP(2-3字节):源主机硬件地址的后2个字节;
目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;
目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;(普通arp为全0,无故arp为全F)
目的IP(0-3字节):目的主机的IP地址。(普通arp为对方的地址,无故arp为自己的地址)

详细补充:https://blog.csdn.net/tigerjibo/article/details/7351992

逆地址解析协议 RARP
定义:
逆地址解析协议 RARP 使只知道自己硬件地址的主机能够知道其IP地址
用途:
这种主机往往是无盘工作站.因此 RARP 协议目前已很少使用
RARP 与 RAP:
在这里插入图片描述

网际控制报文协议 ICMP:网络层
目的:为了提高 IP 数据报交付成功的机会(IP为不可靠的协议),通过ICMP协议的功能,可以知道数据是否能够到达对端,如果数据不能到达对端是因为什么原因造成的。

*注意:
允许主机和路由器报告差错情况和提供有关异常情况的报告
ICMP不是高层协议,而是IP层的协议
ICMP报文作为IP层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去
ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和.接着的4个字节的内容与ICMP的类型有关

类型 :
3 终点不可达
11 时间超过
12 参数问题
5 改变路由
8或0 回送请求或回答
13或14 时间戳请求或回答
代码 : 进一步区分某种类型中的几种不同情况。
检验和 : 用于检验整个ICMP报文。但是IP首部检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP报文不产生差错。

*种类:
ICMP 差错报告报文:
(1)差错报告报文:
ICMP不能纠错,只能检查错误,发现错误报告给最初的数据源。其数据部分包含两部分:初始IP首部和数据报前8字节(TCP或udp 前8字节包含源端口和目的端口)

1)终点不可达:类型=3,代码0~15,首部,由路由器或者目的主机检查后发送差错报告给初始源数据。即使没有终点不可达差错报文也不能代表数据报交付成功。

2)源点抑制:类型=4,缺乏流量控制和拥塞控制。当路由器或主机丢弃数据报时,向源数据端口发送源点抑制差错报文。该报文两个作用:第一通知源点数据报已经丢弃,二通知源点慢点发数据。

A.路由器或主机每丢弃一个数据报就要向源点发送一个报告;b.这里源点无从得知什么时候拥塞解除,只能一直减速慢发数据,当没有收到ICMP差错报文开始认为拥塞解除;c.一对一时源点抑制能够对拥塞产生良好效果,但多对一时不一定,因为多个数据源,路由器丢弃的数据报不一定是发送快的那个,有可能是发送慢的,路由器不知道哪个数据源产生拥塞。

3)超时:类型=11,解决多个路由表中出现环路现象。每个数据报通过一个路由器生存时间就-1,当生存时间为0时,就向源点发送一个超时差错报告报文。如果报文的一个分片超时也发送差错报告报文。

4)参数问题:类型=12,参数具有二义性,路由器或主机都可差错报告

5)改变路由:5,数据源主机刚开始时,只保留一张很小的路由表,可能这上面的信息并不是最优路径,如果后续更新路径后要发送报告给数据源。

6)注意不产生ICMP数据报:a.对于已携带ICMP差错报文的数据报,B.对于分片的数据报,如果不是第一片C.具有多播地址的数据报 D.具有特殊地址的(127.0.0.0)数据报

ICMP 询问报文:
1)回送请求与回答:类型8或0
回送请求与回答可以判定两个主机之间是否可达,通常可以通过ping命令来实现
如果ping消息出现了报错:Request time out,说明请求报文发送出去了但2s没有得到回复报文或者自己没有对方的路由,或者在路由器上request报文无法发送也是超时报错,一般是ping 了一台网络中不存在的主机。
如果报错消息是 destination host unreachable 一般是收到了目标主机或中间路由器回应的端口或目标主机不可达icmp包。当主机request报文无法发送,是destination host unreachable报错,与路由器不同。
总结:当request报文发送出去的时候,Request time out是没有收到回复报文而超时报错的, destination host unreachable是收到了报错报文而报错的。当request报文没有发送出去的时候,路由器是超时报错,主机是不可达报错。
2)时间戳请求与回答:
确定IP数据报在这两个机器之间来回所需的往返时间。
通过类型和种类字段组合了很多不同类型的ICMP报文。

报文格式:
在这里插入图片描述
在这里插入图片描述

ICMP地址掩码请求和应答报文
在这里插入图片描述

ICMP时间戳请求和应答报文
在这里插入图片描述

ICMP不可达报文
在这里插入图片描述

ICMP回显请求和回显应答报文格式
在这里插入图片描述

ICMP超时报文
在这里插入图片描述

ICMP重定向报文
在这里插入图片描述

ICMP路由器请求报文格式
在这里插入图片描述

ICMP路由器通告报文格式
在这里插入图片描述

ICMP 源站抑制差错报文格式
在这里插入图片描述

ICMP 类型:做了解即可,记住00为ICMP reply报文,80是ICMP request报文
在这里插入图片描述

不应发送ICMP差错报告报文的情况:
对第一个分片的数据报片的所有后续数据报片都不发送ICMP 差错报告报文
多播地址的数据报都不发送ICMP差错报告报文
特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP差错报告报文

Tracert工作原理:

  1. 发送3个UDP包,TTL1,目的端口从33434开始依次叠加,这个端口几乎没有人会开启
  2. 第一跳路由器收到UDP包,TTL-1=0,产生ICMP超时报错,回复给发送者,携带了自己的IP地址,探测者就获得了第一跳。
  3. 然后发送TTL=2的报文,TTL-1-1=0,然后同理在第二跳报错。
  4. 探测到最后一跳时,不会报错,但是因为目的端口是没有打开的,会进行端口不可达的错误信息,同样探测端能够得到对方的IP地址。

网际组管理协议IGMP
报文格式:
在这里插入图片描述

作用:
它是TCP/IP 协议族中负责IP 组播成员管理的协议,用来在IP 主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系
功能:
当一台主机加入到一个新的组时,它发送一个IGMP消息到组地址以宣告它的成员身份,多播路由器和交换机就可以从中学习到组的成员.利用从IGMP中获取到的信息,路由器和交换机在每个接口上维护一个多播组成员的列表
两个阶段:
• 加入:
o 当主机加入新的多播组时,向多播组的多播地址发送IGMP 报文,声明自己要成为该组的成员.本地的多播路由器收到 IGMP 报文后,将组成员关系转发给因特网上的其他多播路由器
• 询问:
o 周期性地探询本地局域网上的主机,以便知道这些主机是否还继续是组的成员
• 注意:
o 因为组成员关系是动态的,因此本地多播路由器要只要对某个组有一个主机响应,那么多播路由器就认为这个组是活跃的
o 但一个组在经过几次的探询后仍然没有一个主机响应,则不再将该组的成员关系转发给其他的多播路由器
数据包:
IGMP 使用 IP 数据报传递其报文(即 IGMP 报文加上 IP 首部构成 IP 数据报),但它也向 IP 提供服务
具体措施:
• 在主机和多播路由器之间的所有通信都是使用 IP 多播
• 多播路由器在探询组成员关系时,只需要对所有的组发送一个请求信息的询问报文,而不需要对每一个组发送一个询问报文。默认的询问速率是每 125 秒发送一次
• 当同一个网络上连接有几个多播路由器时,它们能够迅速和有效地选择其中的一个来探询主机的成员关系
• 在 IGMP 的询问报文中有一个数值 N,它指明一个最长响应时间(默认值为 10秒)。当收到询问时,主机在 0 到 N 之间随机选择发送响应所需经过的时延。对应于最小时延的响应最先发送
• 同一个组内的每一个主机都要监听响应,只要有本组的其他主机先发送了响应,自己就可以不再发送响应了

TOS字段(流量优先级控制):
在这里插入图片描述

首先需要知道的是,流量优先级字段只能标识流量的优先级程度,并不能表明到底是什么流量。
在这里插入图片描述

Vlan tag中和MPLS报文中的表示优先级的字段都是3bit,0-7,越大越优先。默认情况下都是0,做尽力而为的转发。7为系统的报警字段,6一般为协议相关的控制信息,如ospf报文,5一般为语音流量,4一般为网帧流量(视频),优先级为0也叫做cs0,其他优先级类似。
在这里插入图片描述

在IP报文里,我们使用的是8bit来表示优先级,在最初的时候,只使用了前面3个bit,也就是和其他的一样,0-7来表示流量的优先级,但是因为流量种类很多,0-7完全无法满足真实的需要,所以后将后面三个字节划分作为优先级的标识,只是最后2个字节没有使用。
这也被称为了DSCP。
在这里插入图片描述

如果前面三个字段为111,后三个字段为000,向上兼容ip优先级的,表示为CS7,同样前三个字段110,后三个字段为000,表示为CS6。EF表示当前面三个字段为101,后面三个字段为110,也就是总体为46,表示加速转发。AF字段只用了前面的5个bit,前三个bit作为x,后两个bit作为y,x取值范围1-4,越大表示转发的优先级,后两个bit范围为1-3越大表示拥塞时丢弃的优先级,转发和丢弃的优先级是互相独立的。注意,第6位没有使用到就会保持为0,当y为0的时候,AF4表示的也就是CS4,AF3表示的也就是CS3,AF2表示的也就是CS2,AF1表示也就是CS1。最后BE表示的是6位全部为0的情况,也就是表示CS0。
注意:当一个设备不支持DSCP时,它只会查看前3位判断其优先级,但是在报文转发的时候,不会将后三位进行改变,直到传递给开启了DSCP功能的路由器时才会统一查看6位DSCP的查看。

如果我们进行转发的网络层报文的目的IP地址是自己,我们就会查看协议字段为多少,如果为6或者17。则表示这报文继续解封装到传输层,并且会通过上层的报文进行进一步的操作,如果是6,我们就会按照TCP的报文格式进行读取传输层的信息,如果是17,则会按照UDP的报文格式来进行读取传输层的信息。我们会根据实际的需要进行UDP,TCP报文的选择:

主要选择依据:
TCP:需要可靠传输,一对一传输,对传输的效率要求不是很高。
UDP:一对多传输,要求实时性的传输,要求很高的传输效率但是对可靠性要求不高的传输。

传输层TCP报文格式:
在这里插入图片描述

TCP是一种可靠的、面向连接的字节流服务。源主机在传送数据前需要先和目标主机建立连接。然后,在此连接上,被编号的数据段按序收发。同时,要求对每个数据段进行确认,保证了可靠性。如果在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。 
第一行: 
源、目标端口号字段:占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务范围(1-1023),源端口号一般为自定义的大于等于1024的端口号。
第二行和第三行:保证可靠性
顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节,每个报文中都会带有,会按照字节数进行相应的递增。  
确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节,只有当指针位ACK位为1时才会生效,通常为对端发送的***+1。
第四行:  
头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。我们可以发现,有头部长度字段的比如IPV4,TCP报文都是头部长度不固定的,如果头部长度固定,如IPV6,只需要有数据长度字段即可。 
标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:  
◆URG:紧急指针(urgent pointer)有效,接收方需要优先处理此数据,具体是什么数据需要看指针字段。  
◆ACK:确认序号有效。  
◆PSH:表示这是一个数据报文,接收方应该尽快将这个报文段交给应用层。  
◆RST:重建连接,重新进行三次握手。  
◆SYN:发起一个连接,三次握手时使用。  
◆FIN:释放一个连接,断开TCP连接。  
窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。在三次握手建立的时候,就会互相协商这个窗口大小,这是你希望对方发送的字节数,对方不会一次性发送超过窗口的字节数,当回复确认号时也是一起将发送过来的数据进行确认。确认号,或者序号增长的大小是字节数。

因为窗口机制,确认号和***,我们就知道了所带的数据包有多大了,所以这里不需要数据大小的字段。
 
第5行: 
TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。  
紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号,当紧急指针位为1时会查看此字段判断紧急的数据。  
最后:
选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。

三次握手:因为建立连接是双方同时建立的,所以只需要三次

在这里插入图片描述

过程:
1.TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
2.TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始*** seq=x(x一般取值为0,而且每一次TCP连接的时候都是重置为0),此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
3.TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个*** seq=y(初始化取值为0),此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
4.TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的***seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号(常见为了维持邻居关系的报文,***和确认号不会改变,TCP并没有专门维护邻居关系的keepalive报文,只是用了一个没有带数据的空TCP报文表示为keepalive报文)。
5.当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

为什么TCP客户端最后还要发送一次确认呢?
一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

四次挥手:断开连接的过程因为可能是一端数据传输完成后,单向先断开连接,对方传输给我的数据还没有结束,所以先不会停止另一边的连接,等数据传输完成后,再断开另一边的连接。因为连接是双向的,断开是独立的,所以需要4次。
在这里插入图片描述

过程:
1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其***为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2.服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的***seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3.客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的***为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的***是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6.服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

为什么客户端最后还要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

传输层UDP报文格式:格式非常简单
   在这里插入图片描述

UDP是一种不可靠的、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接。数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机。这时,每个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的情况下,UDP比TCP更加高效。  
第一行:
源、目标端口号字段:占16比特。作用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程。  
第二行:
长度字段:占16比特。标明UDP头部和UDP数据的总长度字节。这是因为UDP报文总长度不固定,只要是不固定的,我都需要用一个字段进行标识。
校验和字段:占16比特。用来对UDP头部和UDP数据进行校验。和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的。

UDP报文头部为8字节,是一个固定的值,所以不需要头部长度的字段。

传输层以上,就是应用层的数据了,应用层数据繁多而且各不相同,这里不进行更多的说明。

对数据处理的过程:
主机对应用层的数据:
在这里插入图片描述

  1. 一般主机在广播环境中,接口是以太网口,对收到的帧按照以太网网帧的格式进行读取
  2. 首先会查看帧里面的目的MAC地址,如果不是自己会直接丢弃,如果是自己,会进行拆包到网络层。
  3. 在网络层上首先会查看对应的IP地址,如果IP不是自己(或者是自己在的组播地址和广播报文),直接丢弃,如果是自己的对应地址,继续拆包到传输层
  4. 在传输层上会查看数据的目的端口号,如果是自己开启的端口,交给相应端口的应用层程序处理,如果不是自己开启的端口,会直接丢弃。

主机对arp报文的处理:

  1. 都是广播包,所以会接收
  2. 根据帧的类型字段拆封到网络层查看arp报文信息,如果请求的是自己的,按照源IP地址进行回复,如果不是自己的,直接丢弃。

二层交换机对应用数据的处理:
在这里插入图片描述

  1. 交换机收到数据后,首先会查看收到的数据帧是否带有tag,如果有tag,检测是否能够通过,如果不能通过,直接丢弃,能通过进行下一步操作
  2. 查看源MAC地址,直接在相应VLAN的接口上更新此条目
  3. 查看目的MAC地址,如果不是自己接收接口的单播MAC地址,进一步查找是否是广播,组播和本vlan中MAC地址表上没有记录的MAC,如果是,在本vlan允许通过的接口上,在除了出接口的其他接口进行泛洪(自己接口泛洪会出现重复帧的情况)。如果是在本设备vlan中MAC地址表的中,出接口是入接口的话,直接丢弃,如果不是入接口的话,在对应接口上进行转发。
  4. 如果是自己的MAC地址,拆包查看网络层的信息,如果目的IP地址是自己(或者是自己在的组播地址和广播报文),继续拆包查看传输层信息,其余情况,丢弃报文。
  5. 继续查看端口号,如果是自己开启的端口,转发到相应应用层进行处理,如果端口没开启,丢弃报文。

路由器对应用层数据的处理:
在这里插入图片描述

  1. 路由器在广播环境中,接口是以太网口,对收到的帧按照以太网网帧的格式进行读取(如果在PPP环境中更简单,直接拆封装,查看上层的信息)。

  2. 查看目的MAC地址,不是自己直接丢弃,是自己拆包,查看类型字段,知道上层为ipv4报文,会按照ipv4报文的格式读取。

  3. 查看目的IP地址,是自己的IP地址(包括所在组播和所在广播)继续拆包,查看目的端口号,对应端口打开就交给相应的应用层处理,如果没有打开就丢弃报文。

  4. 如果查看的IP地址不是自己的IP,如果就会查看路由表,如果整张路由表中没有与之可以匹配的条目,丢弃报文,如果路由表里有对应的条目,进行相应的转发。
    在这里插入图片描述

  5. 转发按照最长掩码匹配原则进行转发,路由转发的时候会首先将整个路由表查看完,可能有多个匹配的条目,子网掩码不同(子网掩码和网络号相同就是同一个网络了)就会按照最长掩码的条目进行路由的转发。

  6. 转发的过程,这里需要注意的是,最后匹配的条目要进行区分,分为直连,IGP路由条目,静态路由,BGP路由条目。

如果是直连路由条目(条目只有出接口,下一跳地址用自己的出接口IP地址代替)如果有对应的arp缓存,直接封装重出接口发送出去,如果没有arp缓存,从出接口直接请求对方的MAC地址,注意:如果在同一网段的路由器开启了arp代理,发现目的地与自己直连并且是arp报文接收的接口,不会进行代理,只会对自己路由条目里有的目的地址并且网段/不是接收arp接口网段的信息进行代理。当请求到了MAC地址继续进行封装并发送出来。

IGP路由条目:IGP路由条目一定有出接口和下一跳,并且下一跳为直连的对端接口的IP地址。如果匹配到的是IGP路由条目(表示不是直连的,直连的肯定没有直连路由优先,不会加表)先查看下一跳的MAC地址有没有,如果没有则从对应接口发arp请求下一跳的MAC地址,如果有,直接从对应的出接口发送出去。IGP和直连路由都都不需要迭代查询

静态路由:静态路由可能会进行迭代查询,静态路由可以只配置下一跳,会通过下一跳迭代直到查询到一条IGP,或者直连的路由条目,找到报文的出接口,进行ARP请求的时候,如果迭代的是直连的路由,请求上一个迭代时MAC地址,如果迭代最后的是IGP条目,请求IGP条目的下一跳。如果只配置了出接口,下一跳的地址默认为自己出接口的地址,进行ARP请求的时候,直接请求对方的MAC地址。如果既配置了IP地址,也配置了出接口,只要出接口是up状态,不会进行迭代查询,符合要求直接加表,所以可能不通,不会管下一跳可不可达。

BGP路由条目:BGP路由条目只有下一跳,没有出接口。当通过BGP路由条目发送信息的时候,会同样迭代查询到一条IGP或者直连的路由,确定出接口。如果没有MAC地址,封装的下一跳的MAC地址的方式和静态路由迭代方式迭代出的下一跳相同。

迭代的目的:找到出接口,IGP和直连路由因为有了出接口,所以不用迭代,BGP和没有配置出接口的静态路由需要进行迭代,直到迭代出IGP或者直连条目,找到出接口为止。

构建路由表的时候:首先比较网络位和子网掩码是否一样,不一样都加入路由表。如果一样的话比较AD值,越小越优,直连为0,我们可以去设置AD值,但是不能设置为0。如果AD值相同,则进行cost值的比较,静态和直连路由没有cost,只有动态路由协议才有cost值,并且一般不为0,如果cost值相同就负载均衡。

实例分析通信的过程:PC1telnetPC2
在这里插入图片描述

  1. telnet是基于TCP的,需要进行三次握手连接的建立。首先生成三次握手中第一次的TCP报文然后封装源和目的的IP地址,这个时候会查看路由表(主机的路由表分为无线和有线的路由表,如果同时启动的话,没有重复的条目都可以同时使用,但默认路由自能存在在一个表项中,如果使用其中的默认路由不能到达对方,就需要将这个网卡断开,将默认路由转移到另外一个表项中),这里查路由表示为了查看从哪个接口发送出去,封装对应的MAC地址作为源MAC地址,并根据路由表的指示封装目的MAC地址。
  2. 本拓扑中封装了PC1的E0/0/1接口的MAC地址以后,就会去封装目的MAC地址,这里有几种可能,在有对方MAC地址的情况下,直接封装发出,如果没有对方的MAC地址并且PC2与PC1在同一网段,匹配直连路由,发送arp请求报文,查路由表匹配到了直连的路由,直接从相应接口直接请求PC的MAC地址,在本拓扑中不是这种情况。如果对方不和自己在同一网段,而且PC配置了网关,相当于匹配到了默认路由,直接发arp请求网关的MAC地址,如果没有配置网关,会直接请求对方的MAC地址,这个时候只能在路由器开启中继才能保证通信成功。
  3. 以填了网关为例子,我们通过arp获得的对方的网关的MAC地址,这时候从接口发送出去到达交换机,交换机(默认只有vlan1)先会打上相应的tag,然后进行地址学习的功能,再查看MAC地址表,因为之前的arp请求的时候,在e0/0/2接口上已经学习到了路由器g0/0/0的MAC地址表项,所以这里直接从交换机的e0/0/2接口转发出去,如果没有表项,会进行除了接收端口的一个泛洪。
  4. 这时R1接口收到以后,首先会进行MAC地址的比较,发现就是自己的MAC地址,然后会根据类型字段发现上层是一个ipv4报文,这个时候会以ipv4的方式进行上层报文的读取,这时会发现目的IP地址不是自己,会进行转发。转发时首先会查看IP路由表,在路由表中匹配到了直连的路由条目,找到出接口,封装自己出接口的MAC地址为源MAC地址,对应目的MAC,如果有对方的MAC地址,网络层和以上的数据不变,封装好MAC地址后发送出去,如果没有对方的MAC地址,因为匹配的是直连的路由条目,发ARP报文直接请求对目的IP的MAC地址,从条目的出接口发送出去。
  5. 报文得到对应MAC地址后从对应的出接发送出去后,到达PC2,PC2首先会对报文中的目的MAC地址和自己的接收节点的MAC地址作比较,发现相同,解封装到网络层,发现目的IP地址就是自己,通过协议字段继续通过TCP的读取格式读取TCP的协议类容,发现对方是一个三次握手的第一个报文,SYN为1。这时会返回一个确认的报文,首先将TCP报文封装在IP报文里面,然后查看路由表确定源目MAC地址,目的MAC,没有网关的MAC地址会进行请求,然后从相应接口发送出去,后面的过程没有什么变化。

本文章参考了很多资料,也有很多个人理解,存在错误的地方,欢迎指正,多多包涵!!!