目录
引言
IP协议
协议头格式
16位标识与3位标志与13位片偏移讲解
网段划分(重要)
DHCP技术
CIDR技术
特殊的IP地址
广播主机
IP地址的数量限制
私有IP地址和公网IP地址
路由:在复杂的网络结构中, 找出一条通往终点的路线
简单认识路由器
路由表生成算法
引言
前面介绍了应用层协议--http
传输层协议--tcp、udp
现在学习网络层--ip
后续最后一篇文章,关于数据链路层协议的介绍。
网络层:在复杂的网络环境中确定一个合适的路径。
IP协议
基本概念
主机
:
配有
IP
地址
,
但是不进行路由控制的设备
;
路由器
:
即配有
IP
地址
,
又能进行路由控制
;
节点
: 主机和路由器的统称
;
协议头格式
4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.
4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示:
最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
16位总长度(total length): IP数据报整体占多少个字节(单位一字节).
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字节): 略
16位标识与3位标志与13位片偏移讲解
由于IP的总长度是有上限的,因此传输下来的TCP报文可能会被分片。
就是中间这一栏,进行分片控制。
每个分片都要分到报头
后续片偏移的计算不能加上固定报头,只能算第一个报文的偏移时加上报头(因为我们的视角是一个完整的IP报文,只不过被分割)
实际上片偏移是偏移量 / 8
其实不建议分片--可能增加丢包概率
网段划分(重要)
IP
地址分为两个部分
,
网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
不同的子网其实就是把网络号相同的主机放到一起.
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.
那么问题来了
,
手动管理子网内的
IP,
是一个相当麻烦的事情
.
有一种技术叫做DHCP, 能够
自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.
DHCP技术
DHCP(动态主机配置协议)是一种网络协议,用于自动分配和配置网络设备的IP地址和其他网络参数。以下是关于DHCP技术的一些主要特点和信息:
1. **基本功能**:DHCP允许网络设备在加入网络时自动获取IP地址、子网掩码、默认网关和DNS服务器地址等配置信息,从而简化了网络配置过程。
2. **工作原理**:DHCP基于客户端-服务器模型。客户端(如计算机或手机)向网络中的DHCP服务器发送请求,服务器则根据预定的策略和地址池为客户端分配IP地址和其他配置信息。
3. **地址分配策略**:DHCP提供三种IP地址分配策略:
- 手工分配:管理员为特定设备静态绑定固定的IP地址。
- 自动分配:服务器为客户端分配无限租期的IP地址。
- 动态分配:服务器为客户端分配具有租期的IP地址,租期到期后可重新分配。
4. **资源节约与自动维护**:DHCP通过自动分配和释放IP地址,有效地管理和利用IP资源。这种自动维护机制确保了IP地址的合理使用,减少了地址浪费。
5. **应用场景**:DHCP广泛应用于企业、学校、家庭等网络环境中,特别是在大型网络中,它可以快速为新设备提供网络设置,降低了网络管理的复杂性和成本。
综上所述,DHCP技术通过自动化网络配置过程,提高了网络管理的效率和便捷性,同时通过有效的IP资源管理,实现了网络资源的节约和优化。
过去曾经提出一种划分网络号和主机号的方案
,
把所有
IP
地址分为五类
,
如下图所示
(
该图出 自
[TCPIP])
。
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
类却浪费了大量地址。
例如, 申请了一个B类地址,
理论上一个子网内能允许6万5千多个主机(同一ip网络号). A类地址的子网内的主机数更多.然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了。
针对这种情况提出了新的划分方案
,
称为
CIDR(Classless Interdomain Routing)。
CIDR技术
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个
32位的正整数. 通常用一串 "0" 来结尾;
将IP地址和子网掩码进行
"按位与" 操作, 得到的结果就是网络号(注意,将 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
通过CIDR,可以进一步对网络地址中的主机号进行细分,对网络号进行细分。
特殊的IP地址
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
将IP地址中的
主机地址全部设为1, 就成为了
广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
广播主机
广播主机是指在网络上能够发送广播消息的主机。在计算机网络中,广播是一种通信方式,其中一个主机可以向网络上的所有其他主机发送信息,而不需要知道它们的单个地址。以下是关于广播主机的几个关键点:
### 广播地址
- **广播地址**
是一个特殊的IP地址,当数据包被发送到这个地址时,网络上的所有主机都会接收这个数据包。
- 在IPv4中,广播地址通常是网络地址的最高位加上全1的主机部分。例如,如果网络地址是192.168.1.0,子网掩码是255.255.255.0,那么广播地址就是192.168.1.255。
### 广播的类型
- **直接广播**:发送到特定网络的广播地址,例如上述的192.168.1.255,只有192.168.1.0网络上的主机能够接收到。
- **有限广播**:使用IP地址255.255.255.255进行的广播,通常用于本地网络,不会被路由器转发。
- **定向广播**:在某些情况下,可以对子网进行定向广播,这需要更复杂的子网划分。
### 广播主机的作用
- **网络发现**:广播可以用来发现网络上的其他主机,例如使用ARP(地址解析协议)来查找某个IP地址对应的MAC地址。
- **服务公告**:服务可以宣布它们的存在,例如DHCP服务器通过广播来提供IP地址配置信息。
- **网络管理**:网络管理员可以使用广播来发送网络管理命令,如重启或关闭网络上的所有主机。
### 广播的限制
- **广播风暴**:广播可能会导致网络拥塞,因为每个主机都需要处理广播消息。
- **安全性问题**:由于广播消息可以被网络上的任何主机接收,因此可能会带来安全风险。
- **不支持广播的网络**:在许多现代网络技术中,如IPv6,广播被设计为不支持的,以避免广播风暴和相关问题。
由于这些限制,现代网络设计倾向于使用多播和单播通信,而不是广播。多播允许消息发送到一组特定的主机,而不是网络上的所有主机。
IP地址的数量限制
我们知道
, IP
地址
(IPv4)
是一个
4
字节
32
位的正整数
.
那么一共只有
2
的
32
次方 个
IP
地址
,
大概是
43
亿左右
.
而TCP/IP协议规定
,
每个主机都需要有一个
IP
地址
.
这意味着
,
一共只有
43
亿台主机能接入网络么
?
实际上
,
由于一些特殊的
IP
地址的存在
,
数量远不足
43
亿
;
另外
IP
地址并非是按照主机台数来配置的
, 而是每一个网卡都需要配置一个或多个
IP
地址
.
CIDR
在一定程度上缓解了
IP
地址不够用的问题
(
提高了利用率
,
减少了浪费
,
但是IP地址的绝对上限并没有增加
), 仍然不是很够用
.
这时候有三种方式来解决
动态分配IP地址: 只给接入网络的设备分配IP地址. 因此
同一个MAC地址的设备,
每次接入互联网中, 得到的IP地址不一定是相同的;
NAT技术(后面会重点介绍);
IPv6: IPv6并不是IPv4的简单升级版. 这是
互不相干的两个协议, 彼此并不兼容; IPv6用
16字节128位
来表示一个IP地址; 但是目前IPv6还没有普及;
私有IP地址和公网IP地址
如果一个组织内部组建局域网
,IP
地址只用于局域网内的通信
,而不直接连到Internet上
,
理论上 使用任意的
IP地址都可以
,
但是
RFC 1918
规定了用于组建局域网的私有
IP
地址
10.*,前8位是网络号,共16,777,216个地址
172.16.到
172.31.,前12位是网络号,共1,048,576个地址
192.168.*,前16位是网络号,共65,536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1).
子网内的主机IP地址不能重复. 但是子网之间的IP地址(核心需求是子网内的通信)就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的
子网中的一个节点. 这样的运营商路由器可能会有很多级,
最外层的运营商路由器,
WAN口IP就是一个公网IP了(指的是最外层的运行商的路由器哦).
子网内的主机需要和外网进行通信时,
路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样
逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果希望我们自己实现的服务器程序, 能够在公网上被访问到,
就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买。
路由:在复杂的网络结构中, 找出一条通往终点的路线
路由的过程
,
就是这样一跳一跳
(Hop by Hop) "
问路
"
的过程
.
所谓
"
一跳
"
就是数据链路层中的一个区间
.
具体在以太网中指从源
MAC
地址到目的
MAC
地址之间的帧传输区间。
IP
数据包的传输过程也和问路一样
.
当IP数据包, 到达路由器时, 路由器会
先查看目的IP;
路由器决定这个数据包是能
直接发送给目标主机, 还是需要发送给下一个路由器;
依次反复,
一直到达目标IP地址。
那么如何判定当前这个数据包该发送到哪里呢
?
这个就依靠每个节点内部维护一个路由表
;
路由表可以使用route命令查看
如果目的IP命中了路由表, 就直接转发即可;
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下
:
这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到
192.168.56.0/24网络;
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址
,Iface是发送接
口,Flags中的
U标志表示此条目有效(可以禁用某些 条目),
G标志表示此条目的下一跳地址是某个路由器的地址,没
有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符
再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址(这个只是网络号),因此从eth1接口发送出去;
由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机
,不需要经路由器转发
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
依次和路由表前几项进行对比, 发现都不匹配;
按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;
由192.168.10.1路由器根据它的路由表决定下一跳地址
注意:按位与之后,只能得到网络号,而主机号使用网络号最后为0的位去分别置1去标识。
在这个例子中,192.168.1.0
就是网络地址,它只包含网络号,不包含主机号。主机号是在网络地址基础上通过改变最后一个八位组(在这个例子中)来标识网络内的不同主机。
简单认识路由器
路由表生成算法
路由表可以由网络管理员手动维护
(
静态路由
),
也可以通过一些算法自动生成
(
动态路由
).
请同学们课后自己调研一些相关的生成算法
,
例如距离向量算法
, LS
算法
, Dijkstra
算法等
.