【Linux网络-网络层】TCP与IP的关系+IP协议基本概念+网段划分+路由+IP分片与组装
网络层
在复杂的网络环境中确定一个合适的路径
一、TCP与IP的关系
TCP(传输控制协议)和IP(互联网协议)是互联网协议栈中的两个核心协议,属于不同的层级,分别在传输层和网络层,共同实现数据的可靠传输和路由。
层级分工:
- IP协议:位于网络层,负责数据包的寻址和路由转发。IP协议根据每个数据包的目的IP地址,将其分发到网络中的合适路由节点。IP协议本身不保证数据传输的可靠性,仅提供“尽力而为”的服务,数据包可能丢失、乱序到达或出现延迟。
- TCP协议:位于传输层,基于IP提供的数据传输功能进一步实现了可靠的数据传输控制。TCP协议通过序列号、确认机制和重传机制确保数据按顺序、无丢失地传送到目的地。同时,TCP协议还实现了流量控制和拥塞控制,优化网络的传输效率和稳定性。
依赖关系:
- TCP协议依赖于IP协议提供的路由和寻址功能,构建起端到端的传输路径。具体来说,TCP协议将应用层数据打包成报文段,并在每个报文段上附加TCP头部信息。随后,TCP报文段被传递给IP层,IP层将其进一步封装为IP数据包并添加IP头,完成目的地的路由转发。
封装与解封装:
- 在数据发送端,应用层数据通过TCP协议封装成报文段,TCP报文段再由IP协议封装成数据包,最终经过网络层、链路层逐层传送到接收端。
- 在接收端,数据包按照相反顺序逐层解封装,IP层提取出TCP报文段并传递给传输层,TCP协议通过确认机制、序列号等检查数据完整性并按序组装,最终传递给应用层。
整体作用:
- TCP与IP的协同工作,实现了可靠的数据传输。IP提供路由转发,TCP确保数据可靠性。
二、IP协议基本概念
IP协议(Internet Protocol,互联网协议)是互联网协议栈中的核心协议之一,位于网络层,主要用于在计算机网络中进行数据包的寻址和路由转发。IP协议为数据通信提供了唯一的标识和传输路径,但并不保证数据的传输质量。
- 主机:配有 IP 地址,但是不进行路由控制的设备。
- 路由器:即配有 IP 地址,又能进行路由控制。
- 节点:主机和路由器的统称。
IP地址一般包含网络部分和主机部分。网络部分用于标识目标网络,路由器利用该信息进行转发;主机部分标识网络内的具体设备,在数据包到达目标网络后用于最终定位到具体的目标主机。
IP协议格式
- 4 位版本号(version):指定 IP 协议的版本(IPv4/IPv6),对于 IPv4 来说,就是 4。
- 4 位头部长度(header length):表示 IP 报头的长度,以 4 字节为单位。IP 头部的长度是多少个 32 bit,也就是 length * 4 的字节数。4bit 表示最大的数字是 15,因此 IP 头部最大长度是 60 字节。
- 8 位服务类型(Type Of Service):找到最优路径。3 位优先权字段(已经弃用),4 位 TOS 字段,和 1 位保留字段(必须置为0)。4位 TOS 分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突只能选择一个,对于 ssh/telnet 这样的应用程序,最小延时比较重要。对于 ftp 这样的程序,最大吞吐量比较重要。
- 16 位总长度(total length):IP 报文(IP 报头 + 有效载荷)的总长度,IP 数据报整体占多少个字节,用于将各个IP报文进行分离。
- 16 位标识(id):唯一标识数据报的标识符,主要用于分片的数据报。当IP数据报被分片时,每一片都会带有相同的标识值,以便接收端重新组装。
- 3 位标志字段:第一位保留(保留的意思是暂时没有规定该字段的意义)。第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文。第三位表示 “更多分片”,如果报文没有进行分片,则该字段设置为 0,如果报文进行了分片,则除了最后一个分片报文设置为 0 以外,其余分片报文均设置为 1,类似于一个结束标记。
- 13 位分片偏移(framegament offset):分片相对于原始 IP 报文开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值 *8 得到的。因此, 除了最后一个报文之外,其他报文的长度必须是 8 的整数倍,否则报文就不连续了。
- 8 位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是 64。每次经过一个路由,TTL -= 1,一直减到 0 还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
要是用来防止出现路由循环
- 8 位协议:表示上层协议的类型。
- 16 位头部校验和:使用 CRC 进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
- 32 位源地址和 32 位目标地址:表示发送端和接收端所对应的 IP 地址。
- 选项字段:不定长,最多 40 字节。
源IP,源端口,目的IP,目的端口,协议号,五元组标识一个网络通信
【问题一】:如何将报头与有效载荷进行分离?(解包)
这和TCP中是一样的,首先读取前20个字节,然后读取四位首部长度,4位首部长度的基本单位是4字节,也就能够表示[0, 60]的范围,实际表示范围为[20,60];如果读取长度n>20,那就n-20剩下都是选项的长度,否则剩下的就是有效载荷
有效载荷 = 16位总长度 - 4位首部长度*4
【问题二】如何进行向上交付(分用)
IP协议通过协议字段(8位)来识别上层协议的类型,比如TCP(协议号6)或UDP(协议号17),在分离出有效载荷后,IP层根据协议字段,将有效载荷向上交付给相应的上层协议(即分用过程)。
8位生存时间
在IP协议中,生存时间(TTL,Time to Live)是一个8位字段,其作用是防止数据包在网络中无限循环,从而避免网络资源的浪费。TTL的具体工作机制如下:
TTL的定义与作用
- TTL字段是IP报头中的一个8位字段,因此TTL的值范围为0到255。
- TTL表示数据包在网络中可以经过的最大跳数(即路由器数量)。每当数据包经过一个路由器,该字段的值就减1。
- 当TTL的值减为0时,路由器会丢弃该数据包,并向源主机发送一个ICMP报文,通知其数据包未能到达目的地。
TTL的工作机制
- 在数据包从源主机发出时,源主机会为TTL字段赋一个初始值(通常是64、128或255,具体取决于操作系统和网络配置)。
- 数据包在传输过程中,每经过一个路由器,路由器会将TTL值减1,然后将数据包继续向下一个路由器转发。
- 如果数据包在到达目的地之前TTL减为0,当前路由器会丢弃该数据包,以防止它在网络中无限循环。
TTL的使用场景
- 防止循环:在动态路由协议环境中,TTL字段可以防止数据包因路由循环而导致网络拥塞。
- 路径跟踪:TTL的变化用于网络路径追踪工具(如
traceroute
),通过发送不同TTL值的探测数据包,记录经过的每一跳路由器,形成一条路径信息,帮助用户了解数据包到达目的地所经过的路径。示例流程
- 假设一个IP数据包的TTL初始值为64:
- 数据包发送到第一个路由器,TTL值减为63。
- 数据包经过第二个路由器,TTL值减为62。
- ……如此重复,直至数据包到达目的地,或在中途TTL减为0,导致数据包被丢弃。
总结
- TTL字段的8位表示最大跳数255,是为了限制数据包在网络中存活的时间,避免可能的无限循环。
- TTL机制在保证网络资源合理使用、故障诊断和路径跟踪方面发挥了重要作用。
三、网段划分
1.为什么要进行网段划分
IP是有用且有限的资源,经过合理划分,来给不同的区域、国家、组织、学校等;
我们的网络世界,是被各个国家的运营商设计过的,从硬件到软件
经过精心的设计,合理的划分,可以高效支持未来的报文路径查找,大大提高查找目标主机的效率
【举例】我们在学校内,每个学生都有自己的学号,每个学号都是有规律的;学号前几位代表院号,后几位是自己的编号,这样我们就可以通过学号知道你在是哪个学院的,以及你是谁
现在每个学院都有一个负责人,他也有自己的学号;每个学院的负责人又建立一个群方便各个学院之间的交流。现在张三捡到一张学生证,张三一看学号,张三不知道学生证是谁的,但是张三通过学号前几位能辨识这个学生证不是自己的院的(因为院号与自己不相同)于是张三把学生证交给学院负责人,负责人拿到学号后就知道这是哪个学院的了,因为学院负责人清楚的知道每个学院的院号,于是把学生证交给了对应学院的负责人,对应学院的负责人把学生证交到失者手上
这里张三就叫做源主机,丢失者就是目标主机,负责人们就是路由器,同一个院内的人组成局域网,负责人的群叫做公网
每个同学的学号就是IP地址,每个院内IP地址前面部分相同
类比到计算机中:互联网中的每一个主机都隶属于一个子网, 以方便定位到具体主机,提高查找效率。
2.两种网段划分的方式
IP地址分为两个部分,网络号和主机号
网络号:保证相互连接的两个网段具有不同的标识。
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
- 不同的子网其实就是把网络号相同的主机放到一起。
- 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。
通过合理设置主机号和网络号就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同。
那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情
3.DHCP技术
一般的路由器都带有 DHCP 功能.因此路由器也可以看做一个 DHCP 服务器.
手动管理子网内的 IP 地址既繁琐又容易出错,尤其在设备数量较多或频繁更换的场景中。这种情况下,DHCP(动态主机配置协议)技术显得尤为重要。DHCP 服务器会自动检测子网内的新设备并分配适当的 IP 地址,既减轻了网络管理员的工作负担,也减少了 IP 地址冲突和分配错误的风险。
一般情况下,家庭或小型企业的路由器内置 DHCP 功能,可以充当简单的 DHCP 服务器。路由器通过以下过程实现 IP 的自动分配:
地址池设定:管理员在路由器中设定一个 IP 地址范围,DHCP 服务器会从这个地址池中挑选未使用的 IP 地址进行分配。
地址租约:DHCP 会为每个设备分配一个租约期,租约到期后设备可以请求更新 IP 或继续使用当前地址。
其他网络参数分配:除了 IP 地址,DHCP 还可以向设备分配网关、子网掩码和 DNS 服务器等网络参数,以确保设备能够顺利访问子网或外部网络。
通过 DHCP 的自动分配机制,大量减少了手动管理的麻烦,同时提升了网络资源的利用率和可维护性。
过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示
当要判断一个IP地址属于哪一类的时候,只需要遍历IP地址前5个比特位,第几个比特位先出现0值,那么这个IP地址对应就属于A、B、C、D、E地址
然而随着Internet的飞速发展,这种划分方式的局限性很快就显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址
- 例如,申请了一个B类地址,理论上一个子网内允许6万5千多个主机,A类地址的子网内主机数更多
- 然而实际网络假设中,不会存在一个子网内有这么多的情况,因此大量的IP地址都被浪费掉了
针对这种情况,提出了新的划分方案,称为CIDR(Classless Interdomain Routing)
CIDR 采用了无类别的地址划分方法,用一种“IP地址/前缀长度”的格式来表示网络。例如,192.168.1.0/24
表示一个网络,其中 192.168.1.0
是网络地址,而 /24
表示网络前缀长度,即子网掩码中的前24位为“1”。CIDR 的这种表示方式相比于传统的分类方法更灵活,可以根据实际需求进行精确的地址划分。
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号
- 子网掩码也是一个32位的正整数,通常用一串“0”来结尾
- 将IP地址和子网掩码进行“按位与”操作,得到的结果就是网络号
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
其中目标网络和子网掩码是路由器内置好的
通过灵活的子网划分,CIDR 能够根据需要分配不同大小的IP地址块,避免了分类地址分配中资源浪费的问题。例如,传统的 Class C 网络只能容纳254台主机,而CIDR则可以通过设定不同的前缀长度来容纳更多或更少的主机数。
可见,IP地址与子网掩码做按位与可以得到网络号,主机号从全0到全1就是子网的地址范围
4.特殊的IP地址
- 将 IP 地址中的主机地址全部设为 0,就成为了网络号,代表这个局域网。
- 将 IP 地址中的主机地址全部设为 1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
- 127.* 的 IP 地址用于本机环回测试,通常是 127.0.0.1。
5.IP地址数量限制
我们知道,IP地址(IPv4)是一个4字节32位的正整数.那么一共只有2的32次方个IP地址,大概是43亿左右.而TCP/IP 协议规定,每个主机都需要有一个IP地址.
这意味着,一共只有43亿台主机能接入网络么?
实际上,由于一些特殊的IP地址的存在,数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址.
CIDR 在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加),仍然不是很够用.这时候有三种方式来解决:
- 动态分配 IP 地址:只给接入网络的设备分配 IP 地址。因此同一个 MAC 地址的设备,每次接入互联网中,得到的 IP 地址不一定是相同的。
- NAT 技术:能够让不同局域网当中同时存在两个相同的 IP 地址(私有 IP 和公网 IP 做转换),NAT 技术不仅能解决 IP 地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
- IPv6:IPv6 用 16 字节 128 位来表示一个 IP 地址,能够大大缓解 IP 地址不足的问题。但 IPv6 并不是 IPv4 的简单升级版,它们是互不相干的两个协议,彼此并不兼容,因此目前 IPv6 还没有普及。
6.私有IP地址和公网IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC1918规定了用于组建局域网的私有IP地址
- 10.*,前 8 位是网络号,共 16777216 个地址
- 172.16. 到 172.31.,前 12 位是网络号,共 1048576 个地址
- 192.168.*,前 16 位是网络号,共 65536 个地址。
包括在这个范围中,都成为私有IP,其余的则称为全局IP(或公网IP)
其中私有IP不能出现在公网中,私有IP地址可以在不同的私网中,进行重复;这样就解决了IP不足的问题
虽然存在公网,但是我们上网,都必须先接入指定的一个内网中,我们所有人都在各自的内网中
可以通过ifconfig
来查看我们这台机器的私网IP,可以发现我们的私网就在规定内
7.LAN口IP 与 WAN 口IP
在网络设备(如路由器)中,LAN口IP和WAN口IP指的是局域网和广域网的两个不同接口的IP地址。
LAN口IP(局域网口IP)
- 作用:LAN口IP是路由器在局域网(Local Area Network)内的地址。它用来和同一局域网内的设备进行通信。
- 用途:局域网中的所有设备(例如电脑、手机)通过该IP地址访问路由器,并通过路由器访问外网。
- 常见设置:通常使用私有IP地址(如192.168.x.x、10.x.x.x),由用户或网络管理员手动设置。
WAN口IP(广域网口IP)
- 作用:WAN口IP是路由器连接到广域网(Wide Area Network,如互联网)时的地址,用于和互联网其他设备通信。
- 用途:WAN口IP使得路由器能够连接到外部网络,从而允许局域网中的设备访问互联网。
- 类型:通常由互联网服务提供商(ISP)分配,可能是静态(固定)或动态(变化的)公网IP。
- 路由器天然的会构建局域网(子网)
- 不同的路由器,子网 IP 其实都是一样的(通常都是 192.168.1.1),子网内的主机 IP 地址不能重复,但是子网之间的 IP 地址就可以重复了。
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN 口 IP 就是一个公网 IP 了。
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网 IP 的服务器上。这样的服务器可以在阿里云/腾讯云上进行购买。
8.数据包的转发流程(NAT技术)
在NAT(网络地址转换)技术的支持下,数据包的转发过程主要包括地址转换和数据包路由两个核心步骤。NAT的目的是在局域网(LAN)和广域网(WAN)之间实现地址转换,使得局域网内的私有IP可以通过路由器访问互联网,并接收从互联网返回的数据包
出站数据包转发流程(从LAN到WAN)
步骤 | 描述 |
---|---|
数据包生成 | 局域网中的设备(如电脑或手机)向互联网的目标IP发送数据包。数据包的源地址是设备的私有IP,目标地址是外部网络的公网IP。 |
路由器接收 | 数据包到达路由器的LAN口,路由器识别到该数据包的目的地是广域网(WAN),需要通过NAT进行转换。 |
地址转换(SNAT) | 路由器将数据包中的源IP地址(私有IP)替换为路由器的WAN口公网IP,并记录该映射关系(源私有IP、目标公网IP、端口信息等)以备后续返回包的匹配。 |
数据包转发 | 路由器将修改后的数据包转发到广域网,由互联网服务提供商(ISP)接管并将数据包发送到目标公网IP。 |
入站数据包转发流程(从WAN到LAN)
步骤 | 描述 |
---|---|
数据包返回 | 目标公网IP设备响应数据包,返回数据包到路由器的WAN口。此时数据包的源地址是外部网络的公网IP,目标地址是路由器的WAN口IP。 |
地址转换(DNAT) | 路由器查找之前记录的映射关系,将数据包的目标地址从路由器的WAN口公网IP替换为局域网设备的私有IP。这一过程称为目标地址转换(DNAT)。 |
数据包转发到局域网设备 | 路由器将目标IP地址转换后的数据包转发到对应的局域网设备,完成数据包的转发。 |
四、路由
1.前沿
路由(Routing)是指网络设备(如路由器)根据目标地址将数据包从源端传输到目标端的过程。它是网络通信中至关重要的一个环节。路由决定了数据包在网络中的传输路径,使数据能够在不同网络之间顺畅传输。主要涉及路由选择、路由表、动态路由协议等方面
路由的过程就是一跳一跳(Hop By Hop)“问路” 的过程。所谓 “一跳” 就是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间
IP数据包的传输过程也和问路一样
当IP数据包,到达路由器时,路由器会先查看目的IP;路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器,就这样反反复复,一直到达目标IP地址
路由流程
- 数据包接收
路由器在接口上接收到数据包后,检查数据包的目标IP地址。- 查找路由表
路由器在路由表中查找目标IP对应的最佳路径,通常根据最短路径、最少跳数或管理指定的优先级选择。- 数据包转发
路由器将数据包转发到下一跳地址(或直接发送到目标地址),并通过选定的接口将数据包传出。- 路径调整
若网络拓扑发生变化,动态路由协议会自动更新路由表,以确保数据包始终通过最优路径传输。
那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表
2.路由表
路由表(Routing Table)是路由器用来决定数据包转发路径的一个关键组件。它包含网络拓扑的路径信息,使路由器能够高效地将数据包从源发送到目标。路由表可以理解为路由器的“地图”,其内容由手动配置或动态路由协议自动更新。
- 路由表可以使用route命令查看
wuxu@Nanyiroot:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 eth0
100.100.2.136 _gateway 255.255.255.255 UGH 100 0 0 eth0
100.100.2.138 _gateway 255.255.255.255 UGH 100 0 0 eth0
172.17.160.0 0.0.0.0 255.255.240.0 U 100 0 0 eth0
_gateway 0.0.0.0 255.255.255.255 UH 100 0 0 eth0
其中
目的地 (Destination) | 网关 (Gateway) | 子网掩码 (Genmask) | 标志 (Flags) | 度量 (Metric) | 引用 (Ref) | 使用计数 (Use) | 接口 (Iface) |
---|---|---|---|---|---|---|---|
default | _gateway | 0.0.0.0 | UG | 100 | 0 | 0 | eth0 |
100.100.2.136 | _gateway | 255.255.255.255 | UGH | 100 | 0 | 0 | eth0 |
100.100.2.138 | _gateway | 255.255.255.255 | UGH | 100 | 0 | 0 | eth0 |
172.17.160.0 | 0.0.0.0 | 255.255.240.0 | U | 100 | 0 | 0 | eth0 |
_gateway | 0.0.0.0 | 255.255.255.255 | UH | 100 | 0 | 0 | eth0 |
字段说明
- Destination: 指数据包的目标网络或目标主机IP地址。
- Gateway: 指转发数据包的下一跳网关IP地址,
0.0.0.0
表示直连网络,无需网关。 - Genmask: 子网掩码,用于确定网络范围。
- Flags:
- U: 表示该路由是启用的。
- G: 表示该路由需要通过网关。
- H: 表示目标是主机地址,而不是网络地址。
- Metric: 路由度量值,用于路径选择,值越小优先级越高。
- Ref: 路由的引用计数,表示多少套协议在使用该条路由(一般为0)。
- Use: 表示路由表项的使用次数。
- Iface: 发送数据包的网络接口。
各项解释
- default:默认路由,指向
_gateway
(即eth0
上的网关),子网掩码0.0.0.0
表示任何IP数据包都匹配该路由。具有UG
标志,表示通过网关eth0
传出。 - 100.100.2.136 和 100.100.2.138:这些是到特定主机(100.100.2.136 和 100.100.2.138)的路由条目,网关也是
_gateway
,子网掩码255.255.255.255
表示这是特定主机路由。UGH
标志表示这是需要通过网关的主机路由。 - 172.17.160.0:这是一个直连网络,目标网络为
172.17.160.0
,子网掩码255.255.240.0
表示这是一个较大的子网,U
标志表示直连,无需通过网关。 - _gateway:这是指向
_gateway
的特定主机路由,用来直接访问网关。
这台主机有两个网络接口:一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络。
- 转发过程例1:如果要发送的数据包的目的地址是192.168.56.3
1.跟第一行的子网掩码做与运算得到 192.168.56.0,与第一行的目的网络地址不符。
2.再跟第二行的子网掩码做与运算得到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去。
3.由于 192.168.56.0/24 正是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
- 转发过程例2:如果要发送的数据包的目的地址是 202.10.1.2 呢?
1.依次和路由表前几项进行对比,发现都不匹配。
2.按缺省路由条目,从 eth0 接口发出去,发往 192.168.10.1 路由器
3.由 192.168.10.1 路由器根据它的路由表决定下一跳地址。
3.路由表生成算法
路由表生成算法是指路由器根据网络拓扑结构和路由信息动态或静态生成路由表的过程。这个算法的核心目标是找到最优路径,并将其记录在路由表中,以便路由器能够高效地转发数据包
3.1 距离矢量路由算法 (Distance Vector Routing Algorithm)
- 原理:基于跳数(hop count)来决定路由路径的优先级。每个路由器会周期性地将自己所知的路由信息(包括到每个网络的距离)广播给相邻的路由器。
- 更新规则:如果路由器接收到的路由信息比现有路由的跳数更少,则更新路由表。
- 协议实例:RIP(Routing Information Protocol)。
- 优缺点:适用于小型网络,但存在“路由环路”问题,即可能出现无法收敛的情况。可通过“毒性逆转”或“水平分割”等手段减少环路。
算法步骤
- 路由器初始化其路由表,记录到直连网络的距离为1,其余为不可达。
- 路由器周期性地将路由表广播给邻居。
- 当收到邻居的路由信息时,如果存在更短路径,路由器将更新其路由表。
- 重复该过程,直到路由表收敛为最优路径。
3.2链路状态算法(Link State Algorithm)
链路状态算法(Link State Algorithm)是一种路由选择算法,主要用于动态路由协议(如OSPF)中,适用于大规模网络。这种算法基于网络拓扑的全局视图,使用每个路由器的链路状态信息来构建网络的整体拓扑图,然后计算从自身到所有其他节点的最优路径。
链路状态算法的核心概念
链路状态(Link State):指路由器与直接相连的其他路由器或网络的连接状态和路径信息,包括链路的带宽、延迟、可靠性、负载等。
链路状态广播(Link State Advertisement, LSA):每台路由器定期或在拓扑发生变化时,将自己所有链路的状态发送给网络中的其他路由器。所有路由器因此可以获知整个网络的拓扑信息。
最短路径树(Shortest Path Tree, SPT):每个路由器根据全局拓扑图,使用迪杰斯特拉(Dijkstra)算法计算出最短路径树(SPT),从而生成路由表。
链路状态算法的主要步骤
1.链路状态信息收集
- 每个路由器定期对其直接连接的链路进行检查,确定邻居路由器的状态。
- 路由器将获得的链路状态信息打包成LSA,包含源路由器的标识符、链路的成本、链路带宽等。
2.链路状态信息传播
- LSA通过洪泛(Flooding)方式发送到所有路由器。每个路由器将LSA传递给其所有邻居,直到所有路由器都收到并且拥有相同的网络拓扑信息。
- 每台路由器会记录所有接收到的LSA,并通过序列号检查LSA的更新性,避免旧的LSA传播。
3.构建拓扑图
- 在收到所有路由器的LSA之后,每台路由器会构建出一个完整的网络拓扑图,这个拓扑图显示了整个网络的所有连接关系。
- 每台路由器基于相同的拓扑图,因此可以生成一致的路由表。
4.计算最短路径
- 路由器使用迪杰斯特拉算法(Dijkstra Algorithm)来计算最短路径树(Shortest Path Tree, SPT)。在计算中,将本路由器作为根节点,依次确定到每个目标网络或路由器的最短路径。
- 生成的最短路径即为最佳路径,用于路由表的生成。
5.路由表生成与更新
- 路由器根据最短路径树生成路由表,记录每个目标网络的最佳路径及下一跳。
- 当网络拓扑变化(如链路断开或新增)时,受影响的路由器会生成新的LSA并再次洪泛,所有路由器更新拓扑图并重新计算最短路径,从而及时更新路由表。
链路状态算法的优缺点
优点
- 快速收敛:链路状态算法在拓扑变化时快速传播更新信息,所有路由器同步后可快速达到一致状态,收敛速度较快。
- 全局最优:每台路由器都拥有全网的拓扑信息,计算出的路径是全局最优路径,适用于大规模网络。
- 支持多路径选择:算法可以在多条等价路径存在时,选择多条路径进行负载均衡。
缺点
- 计算复杂度高:链路状态算法需要各路由器存储全网的拓扑信息,并运行复杂的最短路径计算算法,增加了内存和处理器的负担。
- 网络开销大:LSA的洪泛需要占用大量带宽资源,特别是在网络拓扑频繁变化的情况下,容易产生较高的网络开销。
链路状态算法的应用
链路状态算法广泛用于OSPF(Open Shortest Path First)协议中,适合中大型的复杂网络。OSPF将网络分为多个区域,减少了洪泛的范围和网络开销。此外,IS-IS(Intermediate System to Intermediate System)协议也基于链路状态算法,常用于ISP的核心网络。
总结
链路状态算法通过收集、传播链路状态信息,使每台路由器构建出网络拓扑图,并基于最短路径算法生成路由表。这种算法能提供全局最优的路由选择,适合需要快速收敛和高可靠性的中大型网络。
3.3距离向量路径选择算法(Path Vector Algorithm
距离向量路径选择算法(Path Vector Algorithm)是一种路由选择算法,主要用于自治系统(Autonomous Systems, AS)之间的路由协议中。典型的应用是边界网关协议(BGP),它被广泛用于互联网的骨干网之间。路径向量算法在距离矢量算法的基础上进一步改进,通过记录路径信息(而不是简单的跳数),可以有效避免环路并实现策略路由。
距离向量路径选择算法的核心概念
- 自治系统(AS)
AS是具有独立路由策略的网络集合,通常由单一组织管理。在路径向量算法中,每个AS被视为一个独立的节点。- 路径向量(Path Vector)
路由器不仅会记录目标AS的路径距离,还会记录通过的AS路径列表(即所有途径的AS号),形成路径向量。这个路径向量信息有助于识别环路和选择符合策略的路径。- 策略控制
路由决策不仅基于路径长度,还可以根据路径包含的AS来控制路由选择。例如,某些AS可能会被标记为不安全或不可信,路由选择时会避开这些AS。距离向量路径选择算法的主要步骤
- 路径信息的初始化
每个AS将自己能够直达的网络(即直接连接的网络)作为初始路径向量信息。路径向量包括目标网络、路径(只包含自己)和其他度量信息。- 路径信息的传播
每个AS会定期将自身的路径向量发送给其邻接AS。邻居AS接收到路径向量后,将自身的AS号附加到路径列表中,然后再将更新后的路径向量转发给其邻居。这个过程持续进行,直到所有AS都得到了全网的路径信息。- 环路检测
在接收到的路径向量中,如果AS号列表中已经包含本AS的编号,说明该路径存在环路。这种路径会被直接丢弃,避免数据包在网络中出现循环。- 路径选择
1.当AS收到多个到达同一目标的路径向量时,会根据路径长度(AS跳数)或自定义的策略(如避开某些AS)来选择最佳路径。
2.在BGP中,路径选择策略优先考虑AS路径的政策控制。例如,如果AS路径包含一个被信任的伙伴AS,可能会优先选择该路径。- 路由表更新
每个AS会将选择的最佳路径向量添加到其路由表中,记录该路径的目标网络、下一跳以及路径信息。
若拓扑发生变化(如某条路径不可达),相应的路径向量会更新,AS重新计算最佳路径并更新路由表。距离向量路径选择算法的优缺点
优点环路检测机制:路径向量算法通过记录AS路径信息,有效检测和避免了路由环路问题。
策略灵活:可自定义路由选择策略,基于AS路径做出精细的路由控制,适合互联网骨干网之间的复杂路由需求。
适合大型网络:通过聚合路径信息而非逐跳路由信息,适用于复杂、跨地域的大规模网络。
缺点存储开销:每个AS需要维护全网的路径向量信息和路径列表,相比其他算法,路由表会更大,存储开销较高。
路径更新较慢:由于路径信息需要多跳传播,在网络拓扑频繁变化的场景中,路径向量算法的更新速度相对较慢。
实现复杂:由于需要支持复杂的策略控制和路径管理,路径向量算法的实现比其他路由算法更复杂。
距离向量路径选择算法的应用:BGP协议
在BGP(Border Gateway Protocol)协议中,路径向量算法得到了广泛应用。BGP作为互联网主干路由协议,连接多个AS,允许每个AS根据其策略选择和传播路由。具体应用包括:路径聚合:BGP可以将多个相邻网络聚合为单条路径,减少路径向量的大小,优化路由表。
策略路由:BGP通过路由策略(Policy)过滤不符合要求的路径,或对某些AS路径赋予优先级。
多宿主和负载均衡:在多条路径可用时,BGP可以实现流量负载均衡,从而提升网络的整体性能。
总结
距离向量路径选择算法基于路径向量传播AS路径信息,在实现策略控制的同时避免环路问题,适合复杂的跨区域网络路由需求。它被广泛应用于BGP协议,构建了现代互联网的全球路由骨干,为各自治系统之间提供了灵活的路由选择和策略控制机制。
五、分片与组装
在IP协议的分片机制中,为了支持较大的数据包在不同网络环境中传输,使用了 16位标识、3位标志 和 13位片偏移,以确保数据包能够被正确地拆分、传输和重组。
16位标识(Identification):这个字段用于标识IP包的唯一性。对于发自同一源地址并发往同一目的地址的所有数据包,每一个包都会有一个唯一的标识值。若一个数据包被分片传输,所有的分片都会保留相同的标识,以确保接收端能够正确地将这些分片重新组装为原始数据包
3位标志(Flags):
- 第1位(未用):保留位,通常设置为0。
- 第2位(DF位,Don’t Fragment):禁止分片位。当设置为1时,表示数据包不能被分片,如果需要分片才能通过某个网络节点,数据包将被丢弃。
- 第3位(MF位,More Fragments):更多分片位。当设置为1时,表示当前分片后面还有更多分片。当它为0时,表示这是最后一个分片。
13位片偏移(Fragment Offset):该字段表示当前分片在原始数据包中的相对位置。它的单位是8字节(64位),即片偏移的值表示分片数据在原始数据包中的偏移量。通过片偏移,接收端可以将各个分片按照正确顺序组装,以恢复完整的原始数据包。
1.为什么要进行分片
IP数据包分片的原因主要在于网络中的**最大传输单元(MTU)**限制。不同网络介质(如以太网、无线网络、光纤等)对数据包的大小限制不同,而MTU就是这些网络中单个数据帧可承载的最大字节数。当一个数据包的大小超过网络链路允许的MTU时,数据包必须分片,以确保可以通过该链路传输。
最大传输单元(MTU, Maximum Transmission Unit)是指网络层在一次传输中可以传递的最大数据包大小(以字节为单位)。MTU的大小直接影响网络传输效率和数据包的完整性。通常,在以太网中,默认的MTU值为1500字节。然而,不同的网络环境(如无线、VPN、广域网)可能会有不同的MTU值。
MTU与TCP/IP协议的关系:TCP/IP协议栈会根据MTU来决定每个数据包的大小。对于较大数据包,TCP会尝试将其划分为符合MTU的段,从而优化传输效率,避免分片。
2.为什么不想分片
在网络世界里,只有IP报文;分片中,如果一片报文丢失,表示整个报文丢失
所以说报文分片会增加丢包概率,所以这不是网络转发的主流,尽可能的不要分片
3.如何做到不分片
要避免数据包在网络传输过程中分片,通常需要确保数据包的大小不超过路径上的最小MTU(最大传输单元)。以下是几种常用的方法来实现无分片传输:
1.使用路径MTU发现(PMTUD)
**路径MTU发现(PMTUD)**是一种动态检测网络路径上最小MTU的方法,以确保数据包在路径上不会被分片。PMTUD通过以下步骤实现:
- 发送方在IP数据包中设置“禁止分片(DF)”标志,将数据包发送到接收端。
- 如果数据包在途中某个节点超过该网络的MTU限制且无法分片,该节点会丢弃数据包,并返回ICMP消息(“需要分片但禁止分片”)给发送方。
- 发送方接收到ICMP消息后,减少数据包的大小,再次发送,直到找到适合该路径的最大MTU大小为止。
一旦路径MTU确定,发送方会在整个会话中使用该MTU大小来避免分片。
2. 手动配置较小的MTU
在某些情况下,手动配置一个较小的MTU值可以避免分片,尤其是在不支持PMTUD的网络环境中。可以根据目标网络的实际情况,手动设置一个低于默认值(如1400字节)的MTU,以保证数据包可以在各种网络中顺利传输,避免分片。例如:
- 在VPN连接或广域网中,可以根据网络设备的推荐值手动将MTU设置为1400-1420字节。
- 在配置以太网连接时,可以根据网络需求手动降低MTU,确保数据包大小在链路的最大传输单元范围内。
3. 使用TCP分段
对于TCP协议,可以通过TCP层的分段来避免分片。TCP会根据**MSS(最大段大小)**来确定每个TCP段的大小,以确保每个段在封装到IP数据包后不会超过路径的MTU。
- MSS(最大段大小):MSS是指TCP段的有效载荷大小,通常设置为
MTU - 40
字节(减去IP和TCP头的20字节),以确保不超过MTU。通过设置合理的MSS,数据包在经过IP层封装时不会超出MTU,避免了IP分片的需求。- TCP握手中的MSS协商:在TCP连接建立时,双方会通过SYN包中的MSS字段协商出一个合适的MSS值,从而在传输过程中避免分片。
4. 使用UDP并手动控制数据包大小
对于使用UDP的应用程序(如视频流、游戏数据),可以手动控制每个数据包的大小,使其不超过路径MTU。UDP没有像TCP那样的分段机制,因此在使用UDP时,开发者需要确保发送的数据包大小符合MTU,以避免分片。
- 在构建数据包时,可以将每个数据包的大小控制在MTU以下。
- 在实时应用(如VoIP)中,通常会使用较小的数据包大小以适应多种网络环境,从而避免分片。
5. 避免隧道封装
隧道协议(如VPN、GRE等)会增加额外的头部信息,从而增大数据包的总大小。如果要避免分片,可以:
- 减小传输的有效载荷,以适应隧道的MTU限制。
- 使用较短的隧道协议或启用隧道MTU发现,以确定符合网络路径的最小MTU。
通过以上方法,可以确保数据包不超过路径上的最小MTU,从而避免IP分片。路径MTU发现是最常用的自动化方法,手动配置较小MTU和MSS控制也是常见的解决方案。
4.如何分片
在网络传输中,当一个数据包的大小超过路径上的最大传输单元(MTU)时,IP层会将该数据包进行分片,以便其能够通过网络传输。
由于片偏移是13位,而总长度是16位,为了防止片偏移不够标识的原因
写入数据的时候:偏移量>>3(/8)
读取数据的时候,偏移量<<3(*8)
为了防止数据丢失问题,要求偏移量的大小必须是8的倍数,不够8的倍数系统会自动填充字符
接收端也无需担心读到填充字符,因为有16位总长度,最后填充字符的一定在最后一个分段
- 如何区分,我收到的报文是分片了的?
第一片 | 中间片 | 最后一片 | |
---|---|---|---|
更多分片位 | 1 | 1 | 0 |
片偏移 | 0 | >0 | >0 |
也就是
if(更多分片 == 1 || 片偏移 > 0)
{
//分片了
}
- 如何区分没有分片?
更多分片为0 && 片偏移为0
- 如何保证我们收全了?
所有的分片,按照片偏移进行升序排序。结合 偏移量 + 自身大小 = 下一个报文的偏移量 扫描整个报文,如果不匹配,中间一定会有丢失,如果成功计算到结尾,就一定收取完整了。
- 如何重组?
当接收端接收到分片数据包后,会根据以下信息将分片数据重组:
根据标识字段识别属于同一数据包的分片,使用片偏移字段将分片数据按正确顺序排列。
当检测到MF位为0的分片时,接收端确认这是最后一个分片,随后可以开始重新组装所有分片。
总结:经过分片的学习,我们也明白了,为什么大部分教材里,滑动窗口内部进行分段