网络层---ip协议与路由选择

网络层

网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向运输层提供最基本的端到端的数据传送服务。

网络层的目的:实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术

ip协议

在计算机通信中,为了识别通信的对端,就必须有一个类似于地址的识别码进行识别。而在网络层中,ip就充当了地址的作用。

ip地址用于在 连接到网络中的所有主机中识别出进行通信的目标地址,因此,TCP/ip通信中的所有主机或者路由器必须设定自己的ip地址

在这里插入图片描述
TCP/ip协议在网络层的核心是ip协议,它是TCP/IP协议族中最主要的协议之一。

在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议)以及IGMP协议(Internet组管理协议)

ip协议报头格式

在这里插入图片描述

  • 4位版本:描述ip协议的版本。对于ip协议,他一共有两个版本,也就是ipv4和ipv6。ipv6版本不向下兼容ipv4
  • 4位首部长度:表示ip协议的头部长度。4个字节中所表示的数字 * 4,才是ip协议头部的长度,最长为0xf * 4 = 60字节(固定的20个字节 + 40字节的选项)
  • 8位服务类型:

前三位,表示优先权,目前已经弃用

后面四位,表示最小延时(ssh)+ 最大吞吐量(ftp)+ 最高可用性 + 最小费用。他们之间是一个互斥的关系,如果都是0,则表示使用默认属性

最后一位,是一个保留位,必须置0

  • 16位总长度:表示ip数据报整体的长度,单位是字节,他的最大报文长度时2^16次方,也就是65535个字节,但是由于受到MTU的影响,一般达不到最大字节。

  • 16位标识:是一个标识,唯一标识主机发送的报文。

如果通信使用的是UDP协议,那么当数据长度大于MTU的时候,就需要进行分片传输,这个时候在每一个分片中的16位标识都是相同的,标识着他们是由哪一个数据组成的

  • 3位标志:分别是 保留位,禁止分片,标识更多分片

当前分片不是最后分片的时候,第三位为 1
当前分片是最后分片的时候,第三位为 0

  • 13位片偏移:标识着分片在UDP报文中的位置。等同于汇编中的段基址 + 偏移量

在这里插入图片描述
我们发现,13个字节最大可以表示的数字是 2^13 = 8192,而实际中最大的长度是16个字节,也就是2 ^16 = 65536。

所以在计算片偏移的时候,需要在13位数值的基础上 * 8,也就是 片偏移 = 13位数值 * 8,所求出来的数据的单位就是字节,也就是该分片的起始位置

  • 8位生存周期:数据在传输到达目的地之前,所允许经过的路由器的个数;

TTL,表示跳数(一般是64),也就是该数据最多可以经过多少个路由器进行转发数据,每经过一个路由器,就进行TTL - 1操作,这是为了防止出现环形路径发生死循环的情况。

如果TTL变成0,并且还没有到达对端,那么转发设备就丢弃该报文
在这里插入图片描述

  • 8位协议:标识传输层中使用什么协议,当对方在进行分用的时候,就可以知道对方使用的协议,然后将数据提交给对应的传输层协议进行下一步分用
  • 16位首部校验和:判断ip头部在传输的过程中是否发生损坏
  • 32位源ip地址 和 32位目的ip地址:表示这条数据从哪来,到哪去。在转发的过程中不会发生改变(NAT模式除过)

MTU

MTU:最大传输单元,可以使用ifconfig命令查看,单位是字节
在这里插入图片描述
有了MTU,网络层传递给数据链路层的数据,如果大于MTU字节时,就需要进行分片传输

而数据在封装的过程中,网络层数据来源于传输层,而传输层有两个协议TCP和UDP

  1. TCP协议

因为TCP协议在三次握手期间就有一个任务,就是互相协商,确定一个MSS(最大报文长度)

MTU = MSS + ip头部 + TCP头部

所以说,TCP协议是按照MSS去给网络层提交数据,但是MSS的大小一定小于MTU的,所以TCP协议下通信的数据在网络层是不需要分片传输的

  1. UDP协议

UDP协议是面向数据报,一般是整条数据发送,并且整条数据进行接收,所以是很有可能会超过MTU的大小的。

而当UDP协议一次发送的报文超过了MTU字节的大小时,就需要在网络层进行分片传输。

最后,由于UDP协议是不可靠的,而网络层的ip协议也是不可靠的,所以如果在分片传输的过程中丢失了一部分的分片,那么整条UDP数据就会被全部丢失

ip地址

对于ipv4的地址,他的类型是unint32_t,所表示的范围是0 ~ 2^32

