【Linux】网络--网络层--IP协议
个人主页~
网络--网络层--IP协议
- 一、基本概念
- 二、IP报头格式
- 三、网络划分
- 四、私有IP和公网IP
- 五、路由
- 路由表
- 六、与数据链路层之间的协议
一、基本概念
IP 协议是用于在互联网上进行数据传输的一种网络层协议,它为不同网络中的设备提供了一种统一的方式来交换数据,IP 协议定义了数据包的格式以及数据包在网络中的传输规则,使得各种不同类型的网络能够相互连接并进行通信,是TCP/UDP传输的基础
二、IP报头格式
- 版本:指定IP协议的版本,对于IPv4来说就是4
- 首部长度:这里长度的单位是4字节,也就是最大支持60个字节的头部长度
- 服务类型:共八位,其中三位已弃用,一位保留字段,其必须置为0,所以可供修改的只有四位TOS字段,分别表示最小延时、最大吞吐量、最高可靠性、最小成本,这四个相互冲突,只能开启一个
- 总长度:IP数据报整体占多少个字节
- 标识:主机发送报文的唯一标识,如果IP报文在数据链路层被分片了(有关分片的概念,在后面详述),那么每个片里面的标识id都是相同的
- 标志:第一位保留,第二位为1表示禁止分片,此时如果超过了数据链路层能传输的最大传输单元,超过的数据将会被扔掉,第三位表示分片后的身子或者尾巴,为0则表示是身子,后面还有数据,为1则说明该片时最后一片,后面没有数据了
- 片偏移:是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置,实际偏移字节数是这个值*8得到的,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了
- 生存时间:数据报到达目的地的最大报文跳数,一般为64,这里的报文跳数指的是报文到的路由器次数,如果超过这个数字报文就自动丢弃了
- 协议:表示上层协议的类型
- 头部校验和:鉴别头部是否损坏
- 源地址和目标地址:发送端和接收端
- 选项:不定长,最多40字节
三、网络划分
-
IP地址分为两个部分:网络号和主机号,网络号可以保证互相连接的两个网段具有不同的标识,主机号可以保证同一网段内的主机可以有不同的标志
-
子网的划分就是根据网络号相同的原理,网络号相同的主机放到一起就组成了子网,也就是局域网,但子网中主机通过主机号区分彼此
-
过去曾经提过一种划分网络号和主机号的方案,将所有的IP地址分为五类:
- 随着互联网的发展,这种划分方案的局限性就显现出来了,由于B类网络地址对于网络号和主机号的分配机制比较优秀,所以大多数的组织都申请B类网络地址,导致B类地址快要消耗殆尽,而A类型的地址又被大量浪费(一个实际的网络架构中,一个子网下的主机数是没有
2^24
那么多的,并且它的子网只能有2^7
个,所以A类地址的分配机制比较差劲,相比之下,B类地址更加符合实际)
- 随着互联网的发展,这种划分方案的局限性就显现出来了,由于B类网络地址对于网络号和主机号的分配机制比较优秀,所以大多数的组织都申请B类网络地址,导致B类地址快要消耗殆尽,而A类型的地址又被大量浪费(一个实际的网络架构中,一个子网下的主机数是没有
-
当前我们使用的是CIDR方案,它引入了一个额外的子网掩码来区分网络号和主机号,子网掩码也是一个32位的无符号整数,通常用一串0来结尾,
网络号 = IP地址 & 子网掩码
,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关-
下面是转换例子,自己转换成二进制来检验
IP地址 子网掩码 网络号 子网地址范围 140.252.20.68 255.255.255.0 140.252.20.0 140.252.20.0~140.252.20.255 140.252.20.68 255.255.255.240 140.252.20.64 140.252.20.64~140.252.20.79 -
IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围,其中确定某个主机有个简便方法,比如说第一个例子,就可以写成
140.252.20.68/24
,其中/
前面表示IP地址,/
后面表示子网掩码的高24位为1,也就是255.255.255.0
-
-
子网掩码的不同,本质上反映了IP地址的网络边界划分逻辑不同,对于村里来说,我们的子网掩码就可以把后面这一串0的数量变少一些,让主机号数量维持在一个较低的位置,对于镇上来说,我们的子网掩码就可以把后面这一串0的数量变多一些,因为镇上的人口明显要比村里的人口要多,让主机号数量维持在一个较高的位置
-
IP地址还有几种特殊情况:
- IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
- IP地址中的主机地址全部设为1,就成了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
127.0.0.1
,用于本地环回测试,这个本地环回的作用就是原本应该通过数据链路层发送出去的数据再通过数据链路层流回来,用于测试本端是否协议是否正常工作
-
需要值得注意的是,CIDR虽然在一定程度上缓解了IP地址浪费的问题,但在根本上,IPv4最多只能入网
2^32
台设备,这个数字可能听起来很大,但是在今天,我们入网的设备量已经快要接近这个数字了,我们有三种解决方式- 动态分配IP地址:只给接入网络的设备分配IP地址,所以同一个MAC地址的设备,每次接入互联网中,得到的IP地址一般不相同
- NAT技术:下面详解
- IPv6:与IPv4是两种截然不同的IP协议,最多可以入网
2^128
台设备,我国是世界上IPv6技术最好的国家,这是一种战略部署
四、私有IP和公网IP
- 互联网标准文档RFC1918中,规定了用于组建局域网的IP地址
10.*
:前8位是网络号,共2^24
个地址172.16.*
~172.31.*
:前12位是网络号,共2^20
个地址192.168.*
:前16位是网络号,共2^16
个地址- 在以上范围内的都是私有IP,其他所有的都是公网IP
- 一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP)
- 路由器LAN口连接的主机,都从属于当前这个路由器的子网中
- 不同的路由器,子网IP其实都是一样的,同一子网内的主机IP地址不能重复,但是子网间的IP地址可以重复
- 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(从子网IP替换成WAN口IP),这样逐级替换,最终将数据包中的IP地址成为一个公网IP,这种技术就是NAT
下图是一个详细解析图,这里我们可以把路由器看做对内对外有两个身份的人,对外就是WAN口IP,对内就是子网IP,我们一点一点的来解析,简单了解一下
- 对广域网来说:运营商路由器就是私有节点,它的IP地址就是WAN口IP
- 对运营商路由器来说:它是广域网的私有节点,同时也与家庭路由器的组成一个新的网络:子网,对外(广域网),它的IP是WAN口IP,对内(家庭路由器),它的IP是子网IP
- 对于家庭路由器来说:它是子网的私有节点,对于子网而言,它的IP地址是WAN口IP,对于连接到它的主机而言,它的IP地址是子网IP
- 对于主机来说:确定的私有IP
- 整个是一个家庭私网(成员为主机)→运营商私网(成员为家庭)→公网(成员为运营商)的层级结构
五、路由
还是这张图为例子,我们在进行主机访问服务器时,主机发送数据,将报文推送到家庭路由器中,此时家庭路由器会先查看目的IP,由路由器决定这个数据包是可以直接发送到目标主机(局域网内主机间通信)还是要发送给下一个路由器(跨局域网通信),家庭路由器将报文报头中的源IP地址换成自己的WAN口IP然后继续向运营商路由器推送,运行商路由器也会将报文报头中的源IP地址莞城自己的WAN口IP,此时运行商路由器将信息推送到广域网上,然后在广域网上找到目标IP地址,也就是服务器,将信息推送到服务器中
路由表
在前面所说的过程中,在路由器中所做的行为包括查看目的IP,修改报头,然后推送至下一级,其中查看目的IP和推送至下一级的行为依赖路由器中的一种数据结构:路由表,如下图所示就是一个路由表,其中从左到右依次是
- Destination:目标网络或主机的 IP 地址,标识数据包的目标地址范围
- Gateway:下一跳网关的 IP 地址,即数据包转发的下一个设备地址,若显示 *,表示目标网络直连,无需经过额外网关
- Genmask:子网掩码
- Flags:路由标志位
- U:路由器可用
- G:使用网关
- H:目标是主机
- Metric:路由度量值,代表路径开销(如跳数、带宽损耗),用于路由协议计算最优路径,值越小优先级越高
- Ref:路由引用计数,记录当前路由被其他功能引用的次数
- Use:路由条目被使用的统计次数,反映该路由处理的数据包流量情况
- Iface:数据包发送的物理或逻辑接口(如 eth0 网卡、lo 回环接口),指明从设备的哪个接口转发数据包
- 查看目的IP需要做的就是判断一下这个等式成不成立:
目的IP & Genmask == Destination
- 若成立,且该条目包含下一跳路由器的 IP 地址或者本地路由器的出站接口等转发信息(Iface),路由器就依据该条目将数据包从指定的出接口转发到下一跳设备
- 若不成立,继续向下查表,然后同样进行上述判断
- 最终如果都不成立,那么就会到default默认路由,从这里出去
六、与数据链路层之间的协议
我们在上面提到过IP报文中,有一部分是关于分片的,这个分片的由来就是数据链路层的限制,数据链路层一次发送的报文长度是有限度的,所以只能拆解开来,这个拆解开来的过程就叫做分片
- 假设我们要发送一个长度为3000的报文,分片最大长度为1500,则先取前1500,然后复制前1500的报头,修改后放到后1500的前面,假设这个报头的长度是20,则加上这个报头我们再取1500,也就是剩下1500里取1480,之后再复制报头,修改后放到最后20的前面,剩下最后一片的长度为40
- 这里的修改指的是有关分片内容的修改,也就是标识、标志和片偏移,其他内容都不变
- 通过标识、标志和片偏移,我们可以清楚得知某个报文是否是分片后的内容,并且知道某一片是这个报文的第几片,这样我们在对方主机接收到报文后,按照顺序将报头拆解然后再将数据组装起来
- IP中任何一个分片丢失,都要重新发送,所以我们不建议分片
今日分享就到这里了~