网络层,说简单点,就是在复杂的网络环境中确定一个合适的路径。
我们来了解一下网络层中一个重要的协议–IP协议。
IP协议
1、概念
IP协议是TCP/IP协议簇中的核心协议,也是TCP/IP的载体。所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输。
IP提供不可靠的,无连接的数据传送服务。
(1)不可靠指它不能保证IP数据报能成功到达目的地。
IP仅提供最好的传输服务。当发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息给信源。任何要求的可靠性必须由上层来提供。
(2)无连接指IP并不维护任何关于后续数据报的状态信息。
每个数据报的处理是相互独立的。IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B)每个数据报都是独立的进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
2、简介
上图中:
主机:是配有IP地址, 但是不进行路由控制的设备;
路由器: 即配有IP地址, 又能进行路由控制;
节点: 主机和路由器的统称;
3、协议头格式
解析:
字段 | 解释 |
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位生存时间(Time To Live, TTL) | 数据报到达目的地的最大报文跳数 |
8位协议 | 表示上层协议的类型 |
16位头部校验和 | 使用CRC进行校验, 来鉴别头部是否损坏 |
32位源地址和32位目标地址 | 表示发送端和接收端 |
选项字段 | 不定长, 最多40字节 |
4、网段划分
为什么要进行网段划分呢?
我们寻找某台主机时,在同一个网段的主机网络号都是相同的,我们可以根据网络号确定一个区域,再通过主机号寻找目的主机。因此,我们需要知道:
- IP地址分为两个部分, 网络号和主机号
- 网络号: 保证相互连接的两个网段具有不同的标识
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
- 不同的子网其实是把网络号相同的主机放到一起.
- 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。
- 主机号为1的一般都为路由器接口。
所以,通过合理设置网络号的主机号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。
但是,手动管理子网内的IP,是一个相当麻烦的事情。
因此出现了一种叫做DHCP的技术,能够自动给子网内新增主机节点分配IP地址,避免了手动管理IP的不方便。且一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器。
5、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 |
但是随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了,而A类却浪费了大量地址。
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)
子网划分
我们都知道,IP地址是以网络号和主机号标识网络上的主机的,只有在同一网络号下的主机才可以“直接”互通,不同网络号的主机要通过网关互通。
为了使同一个网络下有多个子网,就产生了子网掩码。
了解一下这个新概念:
子网掩码
- 区分网络号和主机号
- 是一个32位的正整数. 通常用一串 “0” 来结尾
- 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
那么如何确定子网掩码呢?
将一个网络划分为多个子网,网络号就要占用原来的主机位。
例如:
C类地址,21位标识网络号,8位标识主机号,要将其划分为4个子网,则需占用2位原来的主机标识位。
此时,网络号由之前的21位变为23位,子网掩码为:255.255.255.224
如下图:
特殊的IP地址
- 将IP地址中的主机地址全部设为0, 就是网络号, 代表这个局域网
- 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
那么IP地址的数量没有限制吗?
我们知道,IP(IPV4)地址是一个四字节32位的正整数,那么一共只有2的32次方个IP地址,大概是43亿左右,而 TCP/IP协议规定, 每个主机都需要有一个IP地址,
那也就是说网络中最多只可以接入43亿主机吗?
实际上,由于一些特殊的IP地址的存在,数量就不足43亿了。另外,IP地址并非是按照主机台数配置的,而是每个网卡都需要配置一个或多个IP地址。
上文讲的子网划分,在一定程度上缓解了IP地址不够用的问题,提高了利用率,减少了浪费,但IP地址的绝对上限并没有增加,仍然不够用,会有三种方式来解决IP地址不够用的问题:
1. 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中得到的IP地址不一定是相同的
2. NAT技术
3. IPv6: IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及。
注意:IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议
私有IP地址和公网IP地址
1、私有IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,对与组建局域网的私有IP地址有如下规则:
(1)10.*,前8位是网络号,共16,777,216个地址
(2)172.16. 到 172.31.,前12位是网络号,共1,048,576个地址
(3)192.168.*,前16位是网络号,共65,536个地址
2、公网IP
如1中,包含在范围中的, 都成为私有IP, 其余的就称为全局IP(或公网IP)。
观察下图:
可以知道:
(1)一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
(2)路由器LAN口连接的主机,都从属于当前这个路由器的子网中.
(3)不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1)
(4)子网内的主机IP地址不能重复,但是子网之间的IP地址可以重复,所以,不同子网中的两个主机不可以进行访问。
(5)子网中的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换,替换成WAN口IP,逐级替换,最终数据包中的IP地址成为一个公网IP,这种技术被称为NAT(Network Address Translation,网络地址转换)。
路由
路由,简单来说,就是在复杂的网络结构中, 一跳一跳找出一条通往终点的路线。
所谓 “一跳” 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。
IP数据包的传输过程
(1)当IP数据包, 到达路由器时, 路由器会先查看目的IP;
(2)路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
(3)依次反复, 一直到达目标IP地址;
那么如何知道当前这个数据包该发送到哪里呢?
这就依靠每个节点内部维护一个路由表,如果目的IP命中了路由表,就直接转发。
我们可以用命令route 查看路由表:
观察上图:
我的主机有一个网络接口,连到192.168.1.0/24网络;
注意:路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址
分析一下上图各字段的含义:
字段 | 含义 |
Destination | 目的网络地址 |
Genmask | ⼦⽹掩码 |
Gateway | 下⼀一跳地址 |
Iface | 发送接⼝ |
Flags | U标志表示此条目有效(可以禁⽤某些条⽬),G标志表示此条目的下⼀跳地址是某路由器的地址,没有G标志表示目的网络地址是与本机接⼝直接相连的网络,不必经路由器转发 |
路由转发过程:
(1)拿到将要发送数据包的目的地址
(2)先和第一行的子网掩码进行与运算,与第一行的目的网络地址不符,再和下一行的子网掩码做与运算,若匹配,因为是直接相连的网络,直接发到目的主机,不需要经路由器转发
(3)若直到最后一行之前,发现都不匹配,按缺省路由条目,从eth0接口将该IP地址发给路由器,该路由器的路由表决定下一跳的地址。