目录
思考一个问题:路由器会天然的构建局域网(子网),那路由器应该有几个IP地址呢?
1. IP协议
概念:IP层帮我们解决的是,从A主机送到B主机的能力。
1.1 协议头格式
先解决两个问题,如何封装和解包?
报头的长度是固定的,而且有自描述字段(4位首部长度)。
有效载荷=16位总长度-首部长度*4
如何交付?
在报头中有8位协议,可以用来表示这个数据是根据TCP协议还是UDP协议来的。在接收端向上交付的时候也需要保持一致。
1.1.1 报头内容的详细理解
4位版本号:
指定IP协议的版本,对于IPv4来说,就是4.
4位头部长度:
和TCP中的4位头部长度作用完全一样。表示带上选项的报头长度。可以表示0-15的数字,报头的长度最小20,最大60。
8位服务类型:
3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个。
16位总长度:
IP数据报整体占多少个字节。
8位生存时间:
数据报到达目的地的最大报文跳数,一般是64,每次经过一个路由,该值就会--,如果一直减到0还没有到达目的地。该数据报就会被丢弃。设置的目的是为了防止出现路由循环(成环了)。
16位头部校验和:
使用CRC进行校验, 来鉴别头部是否损坏.
32位源地址和32位目标地址:
表示发送端和接收端。
1.2 分片
在上述中我们没有介绍 16位标识 3位标志 和13位片偏移。这是因为这三个数据的评判与下一层链路层有关。链路层由于物理特征的原因,一般无法发送太大的数据,其具有一次可以转化到网络的报文大小的限制(默认是1500字节)。
如果网络层想要转发一个3000字节数据,就需要对数据进行分片。
分片是什么?
将一个比较大的IP报文,拆分成多个小的、满足条件的报文。这个行为是网络层做的,接收端在向上交付时,也需要将这些分片好的数据做组装。这样才可以保证无论收到时,还是发出时都是完整的数据,让其它层感觉不到这个行为。
如何做到分片?
16位标识
主机发送的报文彼此都不相同。但IP报文在数据链路层如果被分片了, 那么每一个片里面的这个id都是相同的。
3位标识符
第一位是保留位,还没想好怎么用。
第二位为1标识该IP报文禁止分片。如果链路层发送不了这个数据,就会丢弃!
第三位“表示更多分片”,如果分片了的话,除最后一个分片该位为0,其他分片该位为1.
13位片偏移
分片在原始数据中的偏移量。
1.2.1 关于分片的认识
一、分片行为不是主流。一般而言网络层不会进行数据分片。
二、可以根据16位的标识,区分不同的报文。
三、其必须具有识别报文是否被分片的能力
如果一个数据没有分片,它的特征是:
更多分片标志位为0,并且13位片偏移为0。
如果当前数据就是最后一个分片,他的特征是:
13位片偏移一定不为0。
四、具有识别出来哪些分片是开始,中间或者结尾
开始分片:更多分片标记为1,片偏移为0。
中间分片:更多分片标记为1,片偏移不为0。
结尾分片:更多分片标记为0,片偏移不为0。
五、具有异常处理的能力
如果任何一个分片丢失,都会导致组装失败。必须被识别出来。
中间报文有多个,如何保证收全了?
根据偏移量进行升序排序,结合偏移量+自身大小=下一个报文的偏移量。依次扫描整个报文!
1.2.2 分片的具体过程
首先回答一个问题,如果我们想用上述提到的异常处理的方式,分片之后,每个分片的IP报文是否具有自己的独立的报文?
是的。为了支持未来的组装,每一个分片都必须有自己的独立的报文。
1.2.3 分片的坏处
在网络层进行分片和组装的过程,上层(传输层和)应用层是不知道的。而在数据传输过程中,丢包是有概率的,分片增加了丢包概率。
1.3网段划分
首先先对网络号和主机号有一个大致的了解
IP地址分为两个部分,网络号和主机号。
网络号:保证互相连接的两个网段具有不同的标识。
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
举个例子:学号 || 身份证号
学号当中,有好几个部分,比如年级,专业,...,班级中的学号组成。
这些帮助限制范围的称为网络号。因为年级不同或者专业不同这些数字是不一样的。即互相连接的两个网段具有不同的标识。
而范围缩小到了一个范围,就只剩下了一个确认的过程。
即在这个班级里面,我的学号是39。所以可以通过这个数字来找到该学生。这个数字就称为主机号,在同一个班级里面没有人会和我的这两位数字相同,即主机之间具有相同的网络号,但是必须有不同的主机号。
所以网络号表征的是不同区域,网络号在不同的查找过程中是不断变大(数值上),并且收敛的(缩小范围)。
1.3.1 CIDR (网络掩码)划分
网段划分
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。
为什么要进行网络划分呢?1.便于定位。2.提高查找效率
网络掩码
引入一个额外的子网掩码来区分网络号和主机号
子网掩码是一个32位的正整数,通常用一串“0”来结尾。将目的IP地址和子网掩码进行按位与操作,得到的结果就是要去的目的网络的网络号。
因为不同的路由器一定要至少连接两个网络。每一个网络的网络号可能是不同的。所以每个路由器都要给自己直接连接的网络配置对应的子网掩码。
好处是可以给不同的路由配置不同位数的子网掩码,就可以看到不同的网络号!
IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围。
1.4 特殊的IP地址
将IP地址里面的主机地址全部设为0,就成为了网络号,代表这个局域网。
将IP地址里面的主机地址全部设为1,就成了广播地址。用于给同一个链路层互相连接的所有主机发送数据包。
127. 开头的IP地址用于本机环回测试。通常是127.0.0.1
1.5私有IP地址和公网IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到互联网上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
10. 开头,即前8位是网络号,后面都是主机号。
172.16开头 到172.31开头,前12位是网络号。
192.168.开头,前16位是网络号,后16位是主机号(共2^16个地址)
包含在这个范围中的,都称为私有IP,其他的称为公网IP。
由于私有网络对应的IP是局部的,可以在不同的子网中重复出现。IP不足的问题可以通过这种方案缓解。
思考一个问题:路由器会天然的构建局域网(子网),那路由器应该有几个IP地址呢?
对内:面对自己构建的私有IP。
对外:自己本身也是别人构建子网的一个主机。
定了路由器一定要有两套地址。对内使用Lan口IP,是局域网IP。对外使用WAN口IP,自己所在上级子网给自己的IP。
- 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了。
- 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了。
- 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
同一个局域网,两态主机可以直接通信吗?
可以。
那当子网内的主机需要和外网进行通信时呢?(NAT)
子网的数据向外交付时看似没有什么问题。但是一旦外网拿到了数据,怎么给子网发回去呢?首先公网中不存在私有IP,其次就算有,但私有IP是可以重复的,我怎么知道发给谁呢?
所以路由器需要做一件事。将报文中的源IP地址进行替换(替换成WAN口IP)。每一个经过运行商的内网路由器都要这样逐级替换(公网路由不需要做),最终数据包中的IP地址成为一个公网IP,这种技术称为NAT。
1.6 路由
1.6.1 什么是路由
在复杂的网络结构中,找出一条通往终点的路线。路由的过程就是一跳一跳的“问路”过程。
所以在TCP/IP协议共同的作用下,可以可靠的将数据从A主机发送到B主机。
路由的三种情况:
- 路由知道怎么走,直接告诉你目的主机。
- 路由不知道怎么走,但是知道谁知道。(发送给下一个路由器)
- 已经到达了目的IP地址。
1.6.2 路由表
那么如何判定当前这个数据包该发送到哪里呢?
这个就依靠每个节点(节点: 主机和路由器的统称)内部维护一个路由表。
bash: route
Destination | Gateway | Genmask | Flags | Iface |
目的网络 default 是默认网关 | 设备类型 | 子网掩码 | U:正在被使用 UG:默认网关 或者路由器 | 转发路径 |
路由表的查找过程:
收到一个报文,先拿该报文和子网掩码进行&操作得到目的网络,从上往下扫描路由表(default最后),和Destination做对比,如果相等,就通过这个Iface接口(eth0)把他转发出去。如果都没有就会回到Destination中的default,进行默认转发。
转发过程例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路由器根据它的路由表决定下一跳地址;
2.与数据链路层的联系
IP没有解决设备转发的具体功能,IP提供的是转发的策略。局域网的转发,交给下一层解决。
决定将数据交付给下一跳路由器的时候,下一跳路由器一定和我在同一个局域网。
每一跳本质上都是子网转发。所以在宏观上,网络的本质就是一个一个子网构成的。
(数据链路层详见下篇博文)