网络层之IP协议详解

网络层,说简单点,就是在复杂的网络环境中确定一个合适的路径。
我们来了解一下网络层中一个重要的协议–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、网段划分

为什么要进行网段划分呢?
我们寻找某台主机时,在同一个网段的主机网络号都是相同的,我们可以根据网络号确定一个区域,再通过主机号寻找目的主机。因此,我们需要知道:

  1. IP地址分为两个部分, 网络号和主机号
  2. 网络号: 保证相互连接的两个网段具有不同的标识
  3. 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
  4. 不同的子网其实是把网络号相同的主机放到一起.
  5. 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。
  6. 主机号为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地址是以网络号和主机号标识网络上的主机的,只有在同一网络号下的主机才可以“直接”互通,不同网络号的主机要通过网关互通。

为了使同一个网络下有多个子网,就产生了子网掩码。

了解一下这个新概念:
子网掩码

  1. 区分网络号和主机号
  2. 是一个32位的正整数. 通常用一串 “0” 来结尾
  3. 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号
  4. 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关

那么如何确定子网掩码呢?

将一个网络划分为多个子网,网络号就要占用原来的主机位。
例如:
C类地址,21位标识网络号,8位标识主机号,要将其划分为4个子网,则需占用2位原来的主机标识位。
此时,网络号由之前的21位变为23位,子网掩码为:255.255.255.224
如下图:
这里写图片描述

特殊的IP地址

  1. 将IP地址中的主机地址全部设为0, 就是网络号, 代表这个局域网
  2. 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包
  3. 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地址发给路由器,该路由器的路由表决定下一跳的地址。

猜你喜欢

转载自blog.csdn.net/baidu_37964071/article/details/80467838