网络层
是OSI参考模型中的第三层,介于传输层和数据链路层之间
,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向运输层提供最基本的端到端的数据传送服务。
网络层的目的
:实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术
在计算机通信中,为了识别通信的对端,就必须有一个类似于地址的识别码进行识别。而在网络层中,ip就充当了地址的作用。
ip地址用于在 连接到网络中的所有主机中识别出进行通信的目标地址,因此,TCP/ip通信中的所有主机或者路由器必须设定自己的ip地址
TCP/ip协议在网络层的核心是ip协议,它是TCP/IP协议族中最主要的协议之一。
在TCP/IP协议族中,网络层协议包括IP协议
(网际协议),ICMP协议
(Internet互联网控制报文协议)以及IGMP协议
(Internet组管理协议)
ipv4和ipv6
。ipv6版本不向下兼容ipv40xf * 4 = 60字节
(固定的20个字节 + 40字节的选项)前三位,表示优先权,目前已经弃用
后面四位,表示最小延时(ssh)+ 最大吞吐量(ftp)+ 最高可用性 + 最小费用。他们之间是一个互斥的关系,如果都是0,则表示使用默认属性
最后一位,是一个保留位,必须置0
16位总长度:表示ip数据报整体的长度,单位是字节,他的最大报文长度时2^16次方,也就是65535个字节,但是由于受到MTU的影响,一般达不到最大字节。
16位标识:是一个标识,唯一标识主机发送的报文。
如果通信使用的是UDP协议,那么当数据长度大于MTU
的时候,就需要进行分片传输,这个时候在每一个分片中的16位标识
都是相同的,标识着他们是由哪一个数据组成的
当前分片不是最后分片的时候,第三位为 1
当前分片是最后分片的时候,第三位为 0
段基址 + 偏移量
我们发现,13个字节最大可以表示的数字是 2^13 = 8192,而实际中最大的长度是16个字节,也就是2 ^16 = 65536。
所以在计算片偏移的时候,需要在13位数值的基础上 * 8,也就是 片偏移 = 13位数值 * 8
,所求出来的数据的单位就是字节,也就是该分片的起始位置
TTL,表示跳数(一般是64),也就是该数据最多可以经过多少个路由器进行转发数据,每经过一个路由器,就进行TTL - 1操作,这是为了防止出现环形路径发生死循环的情况。
如果TTL变成0,并且还没有到达对端,那么转发设备就丢弃该报文
MTU:最大传输单元,可以使用ifconfig命令查看,单位是字节
有了MTU,网络层传递给数据链路层的数据,如果大于MTU字节时,就需要进行分片传输
而数据在封装的过程中,网络层数据来源于传输层,而传输层有两个协议TCP和UDP
因为TCP协议在三次握手期间就有一个任务,就是互相协商,确定一个MSS(最大报文长度)
MTU = MSS + ip头部 + TCP头部
所以说,TCP协议是按照MSS去给网络层提交数据,但是MSS的大小一定小于MTU的,所以TCP协议下通信的数据在网络层是不需要分片传输的
UDP协议是面向数据报,一般是整条数据发送,并且整条数据进行接收,所以是很有可能会超过MTU的大小的。
而当UDP协议一次发送的报文超过了MTU字节
的大小时,就需要在网络层进行分片传输。
最后,由于UDP协议是不可靠
的,而网络层的ip协议也是不可靠的
,所以如果在分片传输的过程中丢失了一部分的分片,那么整条UDP数据就会被全部丢失
对于ipv4的地址,他的类型是unint32_t,所表示的范围是0 ~ 2^32
ip地址 = 网络号 + 主机号
对于那么多的ip地址,他们又被分为5类,依次为A类,B类,C类,D类和E类
那么A类ip地址,可以表示的子网范围就是 0 ~ 127。也就是说,A类中可以分出来128个子网。
每一个A类子网,最多可以有2^24次方个ip地址,也就是16777216个(包括网络号 和 广播号)
2. B类:最高的2位固定为10,然后14位标识网络号,剩下的16位标识主机号
3. C类:最高的三位为 110,后面21位标识网络号,最后8位标识主机号
我们可以看出,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构成,利用子网掩码就可以区分最大主机号与网络号
在42亿的ipv4的ip地址中,又被划分出来的3个段,在这3个段中的ip地址不具备访问互联网的功能,被称为私网。
与之对应的,可以访问互联网的其他ip地址,就是公网。
私网ip与私网ip之间是不影响通信的,也就是说私网中的机器之间可以互相通信,但是不能访问互联网
两个不同公司的私网之间想要进行通信,就得接住NAT,利用代理将自己的私网ip用一个公网ip代替,然候使用公网进行通信
当我们在发送数据的时候,这样几个东西总是必不可少的
默认路由
如果一张路由表中包含所有网络以及子网的信息,那么就会造成很大程度的浪费。
这个时候,就可以使用默认路由,他是指路由表中的任何一个地址都可以进行匹配的几率
主机路由
ip地址 / 32
,这就被称为主机路由,就像 192.168.1.1/32
他的意思是整个ip地址的所有位都将参与路由。进行主机路由,意味着要基于主机上网卡设备的ip地址本身,而不是基于该地址的网络地址进行路由
一般用于不希望通过网络地址路由的情况
环回地址
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。
一般使用一个特殊的ip地址作为环回地址,127.0.0.1
目的ip的作用:
子网掩码
进行按位与
操作如果结果是该子网的网络号,那么就直接把数据发送给当前子网中的机器;
如果不是该子网的网络号,表示这个数据不在这个路由器的子网中