一、初识IP
IP意义:IP地址提供一种能力,将数据从一个主机跨网络发送到另一个主机的能力。但是只是有能力,不能保证每一次都能传输成功,所以就要有上层TCP协议传输层来提供策略保证可靠性。
IP = 网络号 + 主机号
主机:配有IP地址,有一定路由功能。
路由器:配有IP地址,并能路由。
节点:主机与路由器的统称。
二、IP协议格式
分离报文:4位首部长度,同TCP协议,详见传输层TCP协议-CSDN博客
分用:8位协议,TCP/UDP
4位版本:一般ipv4(用4字节表示IP地址)
8位服务类型:3位优先权字段(已弃用),4位TOS字段,1位保留字段(必须置0)。4位TOS分别是最小延时,最大吞吐量,最高可靠性,最小成本,4个只能选一个。
16位总长度:记录报文总长度。
8位生存时间:每经过一个路由器,时间--,时间等于0,报文丢弃。防止报文被环路转发积攒。
三、网段划分
首先网络IP是一个有用且有限的资源,只有经过合理的划分才能减少浪费。
路由器的功能:路由,构建子网,动态分配私有IP地址,有web功能
1、IP地址分类
但是由于A类IP太稀有,C类IP主机号太少,导致B类IP很快就被分配完了,而且A类IP的主机号也存在浪费。所以不怎么使用这种网段划分方式。
2、CIDR
可以以比特位级别来控制网络号和主机号的划分。
引入子网掩码区分主机号和网络号,子网掩码是一个32位的正整数,通常以一串0结尾(目的是与IP地址 按位与 之后能把主机号清0,得到网络号)网络号与主机号的划分与IP地址是A类还是B类无关。
例子一子网掩码有8位比特位是0,最后相应的主机号就是最后8位比特位,网络号是前24位,我们一般可以把这种IP地记成 140.252.20.68/24,24就代表子网掩码前24位是1,也代表网络号是前24位。可接入的主机个数就是 00000000 ~ 11111111,256个,但是主机号全0全1是网络号和广播地址,不可用,所以只有254个。
所以例子二IP地址记成 140.252.20.68/28,只有最后4位比特位才表示主机号。
从上面我们就能感受到 CIDR 可以以比特位级别来控制网络号和主机号的划分,利用率大大提高,但是本质并没有解决IP地址总上限只有43亿多不够用的情况。
所以为什么要网段划分?
经过精心的设计,合理的划分,可以高效支持未来报文路径查找目标主机,提高效率。
四、特殊IP地址
1、将IP地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网。
五、IP地址限制问题
六、私有IP地址和公网IP地址

七、路由
1、预备知识
任何主机都有能力知道与自己直连的网络号。
报文从客户端转发到服务器过程:由于私有IP不能出现在公网上,报文在内网传递时每经过一个路由器就要把自己的 srcIP 改成路由器的WAN口IP,这样最后在公网上面的 srcIP 就被替换成了公网IP,可与公网中的服务器进行通信,这就是NAT技术(只在进出内网时作转化)
公网的末端有各个运营商持有,最后用来构建私网重复利用IP地址。
路由器可以记录与自己同级别的目标网络与子网掩码(路由表),用于判断报文是同级转发还是向上交付。
2、路由表
Destination | Gateway | Genmask | Flags | Metric | Ref | Use | Iface |
192.168.10.0 | * | 255.255.255.0 | U | 0 | 0 | 0 | eth0 |
192.168.56.0 | * | 255.255.255.0 | U | 0 | 0 | 0 | eth1 |
127.0.0.1 | * | 255.0.0.0 | U | 0 | 0 | 0 | lo |
default | 192.168.10.1 | 0.0.0.0 | UG | 0 | 0 | 0 | eth0 |
3、路由方式
数据链路层一次只会发送小于1500字节数据,所以当传输层发送大于1500字节数据时,网络层只能对数据进行分片,经过传输到达对方网络层时还要对分片进行组装向上交付。
注意:
(1)在网络中只有IP报文,不认识什么TCP,UDP
(2)传输中,分片丢失1个就代表整个报文丢失
(3)所以底层有减少分片的需求,传输层的滑动窗口大小就是以1000字节为标准发送的
所以问题变成了如何分片,组装?
4、如何区分报文是否分片?
这里我们介绍IP协议里面的16位标识符,3位标志,13位位偏移。
16位标识符:不同报文标识符不同,相同报文的分片标识符一定相同。
3位标志:第一位保留,第二位1表示禁止分片,超过MTU报文丢弃,0表示默认可以分片,第三位更多分片,1表示是除了最后一个分片的标志,0表示是报文里面最后一个分片。
13位位偏移:分片相对于数据的字节偏移量。例如下图:
规定:分片之后的报文必须有报头,所以原先报文被分成了1480,1480,20,所以13位位偏移应该是0,1480,2960
但是我们发现IP协议里面有16位报文长度,怎么能被13位位偏移表示呢?
当16位报文写入13位位偏移时,原先16位的偏移量会被右移3位(除以8)
当13位位偏移得16位报文时,原先13位的偏移量会被左移3位(乘以8)
所以我们要求报文长度是8的整数倍。
所以写入的不是0,1480,2960,而是0,175,370
回答问题:如何区分报文是否是分片?
分片 | 第一片 | 中间片 | 最后一片 |
特点 | 更多分片 == 1 位偏移 == 0 | 更多分片 == 1 位偏移 > 0 | 更多分片 == 0 位偏移 > 0 |
if(更多分片 == 1 || 位偏移 > 0) 就是分片
更多分片 == 0 && 位偏移 == 0 不是分片
两个条件互斥。
5、如何保证分片收全了?
分片 | 无第一片 | 无中间片 | 无最后一片 |
特点 | 位偏移没有0 | 所有分片位偏移升序排序 按逻辑:自己位偏移+自己长度=下一个分片位偏移,不符合就缺 | 更多分片没有0 |
6、如何组装?
按顺序,除了第一个分片,其他分片去报头,连接到第一个分片后面。