文章目录
- 一、IP协议
- (1)IP地址协议概念和理解
- (2)IP地址协议格式
- (3)网络号和主机号
- (4)地址管理
- (一)分配IP地址方法
- (二)CIDR分配IP地址
- (三)子网划分
- (四)特殊类IP地址
- (五)IP地址的数量限制
- (5)私有IP地址和公网IP地址
- (6)路由选择
一、IP协议
(1)IP地址协议概念和理解
IP是InternetProtocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:
一是解决互联网问题,实现大规模、异构网络的互联互通;
二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
如下图:
因为目前IP协议主流的版本有IPV4和IPV6,但是IPV6目前不够普及,并且泛用性小,所以我这篇博客主要写的是具有代表性的IPV4。
分析:
IP到底做了什么?扮演的是什么角色?
IP地址核心工作:
IP层的作用是定位主机,具有一个将数据A从主机跨网络送到B主机的能力。有能力不一定能做到,只是体现在有非常大的概率,其实本质上它只是一个行动者,而tcp给它提供策略,让它可靠地将数据A从主机跨网络可靠地送到B主机。
路径选择中,目标IP非常重要,决定我们路径如何走,就如唐僧去西天取经,别问他从哪来,他说从东土大唐来(源IP地址),到西天(目标IP地址)取经,而如果问他上一站从哪来,比如他说从女儿国来,这个是MAC地址(后面说)。
但是他具体去的是雷音寺(目标主机),IP=目标网络+目标主机。
主机: 配有IP地址, 但是不进行路由控制的设备;
路由器: 即配有IP地址, 又能进行路由控制;
节点: 主机和路由器的统称
(2)IP地址协议格式
4位首部长度 和TCP报头中的4位首部长度一样,代表的是IP报头的长度是多少个4字节,4位比特位能够表示的最大数字是15,即IP头部的最大长度是15*4 = 60字节16位总长度 指的是IP数据报整体占多少个字节。用总长度-报头即为有效载荷。
4位版本号:用来标识IP首部的版本号,常见的即为IPV4和IPV6,各个版本的首部格式都有所不同。
4位首部长度:表示IP首部的长度,单位为4字节即32位,因为首部长度具有4位,所能表示的最大数据为15即2^4 - 1,所以IP首部的最大长度为15 * 4 = 60字节,因为首部长度最少为5(除选项),所以IP首部的最小长度为20字节。
8位服务类型:用来表明服务质量。目前0-2位弃用,7位保留。3-6位为TOS字段,分别为最低延迟、最大吞吐、最大可靠性、(这四位合并也代表着最大安全)。
16位数据报长度:标志IP首部与发送数据的长度之和,大小为2^16,即64K,65535。因为IPV4的报头和数据总大小为65535字节,但是数据中又包含了上层(传输层)传下来的数据,所以会将上层如UDP协议数据的大小限制在65535-20(ip协议首部)- 8(UDP协议首部)。IPV6则没有这个问题。
16位标识:标识当前分片属于哪一个完整的上层报文,用于分片重组。因为受限于数据链路层的MTU限制,如果IP报文大于MTU,却又符合数据报长度字段,此时就会在网络层进行数据的分片,将数据拆分开来发送,之后再重组,唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。
3位标志位:第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为1, 其他是0. 类似于一个结束标记。
第一位表示保留位。
第二位表示禁止分片。
第三位表示分片是否结束。
1:表示后面还有分片
0:表示后面没有分片
13位片偏移:当分片后的数据在对端重组时,用来确认该分片在原始报文中的位置。因为13位能够标识的最大大小为8192,而数据报长度为65535,也就是16位。所以要想用13来标识16位,就将片偏移的单位设置为了8个字节,所以也就是说,例如当前片偏移位1000,则说明在原始数据中的1000*8 = 8000处。就相当于在原始数据的偏移量。
8位生存时间:报文的最长生命周期(也代表着可以中转的路由器数量),每经过一次路由器就会减一,为0则直接丢弃。主要用于防止路由环路问题(多个路由互相连接,形成转发环路,数据在环路中不断的转发)。
数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了.。
8位协议:记录传输层所使用的协议,用于数据分用时,选择上层解析协议。
16位校验和:使用CRC进行校验, 来鉴别头部是否损坏。
32位源IP地址/目的IP地址:表示发送端/接收端的IP地址,用于标识通信的两台主机。
0-40字节选项:主要协商和描述一些信息,如安全级别,源路径,路径记录,时间戳。因为IP首部大小最高为60字节,而前面必须的有20字节,所以选项的大小可以为0-40字节。
填充位:保证IP首部大小为4字节的整数倍,不够则填充。
8位服务类型图:
3位标志位图:
问题:
说明:
1.回忆前提:MTU
MTU是数据链路层对到达数据链路层数据大小的规定。数据链路层进行发送数据的时候,是严格遵照MTU进行发送的。数据链路层发送到数据大小一定不会超过MTU
数据链路层就会要求网络层ip协议给数据链路层提交的数据大小不能超过MTU
2.如果IP协议传输的数据大于数据链路层对于数据的限制(MTU),IP协议需要将数据进行分片传输。将大于MTU的数据报,进行切分,以满足MTU的要求。
16位总长度能够标识的数据最大为65536Byte,如果传输层递交给网络层ip协议的数据超过65536Byte,如何做处理?
在网络层的ip协议进行分片传输。
1.每一条数据都是独立的ip数据报
2. 当这些ip数据报传输到对端之后,对端针对ip协议个数头部的16位标识,3位标志,13位片偏移来组装同一条数据报
TCP需要ip协议进行分片?
不需要进行分片,因为TCP协议在传输数据的时候,严格按照MSS进行传输,而MSS一定是小于MTU的,而一般网卡的MTU都是1500字节,换句话说,TCP在每次传输数据的时候都是不会超过1500字节的。因此,MSS是远远小于65536字节的,因此也就不会触发ip协议进行分片传输。
UDP需要ip协议进行分片吗?
有可能需要进行分片,因为UDP协议是没有类似于MSS存在的,因此,UDP的数据的最大长度是65536字节,网络层递交给数据链路层大小必须小于MTU的,因此,一旦UDP递交给网络层ip协议的数据加上ip协议报头之后,总长度大于了当前主机的MTU大小时,就会需要进行分片传输。
注:因为UDP协议是不可靠的,在ip数据报转发的时候,都有自己的路由转发路径,可能会造成丢失。
分片丢了会重发分片还是所有数据一起重发?
有分片, 则代表一定是UDP数据进行分片了。
第一个:
分片 传输一定是UDP数据 +UDP协议是不保证可靠 +ip协议也是不保证可靠重发:
只能从应用层协议触发重传,所有数据一起重发
(3)网络号和主机号
ip地址=网络号和主机号
网络号:保证互相连接的两个网段具有不同的标识
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
不同的子网其实就是把网络号相同的主机放到一起。
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同。
(4)地址管理
(一)分配IP地址方法
手动管理子网内的IP解决
有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便。
一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器。
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类
A类:
B类:
C类:
ABCDE:
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
(二)CIDR分配IP地址
但是这种划分方法是具有局限性的,因为A类太多(几千万个主机不可能用得完),而C类太少(254个一下就用完了)。所以政府、企业、学校等组织都去申请较为适中的B类地址,但是在实际使用中,不可能每一个组织都能用满,所以造成了大量IP地址的浪费。
例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多。
然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了。
所以为了解决这种情况。
就提出了新的划分方法:CIDR(Classless Interdomain Routing)。
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
- 子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾。
- 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号。
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。
现在的IP地址都是经过CIDR方式分配的, 不存在A类,B类,C类IP地址的说法,IP地址是路由器设备给连接上的机器分配的, 分配IP地址的时候, 会分配上子网掩码。
如下例:
子网掩码就是一段连续的二进制1。子网掩码与IP地址相与则能得到网络号,而子网掩码取反则能得到主机号的范围,取反之后,有多少比特位为1,则表示当前子网当中的ip地址使用了多少个比特位当作是主机号。
例子:
(三)子网划分
可以把基于每类的IP网络进一步分成更小的网络,每个子网由路由器界定并分配一个新的子网网络地址,子网地址是借用基于每类的网络地址的主机部分创建的。划分子网后,通过使用掩码,把子网隐藏起来,使得从外部看网络没有变化,这就是子网掩码。
例题:
某单位申请到一个C类网络地址:192.168.2.0/24,该单位有4个部门,希望从这个网络中平均划分出四个子网,请列出每个子网的网络号,子网掩码,IP地址范围,从8位中取两位来作为网络号,所以子网掩码为,而192.168.2.00 ->0
192.168.2.01->64
192.168.2.10 ->128
192.168.2.11->192
根据每个子网需要的主机数为62台,可以计算出每个子网的子网掩码为26位(因为2^6=64,而实际可用主机数为62,所以需要6位二进制位来表示主机号)。
子网1:
网络号:192.168.2.0
子网掩码:255.255.255.192
IP地址范围:192.168.2.1 - 192.168.2.62
子网2:
网络号:192.168.2.64
子网掩码:255.255.255.192
IP地址范围:192.168.2.65 - 192.168.2.126
子网3:
网络号:192.168.2.128
子网掩码:255.255.255.192
IP地址范围:192.168.2.129 - 192.168.2.190
子网4:
网络号:192.168.2.192
子网掩码:255.255.255.192
IP地址范围:192.168.2.193 - 192.168.2.254
在每个子网中,第一个IP地址和最后一个IP地址分别为网络号和广播地址,所以可用的主机数量为62台。
(四)特殊类IP地址
在一个网段中都会有一个网络号的和广播号,即 192.0.0.0 ~ 192.0.0.255
网络号:主机号全为0的ip地址,就为该网段中的网络号
广播号:主机号中全为1的ip地址,就为该网段中的广播号
127.0.0.1 :本地回环网卡地址(通常用来测试自己机器的网络连通性)
0.0.0.0:代表本地所有的网卡地址
(五)IP地址的数量限制
因为IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方个IP地址, 大约是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址,这意味着, 一共只有43亿台主机能接入网络么?
实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址。
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不够用.。
有三种方式来解决:
1、动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的。
3、IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容,IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及。
2、NAT技术(后面博客会单独介绍)。
(5)私有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);
在我们通过ipconfig查看本机IP地址时,往往看到的都是192.168.0.x。其实这个是我们的私有ip地址,比如在一定的区域内,划分出了很多个网段,而这些网段下也就是我们的私网ip,这个ip地址仅仅用于我们内部的通信。
简单来说,在这个大的网络下,可能存在无数个这样的子网,也就是为什么我们无论在家,还是在学校等地方,所看到的ip地址几乎是一样的。
这个私有的ip地址只能内部通信,如果要与外部通信,就需要借助到NAT技术来将私有的IP地址转换为公有的IP地址。也就是说,这个网络下的所有私有,都需要用统一的公网IP地址来外部通信。
(6)路由选择
IP网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点通信”。
IP网络层的下一层——数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
首先要知道一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP)
1.路由选择是在为网络数据选择合适的设备进行转发,
2.路由器上面的网口,
WAN : 是当前路由器连接上级路由器的网口
LAN : 是子网内机器连接本路由器的网口。
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中,从图中可以看出从运营商机房(101.1.1.1)拉出的网线插在了家用路由器的WAN口上,个人设备是插在家用路由器的LAN口上。
也就是说,每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了,子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP这种技术称为NAT(Network Address Translation,网络地址转换)。
路由设备中都会有一个路由表,路由表记录了当前的路由项,路由器是如何进行网络转发。如下图:
首先用网络数据中的目的ip和路由项当中的子网掩码进行按位与操作(需要注意的是,该目的ip先和非网关的路由项进行操作,最后再和网关路由项进行操作)。
其次将按位与操作的结果和路由项的Destination进行对比
1 如果说没有对比上,则代表该条数据不是往该子网当中进行转发,会通过默认网关,发送到上级路由。
2 如果说对比上了,则代表该条数据是往该子网当中的某一个主机进行转发
的,隐含意思是该目的主机和源主机主机处于一个子网当中。
路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程。所谓 “一跳” 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间,IP数据包的传输过程也和问路一样。当IP数据包, 到达路由器时, 路由器会先查看目的IP。
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。依次反复, 一直到达目标IP地址
为什么要有子网划分?
互联网中的每一台主机都要隶属于一个子网,为了方便定位主机,排除效率高,因为每次路由都要在路由表里面进行查找所对应的IP地址看它属于哪个子网进而快速直接或间接定位,而查找的本质是排除,有了子网他可以排除一批路由器或子网。