零、前言
本章主要讲解学习网络层的作用, 深入理解IP协议的基本原理
一、网络层
- 概念及介绍:
- 在网络体系中,每一层都是服务于对应的上下层的,网络层也是服务于上层的传输层和下层的数据链路层
- 网络层介于传输层和数据链路层之间,其主要作用是实现两个不同网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际互连等(注:负责不同的网络之间(基于数据包的IP地址)尽力转发数据包,不负责丢包重传和接收顺序)
- 网络层在数据从数据链路层向传输层进行数据传输的通信中,起到构建一个中间通信子网的作用。不同网络有不同的网络层协议和地址规范,不同网络有不同的设计规范,属于不同的组织来管理,必须通过授权,并由专门的协议来负责网络间的通信
- 如果只是同一局域网内的各个计算机之间的通信,单靠物理层和数据链路层就可以建立通信链路完成用户间的数据通信,但要扩大应用范围,连接不同的局域子网,就需要借助网络层处理各个网络子网的协议,从而进行计算机的网络互连,所以网络层在 TCP/IP 协议体系中叫网际互连层
- 网络层的主要作用:
- 屏蔽网络差异,提供透明传输
网络层就是为了解决不同网络有不同的规范要求的差异问题,寻找一个不同网络间都能共同遵守的网络通信规范,以便不同网络间能相互识别,并接受对方的网络请求。也就是一个中转站的作用,两个毫无交集的网络通过这个中转站来建立交集
- 为网络间通信提供路由选择
路由选择是根据一定的原则和路由选择算法在多个结点的通信子网中选择一条到达目的节点的最佳路径的过程。确定路由选择的策略称为路由算法。在无连接的数据包服务中,网络节点要为每个数据包做出路由选择,即选择到达目的节点的最佳路线,而在面向连接的虚电路服务中,存在一条专门的逻辑线路,在建立连接时就已经确定了路有路径,无需额外选择
- 拥塞控制
拥塞控制是为了避免网络传输路径中数据的传输延迟或死锁。数据链路层中的流量控制功能,是针对数据链路中点对点传输速率的控制,这里的拥塞控制是针对在网络层传输路径中的端到端传输效率的控制。主要采用预约缓冲区、许可证和分组丢弃等方式
理解路由选择
- 示图:
- 说明:
- 通常一个计算机网络就是一个管理边界,一般是属于一个特定的公司,有一个特定的管理者负责,所以在进行计算机网络互连时,要同时考虑两方面的问题:一是授权用户可以在不同网络间互访,共享双方的资源;另一方面又要保持各计算机网络管理原来的独立性
- 而不同用户之间进行通信,首先得知道彼此的地址,局域网内部的用户访问(物理层和数据链路层就可以构建一个局域网)是通过MAC地址进行,但不同网络之间进行访问需要网络层对应的一个网络地址来进行访问,每个网络都通过其网络地址即NSAP(网络服务访问点)来标识,网络中的每个节点都有一个NSAP。这个NSAP就是由对应网络所运行的网络层通信协议来定义的,在目前最常见的TCP/IP协议网络中,这个协议就是IP协议,对应的NSAP就是IP地址
- 在数据链路层中传输的是一个个以许多字节为单位的帧,在每个帧的帧头都有源节点的MAC地址和目的节点的MAC地址,局域网内部的寻址就是通过MAC地址进行的,而在网络层中传输的是数据报(Packet,也叫分组),一个数据报是一个数据帧经过网络层协议重封装后得到的,每个数据报的报头(IP头)都有源节点和目的节点的IP地址,网路间的寻址就是通过IP地址进行的
- 即网络通信只有两种情况:如果通信双方在同一个局域网内,可直接通过数据链路层进行相互通信,但因为主机其实也有网络层的路由功能,所以两台主机间进行网络通信时通常也是通过三层来进行的(IP协议则是IP地址寻址);如果通信双方在不同网络内,需要网络层中的网络地址进行寻址,即必须通过三层进行
二、IP协议
- 基本概念:
- 主机: 配有IP地址, 但是不进行路由控制的设备
- 路由器: 即配有IP地址, 又能进行路由控制
- 节点: 主机和路由器的统称
- 协议头格式:
- 说明:
- 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4
- 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节(表示范围20-60,注报头固定字段为20字节)
- 8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个(注:对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要)
- 16位总长度(total length): IP数据报整体占多少个字节(IP报文最大为64KB)
- 16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的
- 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记
- 13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)
- 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
- 8位协议: 表示上层协议的类型
- 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏
- 32位源地址和32位目标地址: 表示发送端和接收端
- 选项字段: 不定长, 最多40字节
- IP报头与有效载荷分离:
- 当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度获得IP报头的大小(基本报头字段+选项字段)
- 首部长度之后就是有效载荷,再读取16位总长度,获得整个报文的大小,减去报头大小就是有效载荷的大小了
- IP确定向上交付的协议层:
当IP从底层获取到一个报文后,提取8位协议从而知道应该将分离出来的有效载荷交付给上层的哪一个协议的
- 32位源IP地址和32位目的IP地址:
- IP报头当中的32位源IP地址和32位目的IP地址,分别代表的就是该报文的发送端和接收端对应的IP地址
- 数据在不同网络传输的过程中会通过很多的路由器(连接不同网段),路由器具有网络层,会提取IP报头当中的目的IP地址,通过与路由表进行IP对比从而选择下一跳的网段,也就实现数据路由转发
- 当接收端收到了发送端发来的数据后,接收端可能也想要给发送端发送数据(或者进行应答),因此发送端在发送数据时除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址,也就是发送端的IP地址
- 最大传输单元MTU:
- MAC帧作为数据链路层的协议,它会将IP传下来的数据封装成数据帧,然后发送到网络当中。但MAC帧携带的有效载荷的最大长度是有限制的,也就是说IP交给MAC帧的报文不能超过某个值,这个值就叫做最大传输单元(Maximum Transmission Unit,MTU),这个值的大小一般是1500字节
- 由于MAC帧无法发送大于1500字节的数据,因此IP层向下交付的数据的长度不能超过1500字节(IP的报头和有效载荷),如果超过了1500字节,那么就需要先在IP层对该数据进行分片,然后再将分片后的数据交给下层MAC帧进行发送
- 分片和组装:
- 如果发送数据时在IP层进行了分片,那么当这些分片数据到达对端主机的IP层后就需要先进行组装,然后再将组装好的数据交付给上层传输层
- 实际在网络通信过程中不分片才是常态,因为数据分片会存在一些潜在的问题,比如分片可能会增加丢包的概率
- 数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片,因为不同网络的MTU是不一样的
- 分片和组装原理:
- 对于分片后的多个报文,每一个报文的报头中的16位标识都是相同的,标识主机发送的同一个报文
- 同时在3位标志中的第三位“更多分片”字段中,最后一个分片报文设置为0以外(表示在这分片之后没有分片了),其余分片报文均设置为1(表示在这分片之后还有分片)
- 前面两个字段标识了同一报文、还有分片以及最后分片,为了避免分片的丢包,还需要13位片偏移字段进行校验是否丢了分片:该字段表示当前分片在原数据中的偏移位置,当前位置的偏移量+该分片的有效数据的长度=下一个分片的偏移量,而首个分片偏移为0,由此可以算出接下来的每一个分片的偏移位置,从而校验是否丢失了分片
注:实际偏移的字节数是这个值× 8 \times 8×8得到的,因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了
- 最大报文段长度MSS:
- 实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,因此TCP作为传输控制协议需要控制一次向下交付数据不能超过阈值MSS(Maximum Segment Size最大报文段长度)
- MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节,所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。之所以说是降低数据分片的可能性,是因为每个网络的链路层对应的MTU可能是不同的
三、网段划分
- 基本概念:
- IP地址分为两个部分, 网络号和主机号
- 网络号: 保证相互连接的两个网段具有不同的标识
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号
- 示图:
- 说明:
- 不同的子网其实就是把网络号相同的主机放到一起
- 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
- 通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同
- 手动管理子网内的IP, 而有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便
- 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器
- 划分网络号和主机号的方案:
- 五类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
- 注意:
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了, 而A类却浪费了大量地址,然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了,针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)
- 子网掩码
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾
将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
- 示图:
- 说明:
IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围
IP地址和子网掩码还有一种更简洁的表示方法:例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0
- 特殊的IP地址:
- 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
- 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1