网络层中一个重要的协议:IP协议
IP协议
作用:有能力将数据从A主机送往B主机。
理解三个基本概念:
主机:配有IP地址,但是不进行路由控制设备。
路由器:配有IP地址,又能进行路由控制。
节点:主机和路由器的统称。
IP协议格式
字段 | 解释 |
---|---|
4位版本号 | 指定IP协议的版本,若是IPV4,该字段为4. |
4位首部长度 | 单位为4字节,TCP首部长度不包括选项,是20个字节(20/4=5),即0101。选项最大字节长度为40,(60/4=15),即1111。 |
8位服务类型 | 3位优先权字段,4位TOS字段,1位保留字段(置为0)。4位TOS(最小延时、最大吞吐量、最高可靠性、最小成本),只能选其一。ssh/telnet选最小延时,ftp选最大吞吐量。 |
16位总长度 | IP数据报整体占多少个字节。 |
16位标识 | 区分是否分片,若IP报文在数据链路层被分片了,那么每一个片里面的标识是相同的。 |
3位标识 | 第一位保留,第二位表示是否分片(1表示禁止分片,如果报文长度大于MTU,IP模块就会丢弃报文)。第三位表示分片结束标记(最后一个分片置1,其他为0)。 |
13片偏移 | 是分片相对于原始IP报文开始处的偏移,为了分片后的拼接。 |
8位生存时间(TTL) | 数据到达目的地的最大报文跳数,一般为64.每经过一个路由器,TTL减一,直到为0还未到达,就丢弃。主要为了防止路由循环。 |
8位协议 | 表示上层协议的类型 |
16位首部校验和 | 使用CRC校验,鉴别头部是否损坏。 |
32位源地址和32位目标地址 | 表示发送端和接收端 |
选项字段 | 不定长。 |
网段划分
网络中两台主机进行通信,有IP地址应该可以找到对应的主机,那么,为什么会有网段划分呢?
我们举个例子,在学校找一位同学,如果直接找,会很不容易,但是如果先找到这个同学所在的学院,然后在找这位同学就相对来说比较方便了。
同理,网络号确认一个区域,在两个区域中找到目的主机,使得在网络中查找更加高效。
IP地址分为两个部分,网络号和主机号。
* 网络号:保证相互连接的两个网段具有不同的标识。
* 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
* 不同的子网就是把网络号相同的主机放在一起。
* 如果在子网中增加一台主机,这台主机的网络号和这个子网的网络号一致,但是主机号和该子网中的其他主机重复。
* 主机号为1的一般都为路由器接口。
所以,合理设置网络号的主机号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。但是,程序员手动管理子网的IP,是一个相当麻烦的事情。出现一种DHCP技术,能够自动给子网内新增主机节点分配IP地址,避免了手动管理IP的不方便。
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 |
子网划分
IP地址是以网络号和主机号标识网络上的主机的,只有在同一网络号下的主机才可以“直接”互通,不同网络号的主机要通过网关互通。同一个网络下也可以分为多个子网。就产生了子网掩码,子网掩码的作用就是用来判断任意两个IP地址是否同属于同一子网,只有在同一子网才能“直接”互通。
子网掩码
* 用来区分网络号和主机号
* 是一个32位的正整数,通常用一串"0"结尾
* 将IP地址和子网掩码进行按位与操作,得到的就是网络号
* 网络号和主机号的划分与地址类型无关。
那么如何确定子网掩码呢?
将一个网络划分为多个子网,网络号将要占用原来的主机位。例:C类地址,21位标识网络号,8位标识主机号,要将其划分为8个子网,则需占用3位原来的主机标识位。此时,网络号由之前的21位变为24位,子网掩码为:255.255.255.224/27
特殊的IP地址
* IP地址全0,成为了网络号,代表这个局域网。
* IP地址全1,成为了广播地址,用于给同一链路中相互连接的所有主机发送数据包。
* 127.*用于本地还回测试,通常是127.0.0.1
IP地址其实是有数量限制的,我们只有那几位地址,最多只有2^32个IP地址,大概是43亿左右。那么网络中可以接入43亿台主机吗?
实际上,由于一些特殊的IP地址的存在,比如说路由器,也占用IP,数量就不足43亿。另外,IP地址并非是按照主机台数配置的,而是每个网卡都需要配置一个或多个IP地址。
子网划分在一定程度上缓解了IP地址不够用的问题,提高了利用率,减少了浪费,但IP地址对的绝对上限并没有增加,仍然不是够用,会有三种方式来解决IP地址不够用的问题?
* 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备每次接入网络中得到的IP地址不一定是相同的。
* NAT技术
* IPV6:IPV6用16字节128位来表示一个IP地址。
私有IP地址和公网IP地址
(1)私有IP地址
子网中的IP为私有IP。
* 10.*,前8位是网络号,共2^24=16,777,216个地址。
* 172.16.到172.31.,前12位是网络号,共2^20=1,048,576个地址。
* 192.168.*,前16位是网络号,共2^16=65535个地址
(2)公网IP地址
除了私有IP地址,其余的都为公网IP。
通过上图,我们知道:
* 一个路由器可以配置两个IP地址,一个WAN口IP,一个LAN口IP(子网IP)。
* 不同的路由器,子网IP是相同的(通常为192.168.1.1)。
* 子网内的主机IP地址不能重复,因为一个子网中的主机可以相互访问。但是,子网之间的IP地址可以重复,所以,不同子网中的两个主机不可以进行访问。但是一个公网,一个子网可以进行访问。
* 子网中的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换,替换成WAN口IP,逐级替换,最终数据包中的IP地址成为一个公网IP,这种技术被称为NAT。
路由
路由其实字面意思,就是一跳一跳的“问路”的过程。
IP数据包的传输过程:
当IP数据包,到达路由器时,路由器先会查看目的IP,路由器决定这个数据包能直接发送给目标主机,还是需要发送给下一个路由器,依次反复,一直到达目标IP。
我们提到节点需要决定将数据包发送的下一个位置,那么是怎么知道的下一个位置是哪里?
因为每个节点都有一张路由表,如果IP命中了路由表,就直接转发。
Linux下查看路由表的命令:route
字段名称 | 代表含义 |
---|---|
Destination | 目的网络地址 |
Gateway | 下一跳地址 |
Gemask | 子网掩码 |
Flags | 标志,U表示此条目有效,有G表示此条目的下一跳地址是某个路由器的地址,没有G表示不需路由转发。 |
说明:路由表的最后一行,主要下一跳地址和发送接口两部分组成,当目的地址与路由表其他行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
路由转发过程:拿到 一个主机的IP地址,先和第一行的子网掩码进行与运算,与第一行的目的网络地址不符,再和下一行的子网掩码做与运算,直到最后一行的前一行,要是还未找到目的网络,就将该IP地址发给路由器,然后进行转发。