计算机网络 (四) 网络层 :一文搞懂IP协议
网络层的目的就是实现终端节点之间的通信,即点对点通信。具体功能包括路由选择与地址管理等。
这一层主要有IP和ICMP两个协议组成,在这里就先重点讲解IP协议,后面会单独将IP协议相关的如ICMP,DNS,NAT,NAPT,DHCP等协议单独写一篇博客汇总。
IP协议
IP是InternetProtocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
因为目前IP协议主流的版本有IPV4和IPV6,但是IPV6目前不够普及,并且泛用性小,所以我这篇博客主要写的是具有代表性的IPV4。
IPV4的协议格式
- 4位版本号:用来标识IP首部的版本号,常见的即为IPV4和IPV6,各个版本的首部格式都有所不同,这里我画的是IPV4的。
- 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,却又符合数据报长度字段,此时就会在网络层进行数据的分片,将数据拆分开来发送,之后再重组
- 3位标志位:标识包被分片的相关信息。0位保留,1位代表是否进行分片,2位代表如果分片是否位最后一个包。
-
13位片偏移:当分片后的数据在对端重组时,用来确认该分片在原始报文中的位置。因为13位能够标识的最大大小为8192,而数据报长度为65535,也就是16位。所以要想用13来标识16位,就将片偏移的单位设置为了8个字节,所以也就是说,例如当前片偏移位1000,则说明在原始数据中的1000*8 = 8000处。
-
8位生存时间:报文的最长生命周期(也代表着可以中转的路由器数量),每经过一次路由器就会减一,为0则直接丢弃。主要用于防止路由环路问题(多个路由互相连接,形成转发环路,数据在环路中不断的转发)
-
8位协议:记录传输层所使用的协议,用于数据分用时,选择上层解析协议
-
16位校验和:用于检验接收的数据与发送的数据是否一致,不一致则丢弃。校验方法:二进制反码求和,即对报文从头开始的每个字节进行取反相加,高出16位则截断高位,与低16位相加,得到校验和。
-
32位源IP地址/目的IP地址:表示发送端/接收端的IP地址,用于标识通信的两台主机
-
0-40字节选项:主要协商和描述一些信息,如安全级别,源路径,路径记录,时间戳。因为IP首部大小最高为60字节,而前面必须的有20字节,所以选项的大小可以为0-40字节。
-
填充位:保证IP首部大小为4字节的整数倍,不够则填充
地址管理
地址管理的目的是让IP地址的分配更加的合理
IP地址的组成
IP地址就是网络中主机的唯一标识,无论哪个主机与哪个主机之间进行通信,都需要用到IP地址来进行定位。
而IP地址,又由网络号和主机号组成。
网络号: 标识网络,保证每一个路由器分配的IP地址都会带有自己的网络标识,(不同网络使用不同的网络号分配地址就可以避免冲突)
主机号: 标识主机,每一个主机在所在的网络中都有唯一的主机号。
例如同一网络下相邻的两个主机
/24代表着前24位是网络号,而32-24=8,也就是剩下8位为主机号。
上图中两个主机的网络号为:192.168.128
而他们的主机号分别为21和22。
不同的子网其实就是把网络号相同的主机放到一起. 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致,
但是主机号必须不能和子网中的其他主机重复
通过合理的设置主机号和网络号,就可以保证在互相连接的网络下,每台主机的IP地址都不同。
同时,可以利用DHCP技术来自动给子网中新增的主机分配IP地址,详细的在下一篇博客中。
IP地址的分类
早期时人们通过对网络号和主机号的划分,将IP地址分为5类。
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
使用较为广泛的主要为ABC三类地址,DE为特殊的IP地址。
A类IP地址:
用于组建大型网络。第一位固定为0,7位网络号,24位主机号。
IP地址范围:0.0.0.0 ~ 127.255.255.255
例如1.0.0.0 ~1.255.255.255。
对于其中某一个网络,其所能容纳的主机数量位2^24 - 2,也就是16581373个主机(全0和1保留不用)
B类IP地址:
用于组建中型网络。前两位固定为10,14位网络号,16位主机号。
IP地址范围:128.0.0.0 ~ 223.255.255.255
例如128.1.0.0 ~128.1.255.255。
对于其中某一个网络,其所能容纳的主机数量位2^16 - 2,也就是65534个主机(全0和1保留不用)
C类IP地址:
用于组建小型网络。前三位固定为110,21位网络号,8位主机号。
IP地址范围:192.0.0.0 ~ 223.255.255.255
例如192.168.1.0 ~192.168.1.255。
对于其中某一个网络,其所能容纳的主机数量位2^8 - 2,也就是254个主机(全0和1保留不用)
但是这种划分方法是具有局限性的,因为A类太多(几千万个主机不可能用得完),而C类太少(254个一下就用完了)。所以*、企业、学校等组织都去申请较为适中的B类地址,但是在实际使用中,不可能每一个组织都能用满,所以造成了大量IP地址的浪费。
所以为了解决这种情况,就提出了新的划分方法,CIDR。
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
- 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号; 网络号和主机号的划分与这个地址的类型无关。
子网掩码就是一段连续的二进制1。子网掩码与IP地址相与则能得到网络号,而子网掩码取反则能得到主机号的范围。
例如:
可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高
24位是1,也就是255.255.255.0
特殊的IP地址
0.0.0.0:可以识别当前主机上任意网卡地址(也就是缺省IP地址),常用于服务器的监听地址。(表示绑定监听本机上的所有地址)
255.255.255.255:全网广播地址(任意一个主机收到这个地址的数据,都会认为是发送给自己的,常用于DHCP请求地址。)
127.0.0.1:本地虚拟回环网卡的地址(常用于本地的网络通信测试,即自己给自己发送数据)
在上面写到过,主机号全为1或者0的地址是特殊的,无法分配给主机。
主机号全为0:
其实就是网络号,代表着这个网段。
主机号全为1:
其实是UDP局域网广播地址(适配于当前网络的所有主机)。
子网划分
可以把基于每类的IP网络进一步分成更小的网络,每个子网由路由器界定并分配一个新的子网网络地址,子网地址是借用基于每类的网络地址的主机部分创建的。划分子网后,通过使用掩码,把子网隐藏起来,使得从外部看网络没有变化,这就是子网掩码。
例如这道题目
某单位申请到一个C类网络地址:192.168.2.0/24,该单位有4个部门,希望从这个网络中平均划分出四个子网,请列出每个子网的网络号,子网掩码,IP地址范围
因为是C类网络,主机号只有八位,而又要划分出4个子网,那么就以为着要从8位中取两位来作为网络号。
192.168.2.00 192.168.2.01 192.168.2.10 192.168.2.11。
子网掩码则为255.255.255.192
因为只剩下6位作为主机号,所以能够使用的主机数量只有2^6 -2也就是62台。
所以每个子网分别为
子网1:
网络号:192.168.2.00 子网掩码:255.255.255.192 IP地址范围:192.168.2.0 ~192.168.2.63
子网2:
网络号:192.168.2.00 子网掩码:255.255.255.192 IP地址范围:192.168.2.0 ~192.168.2.63
子网3:
网络号:192.168.2.00 子网掩码:255.255.255.192 IP地址范围:192.168.2.0 ~192.168.2.63
子网4:
网络号:192.168.2.00 子网掩码:255.255.255.192 IP地址范围:192.168.2.0 ~192.168.2.63
私有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);
- 一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
- 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
- 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1).子网内的主机IP地址不能重复. 但是子网之 间的IP地址就可以重复了.
- 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了. 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级 替换, 最终数据包中的IP地址成为一个公网IP.这种技术称为NAT(Network Address Translation,网络地 址转换).
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服 务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.
在我们通过ipconfig查看本机IP地址时,往往看到的都是192.168.0.x。其实这个是我们的私有ip地址,可以这么说,比如在一定的区域内,划分出了很多个网段,而这些网段下也就是我们的私网ip,这个ip地址仅仅用于我们内部的通信。也就是说,在这个大的网络下,可能存在无数个这样的子网,也就是为什么我们无论在家,还是在学校等地方,所看到的ip地址几乎是一样的。
这个私有的ip地址只能内部通信,如果要与外部通信,就需要借助到NAT技术来将私有的IP地址转换为公有的IP地址。也就是说,这个网络下的所有私有,都需要用统一的公网IP地址来外部通信。
关于NAT和NAPT的详细就不在这里解释,下一篇博客在一起写。
路由选择
路由选择,即路由器为每一个流经的数据根据目的IP地址进行路径选择。
- 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
- 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
- 依次反复, 一直到达目标IP地址;
![]()
路由器内部通过维护一个路由表,来决定数据转发的路径。
路由表的每一项中记录了目的网络,子网掩码,下一跳。
通过查询路由表来决定转发的对象。
- 路由表可以使用route命令查看
- 如果目的IP命中了路由表, 就直接转发即可;
- 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配 时,就按缺省路由条目规定的接口发送到下一跳地址。
路由表可以通过手动维护(静态路由),也可以通过ospf,rip等路由选择算法来自动选取。