【网络】网络层IP协议

在网络层中,有四种协议:ARP协议,IP协议,ICMP协议,IGMP协议

IP的基本概念

  • IP地址是用来标识互联网或本地网络中设备的标识
  • 配有IP地址,但不进行路由控制的设备被称为主机
  • 配有IP地址,同时也能进行路由控制的设备被称为路由器
  • 主机和路由器统称为节点

IP地址的组成

IP地址 = 网络号 + 主机号,之后会介绍为什么会这样
原因:子网划分的结果

IP协议格式

在这里插入图片描述

  • 4为版本号(version):指定IP协议的版本,对于IPv4来说就是4
  • 4位首部长度(header length):用来标识IP报头的长度,单位是4byte(32bit),也就是说IP报头的长度 = length * 4
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要
  • 16位总长度(total length):IP数据报整体占多少个字节(即报头+有效载荷所占总字节数
  • 16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个分片里的16位标识都是相同的
  • 3位标志:第一位保留(目前不使用),第二位位置为1表示‘’禁止分片‘’,此时如果IP报文的长度超过了MTU,则IP模块会丢弃报文,第三位表示“更多分片”,如果分片,最后一个分片该位置为1,其余为0(在数据链路层会介绍)
  • 13位片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)
  • 8位生存时间(Time To Live, TTL):数据到达目的地的最大报文跳数
  • 8位协议:表示上层(传输层)协议类型
  • 16为头部校验和:使用CRC进行校验,来鉴别头部是否损坏
  • 32位源地址和32位目的地址:表示发送端和接收端
  • 选项:不定长,最大为40字节

如何分离IP报头与有效载荷

4位首部长度为4bit,可以用来表示0(2进制0000) - 15(2进制1111)之间的整数,而其单位为4byte,因此它就可以用来表示0-60字节长度IP报头,而IP的标准报头(不包含选项的报头)长度为20byte,所以选项的最大长度40byte

通过4位首部长度标识IP报头的长度就能够做到IP报头与有效载荷的分离

TCP/UDP与IP的关系

TCP/UDP属于传输层协议,而IP属于网络层协议,TCP/UDP为IP提供了网络传输策略,而IP为上层提供了网络传输的能力,也就是IP的作用:定位寻址!

网段划分

在介绍网段划分前,先举个例子

有一天,张三在校园里捡到了一张身份证,担心失主急需这张身份证,张三就问室友怎么才能找到失主
室友给张三提供了两种解决方案:
1.在食堂门口等着,每遇到一个人就问一个人有没有丢身份证
2.先找到失主所在的学院,再交给学院负责人去找到失主
很明显,聪明的我们可以想到,第二种解决方案效率明显更高,用时间复杂度来解释,第一种解决方案的最坏情况是O(N),而第二种解决方案的时间复杂度类似二分查找是O(lgN)

IP的作用同样如此,在网络传输中,如何定位接收端的地址是一个很重要的问题,如果通过遍历的方式去定位,很显然效率很低,而通过这种“学校 -> 学院 -> 专业 -> 班级 ”的路径查找,效率明显更高。这种划分区域的方法在网络中同样适用!

将网络划分为不同的子网,通过每个唯一标识不同的子网,找到对应的网络节点,就是子网划分!

比如,学校就好比一个公网,那么每个学院就是划分出来不同的子网,学院里不同的专业又是在学院中划分出来不同的子网,通过这种层层划分的方式就可以精确高效的定位!

在这里插入图片描述
网络也是同样如此,那么如何进行网段划分呢?
在这里插入图片描述
这里举例子是想说明,不同的子网就是不同的集群,而每个子网内又可以继续划分,用不同的网段(IP地址中不同部分的二进制位)来唯一标识不同的子网,就能够通过IP地址精确找到目的地址!

又比如我们的18位身份证中,有的字段表示省份,有的字段表示市区,有的字段是我们的出生日期…

这就解释了,为什么IP地址 = 网络号 + 主机号
同一子网中的所有主机的网络号都是相同的,为了区分同一子网中的不同主机,就用不同的主机号唯一标识同一子网的不同主机!

过去网络中将IP地址分为了五类:
在这里插入图片描述

以下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

但是这种方案会存在一种局限性,例如,大量组织申请B类地址,理论上一个子网内可以存在6万5千多个主机,而A类地址可以存在更多,但实际上并不会存在这种情况,因此大量的IP地址就被浪费掉了,为了解决这种问题,就有了新的划分方案,称为CIDR(Classless Interdomain Routing)

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号
  • 子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾
  • 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号
  • 网络号和主机号与这个IP地址是A类、B类还是C类无关

子网掩码

子网掩码通常是由1…10…0组成,例如:

假设IP地址为 140.252.20.68(点分十进制)
子网掩码为 255.255.255.0
则IP地址与子网掩码按位与得到网络号 140.252.20.0
因此该子网的地址范围为140.252.20.0 ~ 140.252.20.255

这里要说明
IP地址中主机地址全为0表示网络号,该IP地址不用来表示主机
IP地址中主机地位全为1表示广播地址,也就是说给同一个链路中相互连接的主机发送数据包
127.*的IP地址用于本地环回(loop back)测试

  • 所以上述例子中子网内能表示的主机数为254个(140.252.20.1 ~ 140.252.20.254)

IP地址数量的限制

这里就有人要提问,既然IP地址是32位的,也就是43亿左右,世界上有这么多的网络和主机,甚至有的主机需要配备多个IP地址,那么一定有一天会把IP地址给用完,这时候就有三种方式来解决这个问题

  • 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的
  • NAT技术
  • IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址, 但是目前IPv6还没有普及

私有IP和公网IP

如果我们只想在某一个局部内进行通信,例如家庭局域网,那么理论上任何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(出口IP),另一个是LAN口IP(进口IP,或子网IP)
  • 路由器LAN口连接的主机都属于当前这个路由器的子网中
  • 不同的路由器的子网IP可能相同,但同一子网内的IP不能重复,但是子网之间的IP地址就可以重复了
  • 运营商通过级联不同的路由器,就可以实现对网络节点的管理,而最外层路由器的WAN口IP就是一个公网IP(连接全球网络)

路由

路由,实际上就是一种“问路”的过程,IP数据包在数据链路层中“一跳一跳”,也就是指从源MAC地址到目的MAC地址的帧传输区间

正因为路由过程中可能存在环路,在IP报头中8位生存时间就可以解决网络中出现游离报文重复占用网络资源的问题

在这里插入图片描述
IP数据包的传输过程也和问路一样.

  • 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器
  • 依次反复, 一直到达目标IP地址

至于这个数据包该发送到哪里,依靠的是每个节点内部维护的路由表
在Linux中通过route指令查找节点路由表
在这里插入图片描述

  • 路由表的Destination是目的网络地址
  • Genmask是子网掩码,
  • Gateway是下一跳地址
  • Iface是发送接口
  • Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发

例如如果要发送数据包的地址为192.168.56.3

  • 首先跟第一行的子网掩码运算,与第一行的地址不符
  • 然后跟第二行的子网掩码运算,与第二行地址相符,因此直接从eh1接口发出

假如要发送的数据包的地址为140.168.10.6

  • 跟路由表前几项的子网掩码运算,发现都不符合
  • 因此按照缺省路由(default),从eh0接口发出,发往192.168.10.1路由器
  • 由192.168.10.1路由器根据它的路由表决定下一跳的地址
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值