个人技术分享

一.与IP协议相关的基本概念

  • IP协议,即网际互连协议(Internet Protocol),是TCP/IP体系中的核心网络层协议。

网络层IP协议解决的问题

  • 数据传输的过程中,不是直接进行的传输,而是经过层层的封装和分用的过程才能到达对端. IP协议主要的功能就是地址管理(使用一套地址管理体系,描述设备在网络上的具体位置)和路由选择(数据包如何从网络中的一个地址传输到另一个地址).

二.IP协议的基本格式

IP协议的格式如图:
在这里插入图片描述

  • 4位版本号: 用来描述当前IP协议的版本(指的是IPv4和IPv6这两个版本)
  • 4位首部长度: 用来描述IP协议的IP报头.
  • 8位服务类型(TOS):3位优先权字段(已经弃用), 1位保留字段(必须置为0)和4位TOS字段. 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择⼀个.对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
  • 16位总长度:整个IP报文的总长度.但这并不意味着IP报文的长度就想UDP报文一样有长度限制,IP协议中提供了拆包和组包这样的功能,可以根据需求,将IP数据报分成若干个,这个拆包和组包的过程是在网络层完成的,传输层和数据链路层,并不会关心这个过程.
  • 16位标识:它的作用是将拆包后的各个子包的标识位相同,在组装的时候,该位相同的放到一起组装.如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
  • 3位标志: 该位用来描述是否进行了拆包.第⼀位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第⼆位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后⼀个分片置为1, 其他是0. 类似于⼀个结束标记.
  • 13位片偏移:描述这些子包的先后顺序.是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后⼀个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
  • 8位生存时间:这里存储的时间不是s/ms,而是一个整数,通常是32/64.一个IP数据报,每经过一个路由器转发TTL就-1,如果这个数据减到0,说明这个数据丢包了. 这个字段主要是用来防止出现路由循环
  • 8位协议:表示传输层使用的哪个协议.
  • 16位首部校验和:使用CRC进行校验, 来鉴别头部是否损坏.只用校验IP的首部,载荷中的TCP/UDP都自带校验.
  • 32位源地址和32位目标地址: 表示发送端和接收端.

三.地址管理

网段划分

IP地址分为两个部分:

  • 网络号:保证相互连接的两个网段具有不同的标识;
  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号

DHCP协议

现实中手动管理IP地址是一个非常麻烦的事情,当子网中新增主机时需要给其分配一个IP地址,当子网当中有主机断开网络时又需要将其IP地址进行回收,便于分配给后续新增的主机使用。因此对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术。DHCP通常被应用在大型的局域网环境中,其主要作用就是集中地址管理、分配IP地址,使网络环境中的主机动态获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。DHCP是一个基于UDP的应用层协议,⼀般的路由器都带有DHCP功能. 因此路由器也可以看做⼀个DHCP服务器.

子网划分

过去曾经提出⼀种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示。

在这里插入图片描述

  • A类 0.0.0.0到127.255.255.25
  • 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类却浪费了大量地址

  • 例如, 申请了⼀个B类地址, 理论上一个子网内能允许6万5千多个主机. 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.

四.路由选择.

IPv4地址的数量问题:

IPv4是一个32位的二进制整数,此时他能表示的范围就是0~2的32次方-1,大概也就是大约43亿个地址,但是在TCP/IP协议中,要求每一个设备都需要有一个IP地址.
所以43亿个IP地址其实早就不够用了,因此才提出了CIDR的方案对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费,根本原因就是IP地址本来就不够了,所以不能够再浪费了。
CIDR虽然在一定程度上缓解了IP地址不够用的问题,因为CIDR提高了IP地址的利用率,减少了浪费,但IP地址的绝对上限并没有增加。

IP地址数量问题的解决方法:

  • 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的,避免了IP地址强绑定于某一台设备。
  • NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
  • IPv6:IPv6用16字节128位来表示一个IP地址,能够大大缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级版,它们是互不相干的两个协议,彼此并不兼容,因此目前IPv6还没有普及。

NAT机制的解析

IP地址分为两大类:

  • 私网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/局域网中只要保证局域网内的IP不重复即可.

由于上述的设定,就会产生一个重要的限制.

  • 当公网设备访问公网设备,此时没有任何问题,可以直接访问.
  • 当在同一个局域网的范围内,此时局域网的设备访问局域网的设备也没有任何问题,可以直接访问.
  • 当在不同的局域网当中,此时局域网的设备访问局域网的设备,就会产生问题,不可以直接访问.
  • 当局域网设备访问公网设备,此时就需要对局域网的IP进行地址准换.
  • 当公网设备访问私网设备,理论上是不允许直接访问的.

访问的具体方式:

在这里插入图片描述

在这里插入图片描述

路由选择

简单来说就是在复杂的网络结构中, 找出⼀条通往终点的路线.路由的过程, 是一跳一跳(Hop by Hop) “问路” 的过程.所谓 “一跳” 就是数据链路层中的⼀个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.
在这里插入图片描述
IP数据包的传输过程也和问路⼀样.

  • 当IP数据包, 到达路由器时, 路由器会先查看目的IP.
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下⼀个路由器;
  • 依次反复, 一直到达目标IP地址;
  • 在这里插入图片描述
    那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护⼀个路由表;
    • 路由表可以使用route命令查看
    • 如果目的IP命中了路由表, 就直接转发即可;
    • 路由表中的最后一行,主要由下⼀跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。