网络层IP

目录

基本概念

协议头格式

网段划分

特殊的IP地址

私有IP地址和公网IP地址

路由

IP的分片与组装


基本概念

在正式谈IP协议之前,我们先明确以下几个概念:

主机:配有IP地址,也要进行路由控制的设备。

路由器:即配有IP地址,又能进行路由控制。

节点:主机和路由器的统称。

一般在网络中,习惯将两端叫主机,路上叫节点。如下所示:

数据从一台主机到另外一台主机,要经过多个节点,而相邻的节点要在同一个子网中才能进行转发,中间要经过无数个子网转发。因此,广域网的通信,实际上是由无数个子网转发来实现跨网络的通信。

目的IP是具有指向性的,主机是根据报文中的目的IP,进行路由选择的。IP地址是有固定构成的,IP地址=目标网络+目标主机。IP给协议组提供了一种能力,可以将数据包从主机A跨网络,经过路径选择,路由转发,送到主机B的能力。

协议头格式

IP协议报头如下图所示:

4未首部长度和TCP一样,代表报头的长度,范围为20-60个字节;16位总长度代表IP的总长度,通过这两个就可以实现IP报头和有效载荷的分离。8位协议记录了数据部分为UDP还是TCP。

4位版本号为指定IP协议的版本,对于IPv4来说,就是4。

8位服务类型(TOS),3位代表优先字段(已弃用),4为TOS字段和1位保留字段(设置为0),4位TOS分别表示:最小延时、最大吞吐量、最高可靠性和最小成本,这四种相互冲突,只能选择一个。

16位头部校验用于鉴别头部是否损坏。

8为生存时间TTL表示数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL-=1,如果一直减到0还没有到达,那么该报文就被丢弃了,这个字段主要是用来防止出现路由循环。

网段划分

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

这里的划分,不是划分IP地址,而是划分网段,一旦得到一个A类地址,相当于得到了个地址。

但这种分类方式也会存在缺陷,比如申请到了A类网络地址,但是网络中的主机数远远达不到那么多,那么就会造成网络资源的浪费。

为了解决这种问题,提出了一种新的方案CIDR(无类别域间路由)。它的主要思想如下:

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。

子网掩码也是一个32位的正整数,通常用一串"0"来结尾,子网掩码会被设置到路由器中。

将IP地址和子网掩码进行"按位与"操作,得到的结果就是网络号。

网络号和主机号的划分与这个IP地址就是A类、B类还是C类无关。

以下为一个例子:

IP地址: 140.252.20.68 -> 10001100 11111100 00010100 01000100

子网掩码: 255.255.255.0 -> 111111111 11111111 111111111 00000000

---------------------------------------------------------------- 按位与

网络号: 140.252.20.0 <- 10001100 11111100 00010100 00000000

子网地址范围:140.252.20.0 - 140.252.20.252

一般主机号为0代表网络地址,不能分配给某一台主机,主机号为全1代表广播地址,也不能分配给某一台主机。

IP和子网掩码还有一种更简洁的表示方法,例如上面IP地址为140.252.20.68,子网掩码为255.255.255.0,可以表示为140.252.20.68/24,24表示子网掩码中1的位数。

特殊的IP地址

将IP地址中的主机地址全部设为0,就成了网络号,代表这个局域网。

将IP地址中的主机地址全部设为1,就成了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。

127.*的IP地址用于本机回环(loop back)测试,通常是127.0.0.1。

私有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地址就可以重复了,也就是私有IP地址是可以重复的,由于这个原因,IP地址不足的问题也被大大缓解了。

当数据从内网到公网的过程中,途径路由都会将源地址替换为自己的WAN口IP,到达公网后就不做替换了,这样做的目的是为了方便后续做回复。这种从内网到公网中进行源IP地址替换的技术,称为NAT技术

所有用户,都不可能直接连接公司,都是通过先连接到局域网中,再通过局域网入的。

路由

在报文从源主机到目的主机转发的过程,需要经过很多路由,路由的过程,是一跳一跳"问路"的过程,所谓"一跳",就是数据链路层中的某一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间,如下图所示:

子网掩码是设置在路由器内部的,子网划分是通过路由器完成的。

IP的分片与组装

在网络层,还有一个重要的部分,就是要对来自传输层的报文进行分片与组装。这里以分片为例子。

接收方在收到大量报文的时候,首先要识别出来报文是否被分片了,若报文被分片了,就要保证将分片聚合在一起,这里就涉及到哪里是开头,哪里是结尾、丢片问题以及组装过程,这些问题就和IP协议中的16位标识、3位标志和13位片偏移有关。

IP分片之后的每一个分片也会带报头,16位标识代表唯一的标识主机发送的报文,如果IP报文被分片了,那么每一个片里面的这个id都是相同的。

3位标志,第一位保留暂时不用,第二位为1表示禁止分片,这时候如果报文长度超过最大长度,IP模块就会丢弃该报文,第三位表示"更多分片",如果分片了的话,最后一个分片位置为0,其它是1,类似于一个结束标记。

13位片偏移代表分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置,实际偏移的字节数是这个值乘以8得到的,这样设置的目的是为了解决13位片偏移无法保存16位总长度的问题,写入时为实际片偏移大小除以8,片偏移表示本片数据在它所属的原始数据报数据区中的偏移量。

若报文没被分片,更多分片为0并且片偏移也为0;当更多分片不为0或者片偏移不为0时,那么该报文一定被分片了。

如果被分片了,组装过程首先先通过16位表示将分片聚合在一起,开头的片偏移为0,结尾的更多分片为0,通过这两个就可以将头和尾找到,中间部分的片偏移计算公式如下:

当前分片偏移 + 自己的长度 = 下一片的片偏移

通过以上公式,将所有的分片收到后,然后进行升序排序即可,如果整个过程顺利做完了就说明没有出现丢包问题,就完成了组装过程。

相关推荐
芯智工坊6 小时前
第19章 Mosquitto完整项目实战
网络·人工智能·mqtt·开源
灰子学技术7 小时前
Envoy 底层 TCP 交互、UDS 和事件驱动技术文档
网络·网络协议·tcp/ip
wifi chicken7 小时前
wifi漫游(Roaming)802.11kvr 全协议梳理
网络·wifi·内核开发·wifi 漫游
MAXrxc8 小时前
VRRP初体验
网络
qq_260241238 小时前
将盾CDN:移动网络环境下的安全接入技术
网络·安全
试试勇气9 小时前
C++实现json-rpc框架
网络协议·rpc·json
咖喱o9 小时前
策略路由
网络
Deitymoon9 小时前
linux——TCP服务器获取客户端IP地址
linux·服务器·tcp/ip
CDN3609 小时前
高防服务器磁盘 / CPU 爆满?攻击引流与资源扩容实战
运维·服务器·网络协议