目录
[2. IP协议头格式(基本)](#2. IP协议头格式(基本))
[3. 子网划分](#3. 子网划分)
[4. ⽹段划分](#4. ⽹段划分)
[5.1 IP地址的数量限制](#5.1 IP地址的数量限制)
[5.2 私有IP地址和公⽹IP地址划分](#5.2 私有IP地址和公⽹IP地址划分)
[5.3 子网通信](#5.3 子网通信)
[5.4 公⽹简单描述](#5.4 公⽹简单描述)
[7. IP分⽚和组装(IP协议头格式)](#7. IP分⽚和组装(IP协议头格式))
[7.1 三个关于分⽚和组装字段](#7.1 三个关于分⽚和组装字段)
[7.2 分片过程](#7.2 分片过程)
[7.3 组装过程](#7.3 组装过程)
[7.4 关于IP分⽚和组装的几个问题](#7.4 关于IP分⽚和组装的几个问题)
1.概念

在复杂的⽹络环境中确定⼀个合适的路径,这就是网络层的作用

主机: 配有IP地址, 也要进⾏路由控制的设备;
路由器: 即配有IP地址, ⼜能进⾏路由控制;
节点: 主机和路由器的统称;
在网络通信中核心功能就是要把数据100%可靠的,从A主机跨网络送到B主机,在传输层的协议中,提供策略,而网络层协议提供能力,这两种配合起来,才能实现,这就是TCP/IP协议
在网络层,IP协议提供了一种能力,把数据从A主机跨网络送到B主机,因此必须要有方式,表示通信两端主机的唯一性,每台主机都必须设置IP地址(公网IP),IP=目标网络+目标主机
2. IP协议头格式(基本)

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4
4位头部⻓度(header length): IP头部的⻓度是多少个字节, 但基本单位为4字节,因此IP头部最⼤⻓度(1111全1的情况)是60字节,(可以参考TCP字段和这个是一样的)
8位服务类型(Type Of Service): 3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表⽰: 最⼩延时, 最⼤吞吐量, 最⾼可靠性, 最⼩成本. 这四者相互冲突, 只能选择⼀个. 对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最⼤吞吐量⽐较重要.
16位总⻓度(total length): IP数据报整体占多少个字节,
为什么要有这个字段?有4位头部⻓度不就能够很好的进行分离?
这是为了保证应用层拿到一些管理数据,而这些数据应用层不需要,因此就需要16位总⻓度
8位⽣存时间(Time To Live, TTL): 数据报到达⽬的地的最⼤报⽂跳数. ⼀般是64. 每次经过⼀个路由, TTL -= 1, ⼀直减到0还没到达, 那么就丢弃了. 这个字段主要是⽤来防⽌出现路由循环
8位协议: 表⽰上层协议的类型
16位头部校验和: 使⽤CRC进⾏校验, 来鉴别头部是否损坏.
32位源地址和32位⽬标地址: 表⽰发送端和接收端.
选项字段(不定⻓, 最多40字节): 略
关于16位标识(id),3位标志字段,13位分⽚偏移下文叙述
3. 子网划分
首先看一下场景,某个学校,有六个学院,每个学院都有对应的编号,而每个学生则有对应的学号,学号前两位就是自己对应学院的编号,每个学院再选出一个主席,并建立一个校群

此时就有个场景,张三的学号是01123,他捡到了一个钱包,里面有李四学生证,学生证上面的学号是06321,为了归还钱包,张三就把李四的学号以及自己的电话号码给了自己学院的主席,主席看到李四的学号(只会看前两位)就会@对应学院编号的主席,对应学院编号的主席就会拿到学号(只看后三位)并通知李四

每个学院就代表一个子网,里面的给学生分配学号就是内网划分,而学号=学院编号+某个号码,代表IP=目标网络+目标主机,主席就是出入口路由器,而上面这个过程就是数据在网路通信的过程
为什么有子网划分?
为了增加查找的效率
4. ⽹段划分
IP地址分为两个部分, ⽹络号和主机号
⽹络号: 保证相互连接的两个⽹段具有不同的标识;
主机号: 同⼀⽹段内, 主机之间具有相同的⽹络号, 但是必须有不同的主机号;

不同的⼦⽹其实就是把⽹络号相同的主机放到⼀起.
如果在⼦⽹中新增⼀台主机, 则这台主机的⽹络号和这个⼦⽹的⽹络号⼀致, 但是主机号必须不能和⼦⽹中的其他主机重复.
通过合理设置主机号和⽹络号, 就可以保证在相互连接的⽹络中, 每台主机的IP地址都不相同.
那么问题来了, ⼿动管理⼦⽹内的IP, 是⼀个相当⿇烦的事情.
有⼀种技术叫做DHCP, 能够⾃动的给⼦⽹内新增主机节点分配IP地址, 避免了⼿动管理IP的不便,⼀般的路由器都带有DHCP功能. 因此路由器也可以看做⼀个DHCP服务器.
过去曾经提出⼀种划分⽹络号和主机号的⽅案, 把所有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类却浪费了⼤量地址;
例如, 申请了⼀个B类地址, 理论上⼀个⼦⽹内能允许6万5千多个主机. A类地址的⼦⽹内的主机数
更多,然⽽实际⽹络架设中, 不会存在⼀个⼦⽹内有这么多的情况. 因此⼤量的IP地址都被浪费掉了
针对这种情况提出了新的划分⽅案, 称为CIDR(Classless Interdomain Routing)(⽆类别域间路由):
引⼊⼀个额外的⼦⽹掩码(subnet mask)来区分⽹络号和主机号;
⼦⽹掩码也是⼀个32位的正整数. 通常⽤⼀串 "0" 来结尾;
将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
特殊的IP地址
将IP地址中的主机地址全部设为0, 就成为了⽹络号, 代表这个局域⽹;
将IP地址中的主机地址全部设为1, 就成为了⼴播地址, ⽤于给同⼀个链路中相互连接的所有主机发送数据包;
127.*的IP地址⽤于本机环回(loop back)测试,通常是127.0.0.1
5.私有IP地址和公⽹IP地址
5.1 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还没有普及;
5.2 私有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);
5.3 子网通信
在网络通信中,一般人使用网络都是内网,子网,局域网,而公网则一般使用不到,同时私有IP不能出现在公网上,为什么?看如下图

路由器本身具有构建子网的能力,因此可以给子网内所有主机分配IP地址
⼀个路由器可以配置两个IP地址, ⼀个是WAN⼝IP(代表当前路由器在那一个子网下), ⼀个是LAN⼝IP(路由器自己构建的⼦⽹IP).
现在有一个报文,需要从192.168.1.203到达122.77.241.3

当报文需要回去是,发现在广域网中找不到192.168.1.201,因此私有IP不能出现在公网上,这是由于报文回不来了
有什么办法可以让报文回来吗?此时就需要WAN⼝IP
⼦⽹内的主机需要和外⽹进⾏通信时, 路由器将IP⾸部中的IP地址进⾏替换(替换成WAN⼝IP), 这样逐级替换, 最终数据包中的IP地址成为⼀个公⽹IP. 这种技术称为NAT(Network Address
Translation,⽹络地址转换).

后面报文回来的时候,会经过内网转发,到达目标主机
不同的路由器, ⼦⽹IP其实都是⼀样的(通常都是192.168.1.1). ⼦⽹内的主机IP地址不能重复. 但是⼦⽹之间的IP地址就可以重复了,并且有NAT技术,可以解决IP地址问题
5.4 公⽹简单描述
对于公网IP需要每个国家自主申请,分配公网IP需要更具当前国家的网民数量按照地区划分(简单理解)
例如一个公网IP有32位
前八位,代表国家编号,后面24位按照每个国家不同自行安排,拿中国2举例,24位中,前八位用来划分省,之后四位继续用来划分市,后面继续的话就是县,镇......
6.路由
在复杂的⽹络结构中, 找出⼀条通往终点的路线
路由的过程, 就是这样⼀跳⼀跳(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路由器根据它的路由表决定下⼀跳地址;
公网路由器的路由表算法和内网的路由表算法的复杂度不同(这里就不叙述路由表算法)
7. IP分⽚和组装(IP协议头格式)
7.1 三个关于分⽚和组装字段

数据链路层规定,当⼀个IP数据报的⼤⼩超过了⽹络的MTU(最⼤传输单元1500字节)限制时,就需要进⾏分⽚。MTU是数据链路层对IP层数据包进⾏封装时所能接受的最⼤数据⻓度。
如果此时超过了这个长度,就要对数据进行分片,在网络通信中,如果过多分片,就会导致丢包概率,因此分⽚和组装是不得已而为之,为了减少分片,传输层把数据分为一段一段进行传输
IP层将原始的IP数据报分割成多个较⼩的⽚段。 对于每个⽚段,IP层会设置相应的标识(Identification)、偏移量(Fragment Offset)和标志位(Flags)等字段。
•
标识字段⽤于标识属于同⼀个数据报的不同分⽚,确保所有分⽚能够被正确地重新组装。
16位标识(id): 唯⼀的标识主机发送的报⽂. 如果IP报⽂在数据链路层被分⽚了, 那么每⼀个⽚⾥⾯的这个id都是相同的.
标志位字段包含了3个位,其中MF(More Fragment)位⽤于指⽰是否还有更多的分⽚,DF
(Do Not Fragment)位⽤于指⽰数据报是否允许进⾏分⽚
•
3位标志字段: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1 表⽰禁⽌分⽚, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表⽰"更多分⽚", 如果分⽚了的话, 最后⼀个分⽚置为0, 其他是1. 类似于⼀个结束标记
偏移量字段指⽰了当前分⽚相对于原始数据报的起始位置,以8字节为单位
•
13位分⽚偏移(framegament offset): 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当前分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 8 得到的. 因此, 除了最后⼀个报⽂之外, 其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).
7.2 分片过程
1.检查MTU限制:当⼀个IP数据报的⼤⼩超过了⽹络的MTU(最⼤传输单元)限制时,就需要进⾏分⽚
2.分割数据报:IP层将原始的IP数据报分割成多个较⼩的⽚段,对于每个⽚段,IP层会设置相应的标识(Identification)、偏移量(Fragment Offset)和标志位(Flags)等字段。
3.添加IP头部:每个分⽚都会加上⾃⼰的IP头部,与完整IP报⽂拥有类似的IP头结构,但MF和Fragment Offset等字段的值会有所不同。
4.发送分⽚:分⽚在传输过程中独⽴传输,每个分⽚都有⾃⼰的IP头部,并且各⾃独⽴地选择路由。
7.3 组装过程
- 接收分⽚:当⽬的主机的IP层接收到这些分⽚后,会根据标识字段将属于同⼀个数据报的所有分⽚挑选出来。
2.排序与组装:利⽤⽚偏移字段,IP层会对属于同⼀个数据报的分⽚进⾏排序。当所有的分⽚都到达并正确排序后,IP层会将这些分⽚重新组装成⼀个完整的IP数据报。
- 传递给上层协议:组装好的IP数据报会传递给上层的协议进⾏处理。
7.4 关于IP分⽚和组装的几个问题
1.如何保证特定的报文是否被分片了
1.更多分片是否是1,1就是分片
2.更多分片0,但片偏移大于0
2.如何保证接收端把报文分片接收完整
1.依靠16位标识先分类
2.把所有的分片按照片偏移进行排序,若片偏移为0丢失,代表第一片数据丢失,若没有更多分片是0分片,代表结尾分片丢失,对于中间的分片丢失,片偏移+自身报文长度=下一片分片的片偏移数字


