Linux -- 网络层
网络层
我们在传输层中已经详细讲解了主机是如何在传输层进行收发报文,以及知道了UDP是一种不可靠的传输层协议,TCP通过确认应答机制,滑动窗口,流量控制,拥塞控制以及三次握手四次挥手等一些策略来保证可靠性和效率。但是这里我们只能知道是如何收发报文,并不知道报文在不同的主机是如何转发的,而网络层就是为了解决不同主机报文转发以及主机距离变远以后如何在网络环境中选择路径的问题的。
IP协议
基本概念
主机:配有IP地址,MAC地址,也要进行路由控制的设备。
路由器:既有IP地址,又能进行路由控制。
节点:主机和路由器的统称。
IP协议格式
IP数据报与传输层的数据报类似,也是以报头和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
四位版本号:表示通信双方使用的IP协议版本,双方的版本协议必须一致。目前主流的协议是IPV4。
四位首部长度:最小值是5,最大是15,基本单位是4,所以首部大小的固定部分为20个字节,如果有可选字段的话就会增加,最大值是60个字节。
八位区分服务: 3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置 为0). 4位TOS分别表⽰: 最⼩延时, 最⼤吞吐量, 最⾼可靠性, 最⼩成本. 这四者相互冲突, 只能选择 ⼀个. 对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最⼤吞吐量⽐较重要。
十六位总长度:首部和数据之和,数据报最大长度为65535字节。
十六位标识:用来标识数据报是否超过MTU而进行了分片。
三位标志:占 3 位。第一位未使用,其值为 0。第二位称为 DF(不分片),表示是否允许分片。取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三位称为 MF(更多分片),表示是否还有分片正在传输,设置为 0 时,表示没有更多分片需要发送,或数据报没有分片。
十三位片偏移:占 13 位。当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以 8 个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是 8 字节(64 位)的整数倍。当数据不是8字节的整数倍是会自动填充。
八位生存时间:表示数据报在网络中的寿命,占 8 位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。
八位协议号:表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。
十六位首部校验和:用于校验数据报的首部,占 16 位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。
三十二位源地址:表示数据报的源 IP 地址。
三十二位目的地址:表示数据报的目的 IP 地址。
填充字段:由于可选字段中的长度不是固定的,使用若干个 0 填充该字段,可以保证整个报头的长度是 32 位的整数倍。
数据部分:表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。
网段划分
IP地址分为两个部分网络号和主机号。
网络号:保证互相连接的两个网段具有不同的标识。
主机号:在同一网段中,主机之间具有相同的网络号,但是必须具有不同的主机号。
所以通过合理的设置就可以保证互相连接的网络中每个主机的IP地址都是不同的。
那么为什么要进行网段划分?直接给每一个主机设置一个唯一的IP也可以识别每一个不同的主机啊?我们需要知道IP地址只有2^32也就是42亿多个,如果一个主机想要将数据发送给另外一个主句那么就意味着需要线性遍历这42亿个IP地址才能够将数据准确发送,那效率也太低了。所以就产生了网段划分,这里我们可以以大学中每个人的学号来举例。
在大学中我们每个人的学号都是不同的,而每个学院都有自己的标识符,所以学号就可以由学院号+个人号组成。当我们需要根据学号找一个人的时候,我们首先将他的学院号和自己的对比就可以知道不是本学院的,只用一次就淘汰了其他相同学院的学号。然后我们继续用学院号进行比较就很快能找到他所在的学院,再根据他的个人号就可以找到这个人了。
网段划分的本质实际上是提高了淘汰的效率,能够通过网络号一次性淘汰同一子网下的其他主机,大大提高网络的传输速率。
过去曾经提出⼀种划分⽹络号和主机号的⽅案, 把所有IP 地址分为五类, 如下图所⽰
A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255
在网络中有一些特殊的IP地址:
IP地址中的主机地址全部设置为0,就成为了网络号,代表这个局域网。
IP地址中的主机地址全部设置为1,姐成为了广播地址,用于给同一链路中相互连接的所有主机发送数据包。
127.*的IP地址用于本机环回测试,通常是127.0.0.1
IP地址的数量限制
上面我们说到IP地址是一个32位的正整数,那么也就只有42亿多的主机能够入网,因为每一个主机都需要有IP地址。
虽然CIDR一定程度上缓解了IP浪费,但是还是远不够实际需要上网的设备数量,那么提出了以下三种方案:
动态分配IP地址:只给接入网络的设备分配IP地址,所以即使相同的MAC地址的设备,每次接入网络的IP地址也可能是不一样的。
NAT技术。
IPV6:IPV6用128个字节表示一个地址,但是IPV6协议并没有普及,普及难度较大。
私有IP地址以及公网IP地址的划分
RFC 1918规定了一部分IP地址用于组建局域网地私有IP地址
10.*,前8位是⽹络号,共16,777,216个地址
172.16.*到172.31.*,前12位是⽹络号,共1,048,576个地址
192.168.*,前16位是⽹络号,共65,536个地址
除了这个范围内的IP都是公有IP。一个公网可以组建局域网,而公网中局域网中的一个私有IP地址又可以组建局域网,如此反复操作,IP地址就可以达到理论上的很大数量足以支撑目前需要入网络的设备数量,其中所有局域网的设备只需要将数据层层向上传输最终通过公网将数据传输到互联网中即可实现所有设备的通信。
组建局域网的工作一般由运营商来完成,个人难以完成如此庞大且复杂的工作,其中包括挖光纤,组建不同子网等。
这是一个运营商下的公网IP组建的局域网的示例图:
一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP,子网IP。
路由器LAN口连接的主机,都从属于这个路由器的子网中。
不同路的由器,子网IP其实都是一样的,通常是192.168.1.1.子网内的IP地址不能重复,子网中不同主机的IP地址一般是由路由器通过DHCP自动完成分配的。
每一个家用的路由器作为运营商路由器子网中的一个节点,这样运营商的路由器就可以有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP。
⼦⽹内的主机需要和外⽹进⾏通信时, 路由器将IP⾸部中的IP地址进⾏替换(替换成WAN⼝IP), 这 样逐级替换, 最终数据包中的IP地址成为⼀个公⽹IP. 这种技术称为NAT(Network Address Translation,⽹络地址转换).
路由
路由就是在复杂的网络结构中找到一条通往终点的路线。
数据路由的过程不是一次性到达的,而是通过不同的路由器进行下一跳的许多这样的过程,所谓一跳是指在以太网中从源MAC地址到目的MAC地址之间的帧传输区间。
IP数据包的传输过程和问路一样,当数据包到达路由器时,路由器会查看目的IP,然后决定这个数据包是否在它的同一子网下,同一子网下就可以根据主机号直接发送给目标主机了,如果不是同一子网则需要发送给下一个路由器,重复这个过程,一直达到目标的IP地址。
其中每个节点中都会维护一个路由表,所以网络中的路都是设置好的!每个数据包在询问了节点以后都知道应该怎么去往下一个地点直到终点。
