文章目录
- 路由
- NAT技术
- 分片与组装
- 分片的组装
- IP协议分片的短板
路由
通常情况路由器具备了一个非常重要的功能,即构建子网;
同时路由器需要实现跨网络通信,说明路由器必须存在两个或以上的IP地址,通常在路由器中可以看到几个接口,分别是一个WAN
口和几个LAN
口;
WAN
口IP被称为公网IP,LAN
口IP被称为私网IP;
其中WAN
口对应的IP地址是作为上一层子网,如运营商子网中的其中一个子网IP,而通常一个LAN
口则代表一个子网,对于LAN
口IP而言,该IP将作为该子网中的第一台设备IP;
或者在一些情况下,多个LAN
口可以共享同一个子网;
通常路由器在自己作为子网的第一台设备时对应的LAN
口IP将作为该子网的网关IP,即子网内所有设备访问其他网络时的第一道"门";
而路由的过程实际上就是以一跳一跳(Hop by Hop)的方式,在复杂的网络结构中找出一条通往终点的路线;
所谓"一跳"就是数据链路层中的一个区间,具体在以太网中指源MAC地址到目的MAC地址之间的帧传输区间;
在网络中的主机中,无论是电脑还是路由器设备,都有路由功能,同时也都内置了一个路由表;
其中路由表的字段如下:
-
Destination
表示网络或主机的目标地址;
路由器查看数据包的目的IP地址并与路由表中的
Destination
字段进行匹配以决定数据包应当发送到哪里;这个字段可以是特定的网络地址或主机地址,或是以标示默认路由的
0.0.0.0
(代表任何地址)或是default
; -
Geteway
表示下一跳(Next hop)的IP地址;
在某些配置中,当目标网络是直接连接的,网关字段可能显示
geteway
或是IP0.0.0.0
,代表数据包直接通过制定接口发出而不需要通过中间网关;这是路由器发送数据包到下一个网络所应通过的设备或接口的IP地址;
如果目标是直接连接的,那么它可以是路由器自己的接口IP地址;
-
Genmask
(子网掩码)子网掩码定义了
Destination
字段中网络的范围,确定了哪些IP地址属于同一个网络;例如
255.255.255.0
表示该网络中有256个IP地址(/24
),所有以相同前三个八位组开始的IP地址属于这个网络; -
Flags
(标志)U
表示接口是活跃的;G
表示数据包需要通过另一个路由器(网关)来到达目的地;H
表示条目是针对特定主机而不是网络的;D
表示通过路由协议动态学习到的条目;M
表示被修改的路由条目,特别是在重新计算路由表时;!
表示拒绝路由到特定地址或网络; -
Metric
(度量)表示到达目标网络的成本或举例,可以基于跳数(hop count),宽带,延迟等因素;
较低的度量值通常表示更优的路径;
在选择到某个目的地的路由时,路由器会选择度量值最低的路径;
-
Ref
(引用)这个字段通常表示当前活跃连接或进程数目引用了这条路由;
很少被直接显示,但如果有,它可以视为一种诊断工具;
-
Use
(使用)指示通过这条路由路径传输的数据包数量;
这是一个统计数据,表示使用该路由的频率;
-
Iface
(接口)指示这条路由使用的出口接口,即数据包将通过哪个物理或逻辑接口发送出去;
通常是一个网络接口名,如
eth0
,wlan0
,Interface 1
等;
在Windows中可以在命令行中通过route print
命令查看对应的路由表;
在Linux中可以使用route
命令来查看路由表;
当一个数据包到来时,主机会对数据包进行解包并查看IP报头中的目的IP地址,并通过目的IP地址与Genmask
子网掩码进行&
按位与操作,通过按位与后的结果与该行条目中的Destination
字段进行匹配,如果结果与该字段不匹配则继续计算下一行条目,若是匹配则将该报文重新封装并向Destination
所指向的IP进行下一跳;
如果路由表中所有的Destination
字段都不匹配则通过0.0.0.0
或是default
以默认网关进行下一跳;
通过这种跳一跳的方式将一个IP数据包由源IP发送到目标IP;
NAT技术
网络地址转换(Network Address Translation,NAT)是一种用于在网络中重写源IP地址或目的IP地址的技术,通常在网络边缘设备如路由器上进行实现;
最初设计用于缓解IPv4地址耗尽的问题;
在使用NAT技术时IP报文报头中的源IP地址与目的IP地址将会在到达一个路由器时进行重写;
以该图为例;
当路由器同时充当为NAT设备时将会对IP报文的报头内的源IP和目的IP进行更改;
通常分为两种情况:
- 报文的发送
- 报文的回程
路由器启用NAT功能时,对应的NAT功能都将生成一个属于自己的表,即NAT表或是连接表;
通常报文的发送时报文每经过一个路由器上的NAT功能时路由器将会将IP报文中的源IP修改为该路由器的公网IP,并记录源私网IP和新公网IP和端口的映射关系;
NAT表的记录主要是方便对端在进行报文返程的时候可以通过NAT表中的映射关系使得报文能够正确返回源发送端;
当报文进行返程时进入第一个路由器的NAT功能时将查询NAT表中的映射关系并将目的IP修改为改路由器对应的私网IP,最终将报文交回原发送端;
分片与组装
在网络协议栈中,在网络层中的数据,如IP数据包并不是直接通过网络层发出,而是一样的贯穿协议栈将数据包交给下一层协议,这一层即为数据链路层;
而通常情况下,数据链路层所发生的数据帧不能太大,如果数据帧太大则可能会加重数据在网络中的存活时间从而与网络中的其他数据产生碰撞;
当网络健康状态差的时候,数据链路层将进行一些碰撞避免相关的策略从而减少数据碰撞的发生;
由此看出,数据帧只要过大都会直接或者间接影响到网络的健康状态;
所以为了避免这些问题的发生,通常由网络层交付给数据链路层的数据报都不能太大;
当网络层IP协议将要把一个较大的IP报文交付给下层时,IP需要对该报文进行分片操作;
- “谁分片,谁组装”
分片操作由IP协议提供,对应的组装操作也将是由IP协议提供,即网络层;
在IP报文的内容中存在几个对应的字段用于分片与组装操作;
-
16
位标识这个标识通常用来标示不同的IP报文;
通常情况下每个IP数据包的
16
位标识是不同的,但相同IP数据包的几个不同分片其对应的该字段是相同的;同一个IP数据包的不同分片在抵达对端后需要对IP数据包的分片进行组装;
但组装的前提是将几个分片进行聚拢,通过相同的该字段可以使得同一个IP数据包的不同分片能够聚在一起从而进行下一步的组装;
-
3
位标志这个标志包含以下几个子字段:
-
第一位
第一位通常是未使用的,暂未赋予该字段的意义;
-
第二位
DF
(Don’t Fragment) - 不分片标志;如果这个位被设置为
1
则路由器不能分片这个数据包,如果数据包的大小超过了某个链路的MTU
(最大传输单元),这个数据包将会被丢弃,并返回一个ICMP错误消息给发送方; -
第三位
MF
(More Fragments) - 更多分片标志;当一个IP数据包被分片后,除了最后一个分片外,所有分片的这个位置都会被设置为
1
,表示还有其他分片,以及该分片并不是最后一个分片;最后一个分片的该字段将被设为
0
,表示这是最后一个片段;
-
-
13
位片偏移这个字段是
13
位长度的,表示当前分片在原始数据包中的相对位置;具体来说,它表示该分片相对于原始数据包开始处的字节偏移,以
8byte
位单位(即偏移量 = 片偏移字段*8
);这种设计是因为IP分片的大小必须是
8byte
的整数倍,所以此偏移量可以更节省空间的表示出整个数据包中的字节位置;
假设IP需要发送4500 byte
大小的数据,但由于该数据超过了数据链路层限制的大小,对应的IP协议需要对该数据包进行分片;
对应的分片结构如下:
以该图为例,在进行分片时,IP数据包的第一个分片将保留IP报头进行分片,对应的第一个分片的三位标志为001
表示这个数据包可以被分片,且该分片并不是最后一个分片,片偏移为0
表示该分片为数据包分片中的第一个分片;
其次后续的分片需要为分片后的数据增加报头,所以在进行分片时需要保留对应的报头大小;
因为在数据链路层中不关心上层的数据与报头的分隔,数据链路层协议将会把上层所发的所有内容,无论报头报文都当做自己的有效载荷进行封装;
最后一个分片的三位标志为000
,且片偏移不为0
,因此该分片表示分片中的最后一个分片;
分片的组装
对端在接受到IP数据包的分片后需要对分片进行组装;
首先组装前需要判断所接收到的IP数据包是否为完整的数据包还是IP数据包中的分片;
通常需要判断这几个条件:
-
接收到的几个数据包
16
位标识字段是否一致若是接收方接收到了几个IP数据包所对应的
16
位标识字段相同,则判断该数据包可能为分片;并且将多个该字段相同的数据包聚集在一起存放;
-
3
位标志字段情况是否允许被分片以及是否有更多分片标识该字段用来判断所接收到的IP数据包是否是被允许分片的;
若是判断该字段为允许被分片则该IP数据包可能为分片中的其中一个;
同时若是该字段允许被分片且该字段的最后一个子字段被标识为
1
,则表示该IP数据包为分片中的其中一个; -
片偏移字段是否为
0
若是片偏移字段不为
0
则表示该IP数据包一定为分片中的其中一个;
这几个条件在组装过程中缺一不可;
通常需要判断四种情况:
-
不为分片
当接收方接收到的几个IP数据包中其
16
位标识字段是唯一,且该IP数据包的3
位标志中被设置了不可分片标识则表示该数据包不为分片;或者所接收到的IP数据包
16
位标识字段唯一且3
位标志位中更多分片字段设为0
,同时片偏移量也为0
同样表示该IP数据包不为分片; -
第一个分片
当所接收的IP数据包的
3
位标志中更多分片为1
,同时片偏移为0
时则表示该IP数据包为相同16
位标识字段IP数据包分片中的第一个分片; -
中间分片
当所接收到的IP数据包中的
3
位标志中更多分片被设置为1
且片偏移不为0
则表示该IP数据包为相同16
位标识字段IP数据包分片中的中间分片; -
最后一个分片
当所接收到的IP数据包中
3
位标志中更多分片被设置为0
,且片偏移不为0
则表示该IP数据包为相同16
位标识字段IP数据包分片中的最后一个分片;
在分片的聚合过后根据片偏移来对数据进行排序,随后去掉分片中的IP报头对数据进行组装;
IP协议分片的短板
通常情况下在网络协议栈中是不太支持IP协议对数据进行分片的;
主要的原因是IP协议若是对一个IP数据包进行分片后交由数据链路层进行传输,若是分片在传输过程中出现丢失问题则将要把该IP数据包的所有分片,即整个完整的IP数据包进行重新传输;
这样会延长数据在网络中的存活时间,对应的一个IP数据包的传输时间将变得更长,可能更加影响网络中其他主机的网络通信;
因此为了避免IP层因分片导致的各种问题,经常需要避免IP进行分片,为了避免IP分片,上层协议,如TCP协议才指定了一些列的策略,如流量控制,滑动窗口,慢启动等;