ip地址 = 网络号 + 主机号

  • 网路号:标识一个子网络,也就是很多ip地址
  • 主机号:在子网当中唯一标识一台主机

对于那么多的ip地址,他们又被分为5类,依次为A类,B类,C类,D类和E类

  1. A类:最高的1位为0,后面7位为网络号,剩下的24位为主机号

在这里插入图片描述
那么A类ip地址,可以表示的子网范围就是 0 ~ 127。也就是说,A类中可以分出来128个子网。

每一个A类子网,最多可以有2^24次方个ip地址,也就是16777216个(包括网络号 和 广播号)
在这里插入图片描述
2. B类:最高的2位固定为10,然后14位标识网络号,剩下的16位标识主机号

在这里插入图片描述
3. C类:最高的三位为 110,后面21位标识网络号,最后8位标识主机号

在这里插入图片描述

  1. D类:高四位为 1110 ,剩下28位为多播组号

在这里插入图片描述

  1. E类:高五位固定为 11110,剩下27位留用

在这里插入图片描述

我们可以看出,ip地址虽然有所划分,但是所有的ip地址都是相连的,A类的最大ip地址 + 1 = B类的最小ip地址

同时,C类ip地址拥有着最少的主机号 2^8 ,也就是 256个ip地址。
而如果有人只想要10个ip地址,总不能直接把C类的ip地址都给这个人吧,那样很容易造成ip地址的浪费。这个时候就有了子网掩码

子网掩码

针对上面这种情况,引入了一个新的解决方法,叫做CIDR(Classless Interdomain Routing)

他的作用是为了更精确的划分子网,已经精确分配ip地址,从而避免ip地址浪费的问题

使用了一个子网掩码,这其实是一个 uint32_t类型的整数,由一段连续的二进制1构成,利用子网掩码就可以区分最大主机号与网络号

  • 最大主机号:子网掩码取反
  • 网络号:子网掩码 & ip地址

在这里插入图片描述
就拿我自己的这个子网掩码来演示一下
在这里插入图片描述

  • 主机号全为0的ip地址是网络号
  • 主机号全为1的ip地址是广播号

私网与公网

在42亿的ipv4的ip地址中,又被划分出来的3个段,在这3个段中的ip地址不具备访问互联网的功能,被称为私网。

与之对应的,可以访问互联网的其他ip地址,就是公网。

在这里插入图片描述
私网ip的划分:

  1. 10.0.0.0 ~ 10.255.255.255
  2. 172.16.0.0 ~ 172.31.255.255
  3. 192.168.0.0 ~ 192.168.255.255

在这里插入图片描述
私网ip与私网ip之间是不影响通信的,也就是说私网中的机器之间可以互相通信,但是不能访问互联网
在这里插入图片描述
两个不同公司的私网之间想要进行通信,就得接住NAT,利用代理将自己的私网ip用一个公网ip代替,然候使用公网进行通信

路由选择

当我们在发送数据的时候,这样几个东西总是必不可少的

  1. 源ip,标识数据从哪来
  2. 源端口
  3. 目的ip,标识数据要到哪里去
  4. 目的端口
  5. protocol,数据传输中所使用的协议

在这里插入图片描述
使用route命令,可以在Linux下查看路由表的信息
在这里插入图片描述

  • U表示该路由条目有效
  • G表示该路由条目为网关

默认路由

如果一张路由表中包含所有网络以及子网的信息,那么就会造成很大程度的浪费。

这个时候,就可以使用默认路由,他是指路由表中的任何一个地址都可以进行匹配的机率

主机路由

ip地址 / 32,这就被称为主机路由,就像 192.168.1.1/32

他的意思是整个ip地址的所有位都将参与路由。进行主机路由,意味着要基于主机上网卡设备的ip地址本身,而不是基于该地址的网络地址进行路由

一般用于不希望通过网络地址路由的情况

环回地址

环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。

一般使用一个特殊的ip地址作为环回地址,127.0.0.1
在这里插入图片描述
目的ip的作用:

  1. 在路由选择中,数据每到一个路由器中,就用目的ip地址和路由表中的子网掩码进行按位与操作

如果结果是该子网的网络号,那么就直接把数据发送给当前子网中的机器;
如果不是该子网的网络号,表示这个数据不在这个路由器的子网中

  1. 如果除了默认网关之外的其他路由条目都没有匹配上,那么这个数据就走默认网关,直接传递给上级路由器
  2. 在每一个路由器中进行比对的时候,每比对一次,TTL-1,直到TTL耗尽就被丢弃了,或者是数据到达了目标位置,传输成功。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章