厦门网站设计公司推荐,诚信通旺铺网站建设,怎么在地图上设置自己店的位置,常德尚一网「前言」文章内容是网络层的IP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、IP协议简介二、IP协议报头三、IP网段划分#xff08;子网划分#xff09;四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址七、路由八、分… 「前言」文章内容是网络层的IP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、IP协议简介二、IP协议报头三、IP网段划分子网划分四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址七、路由八、分片与组装 一、IP协议简介 IP指网际互连协议Internet Protocol的缩写是TCP/IP体系中的网络层协议。 IP协议位于网络层 网络层解决的问题 传输层: 负责两台主机之间的数据传输。代表协议TCP协议确保数据可靠的从源主机发送到目标主机传输层的数据继续向下交付给网络层网络层: 负责地址管理和路由选择。代表协议IP协议通过IP地址来标识一台主机并通过路由表的方式规划出两台主机之间的数据传输的线路路由TCP作为传输层控制协议其保证的是数据传输的可靠性但TCP提供的仅仅是数据传输的策略而真正负责数据在网络中传输的则传输层之下的网络层和链路层
网络层要解决的问题就是将数据从一台主机跨网络送到另一台主机也就是数据的路由路径选择
IP地址的核心作用就是用于定位主机IP具有将一个数据数据从A主机跨网络送到B主机的能力主机到主机有能力不一定能做到比如张三同学数学有考150分的能力但并不是每次都一定能考150分有能力代表有非常大的概率去完成这件事TCP提供发送数据的策略IP负责提供行动发送数据即网络层不能保证每次都能将数据成功送到对方主机但在TCP提供的可靠性策略的保证下最终网络层就一定能够将数据可靠的发送到对方主机 基本概念 主机每台主机都配有IP地址但是不进行路由控制的设备现在实际上几乎不存在不进行路由控制的设备路由器即配有IP地址又能进行路由控制工作在网络层现在的路由器有些已经具备应用层的功能节点主机和路由器的统称 路径选择 数据进行的网络传输一般都是跨网络的而路由器就是连接多个网络的硬件设备因此数据在进行跨网络传输时一定需要经过一个或多个路由器
比如B主机发送数据给C主机确定了C主机的地址后目的IP数据就可以进行路由了目的IP决定了路径怎么走为什么选择这条路径而不选择另外一条路径但数据在路由时无法自行进行路径选择因为这个数据本身是“不认识路”的而路由器是认得路是怎么走的它们将自己的“认路经验”都记录到路由表当中因此路由器可以通过查路由表找到去特定节点的最短路径因此数据在路由时会不断通过路由器来进行路径选择以此来一步步靠近目标网络或目标主机
二、IP协议报头
IP协议报头格式如下
4位版本号version指定IP协议的版本对于IPv4来说就是44位首部长度header length表示IP报头的长度以4字节为单位IP头部最大长度是60字节基础报头长度为20字节8位服务类型Type Of Service3位优先权字段已经弃用4位TOS字段和1位保留字段必须置为0。4位TOS分别表示最小延时最大吞吐量最高可靠性最小成本。这四者相互冲突只能选择一个。比如对于ssh/telnet这样的应用程序最小延时比较重要而对于ftp这样的程序最大吞吐量比较重要。16位总长度total lengthIP报文IP报头有效载荷的总长度用于将各个IP报文进行分离16位标识id唯一的标识主机发送的报文如果数据在IP层进行了分片那么每一个分片对应的id都是相同的3位标志字段第一位保留保留的意思是现在不用, 但是还没想好说不定以后要用到。第二位表示禁止分片表示如果报文长度超过MTUIP协议就会丢弃该报文。第三位表示“更多分片”如果报文没有进行分片则该字段设置为0如果报文进行了分片则除了最后一个分片报文设置为0以外其余分片报文均设置为1最后一个分片报文该字段为0类似于结束标志类似于C语言的字符串以\0结尾13位片偏移framegament offset分片相对于原始数据开始处的偏移表示当前分片在原数据中的偏移位置实际偏移的字节数是这个值× 8得到的。因此除了最后一个报文之外其他报文的长度必须是8的整数倍否则报文就不连续了8位生存时间Time To LiveTTL数据报到达目的地的最大报文跳数一般是64每经过一个路由TTL - 1一直减到0还没到达那么就丢弃了这个字段主要是用来防止出现路由循环8位协议表示上层协议的类型16位首部检验和使用CRC进行校验来鉴别数据报的首部是否损坏但不检验数据部分32位源IP地址Source IP Address指示发送该数据报的源主机的IP地址。32位目标IP地址Destination IP Address指示接收该数据报的目标主机的IP地址选项字段不定长最多40字节不谈 如何进行报头与有效载荷的分离即如何解包 IP协议的报头与TCP协议的报头类似当IP从底层获取到一个报文后虽然IP不知道报头的具体长度但IP报文的前20个字节是IP的基本报头并且这20字节当中涵盖4位首部长度
IP解包的过程如下
IP从下层获取到一个报文后首先读取报文的前20个字节并从中提取出4位的首部长度此时便获得了IP报头的大小注IP基本报头的长度是20字节无脑读取20字节IP报头当中的4位首部长度只有4个比特位即4位首部长度的取值范围是0000 ~ 1111即最大长度是15又因为4位首部长度的基本单位是4字节所以15*460字节即IP报头的最大长度是60字节基本长度是20字节即报头的取值范围是[20 ~ 60]报头还有一个字段16位总长度IP报文IP报头有效载荷的总长度拿到报头长度之后就可以直接与有效载荷进行分离了
注不同的协议层对数据包有不同的称谓在传输层叫做数据段(segment)在网络层叫做数据报 (datagram)在链路层叫做数据帧(frame) IP如何决定将有效载荷交付给上层的哪一个协议即如何分用 在IP报头当中有一个字段叫做8位协议该字段协议的编号表示的就是上层协议的类型IP就是根据该字段判定应该将分离出来的有效载荷交付给上层的哪一个协议的注每个协议都有特定的编号
如何解包与分用已经解决封装就是逆过来 8位生存时间 报文在网络传输过程中可能因为某些原因导致报文无法到达目标主机比如报文在路由时出现了环路路由的情况此时这个报文就成了一个废弃的无用报文为了避免网络当中出现大量的无用报文无用报文每转发一次就浪费一点路由器资源于是在IP的报头当中就出现了一个字段叫做8位生存时。8位生存时间代表的是报文到达目的地的最大报文跳数每当报文经过一次路由这里的生存时间就会减一当生存时间减为0时该报文就会被自动路由器丢弃此时这个报文就会在网络中消散 32位源IP地址和32位目的IP地址 32位源IP地址和32位目的IP地址在路由转发过程中起着重要作用路径选择路由器根据这两个地址来决定如何转发数据包。它会查找路由表找到最佳的路径将数据包从源地址发送到目的地址。这个过程称为路由转发。通过源IP地址和目的IP地址路由器可以确定数据包的起始点和终点并选择最佳的路径进行转发以确保数据包能够快速、准确地到达目的地
16位标识id、3位标志字段、13位片偏移最后再谈
三、IP网段划分子网划分 IP地址的构成 IP地址由网络号和主机号两部分构成
网络号保证相互连接的两个网段具有不同的标识 主机号同一网段内主机之间具有相同的网络号但是不同的主机必须有不同的主机号
P协议有两个版本IPv4和IPv6。后序凡是提到IP协议没有特殊说明的默认都是指IPv4IPv4与IPv6不兼容
对于IPv4来说IP地址是一个4字节32位的正整数32个比特位在IP地址的后面加一个/并在/后面加上一个数字这就表示从头数到第几位为止属于网络标识网络号
例如下图中路由器连接了两个网段子网
对于网络标号来讲同一网段内主机的网络号是相同的不同网段内主机的网络标识是不同的对于主机号来说同一网段内主机的主机号是不同的不同网段内主机的主机号是可以相同的 不同的子网其实就是把网络号相同的主机放到一起如果在子网中新增一台主机则这台主机的网络号和这个子网的网络号一致但是主机号必须不能和子网中的其他主机重复一个路由器至少行跨两个子网 为什么要进行IP网段划分为什么要进行子网划分 将数据跨网络从一台主机发送到另一台主机时并不是进行线性遍历IP地址而是先将数据发送到目标主机所在的网络然后再发送到对方的目标网络然后再将数据发送到目标主机不进行线性遍历IP地址的原因的因为这样效率极其低下以IPv4来说就有42亿左右的IP地址找主机的过程本质是排除的过程如果一开始就以找目标主机为目的那么在查找的过程中一次只能排除一个主机而如果一开始先以找目标网络为目的那么在查找过程中就能一次排除大量和目标主机不在同一网段的主机这样就可以大大提高检索的效率
举个例子
比如我们的学号学号是精心设计过的每个字段都代表不同的含义。每个学校都有许多个学院假设计算机学院编号001理学院的编号是002电子信息学院的编号是003化工学院的编号是004张三是一名计算机学院的同学张三见捡到了一个钱包上面只有学号0030115张三不认识这个学号于是张三就一直问走过来的同学你的学号是多少…假设学校有2w人运气不好张三要问完2w人这效率极其感人张三在这时脑袋灵光一闪这上面不是有学院的编号吗直接把它交给自己学院的管理者再由自己学院的管理者交给该0030115学号的学院管理者再由该学院的管理者交给学号为0030115的同学。这不就大大提高了查找的效率吗 虽然张三不认识学号是哪一个学院的但是计算机的管理一看这不是电子信息学院的吗直接就扔给了电子信息学院的管理者这样的检索过程实际上就是排除的过程根据不同的编号网段一次就能排除n多群学院网段极大提高了查找的效率一个学院的管理者就相当于一个路由器每个学院就相当于一个子网
因此为了提高数据路由查找效率对IP地址进行了IP网段划分子网划分 DHCP 通过合理设置主机号和网络号就可以保证在相互连接的网络中每台主机的IP地址都不相同
以前的IP需要手动进行管理手动管理IP地址是一个非常麻烦的事情当子网中新增主机时需要给其分配一个IP地址当子网当中有主机断开网络时又需要将其IP地址进行回收便于分配给后续新增的主机使用后面出现了DHCP协议DHCPDynamic Host Configuration Protocol动态主机配置协议是一个局域网的网络协议使用UDP协议工作主要有两个用途给内部网络或网络服务供应商自动分配IP地址给用户或者内部网络管理员作为对所有计算机作中央管理的手段DHCP是一个基于UDP的应用层协议一般的路由器都带有DHCP功能因此路由器也可以看作一个DHCP服务器
当你的设备连接WiFi成功路由器会自动分配一个IP给你的设备然后你的设备就有了IP地址就可以进行上网了没有联网的设备没有IP地址 是谁进行子网划分 互联网是一个被设计好的世界同样IP地址也是被设计好的对于我们国家来说运营商移动、电信、联通就是进行子网划分的执行者底层网络的设计者 如何进行网段划分如何进行子网划分 过去曾经提出一种划分网络号和主机号的方案就是把所有IP地址分为五类
如下图所示 因此各类IP地址的取值范围如下
A类0.0.0.0到127.255.255.255B类128.0.0.0到191.255.255.255C类192.0.0.0到223.255.255.255D类224.0.0.0到239.255.255.255E类240.0.0.0到247.255.255.255
判断一个IP地址属于哪一类网络可以通过查看IP地址的第一个字节来确定前8个比特位 CIDR无类别域间路由Classless Interdomain Routing 但随着网络的飞速发展这种划分方案的局限性很快就显现出来了
例如申请了一个B类地址理论上一个子网内能允许6万5千多个主机对于A类地址的子网内的主机数更多然而实际网络架设中不会存在一个子网内有这么多的情况。因此大量的IP地址都被浪费掉了
为了避免这种情况于是又提出了新的划分方案称为CIDRClassless Interdomain RoutingCIDR是一种IP地址分配和路由的策略旨在更有效地利用IPv4地址
在原有的五类网络的基础上继续进行子网划分这也就意味着需要借用主机号当中的若干位来充当网络号此时为了区分IP地址中的网络号和主机号于是引入了子网掩码subnet mask的概念每一个子网都有自己的子网掩码子网掩码实际就是一个32位的正整数通常用一串“0”来结尾将IP地址与当前网络的子网掩码进行“按位与”操作就能够得到当前所在网络的网络号这里的网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
此时一个网络就被更细粒度的划分成了一个个更小的子网通过不断的子网划分子网中IP地址对应的主机号就越来越短因此子网当中可用IP地址的个数也就越来越少这也就避免了IP地址被大量浪费的情况
子网划分的例子如下
IP地址与子网掩码进行按位与就得到了该网络的网络号主机号从全0到全1就是子网的地址范围 再例如
需要注意的是子网划分不是只能进行一次可以在划分出来的子网的基础上继续进行子网划分
一般在一个子网中管理子网中IP的设备一般是路由器目标网络子网掩码和子网中的主机都会被路由器进行管理目标网络和子网掩码都是在路由器上配置的
四、特殊的IP地址
并不是所有的IP地址都能够作为主机的IP地址有些IP地址本身就是具有特殊用途的。
将IP地址中的主机地址全部设为0就成为了网络号代表这个局域网。例如上图的140.252.40.0或140.252.40.64这个地址代表网络号不能分配给主机将IP地址中的主机地址全部设为1就成为了广播地址用于给同一个链路中相互连接的所有主机发送数据包。例如上图的140.252.40.255或140.252.40.79这个地址代表广播地址也是不能分配给主机127.*的IP地址用于本机环回loop back测试通常是127.0.0.1 广播地址 广播地址用于在同一个链路中相互连接的主机之间发送数据包广播给同一子网内的所有主机广播地址是专门用于同时向网络中通常指同一子网所有工作站进行发送的一个地址当主机号全为1时就表示该网络的广播地址例如上课时班长喊“上课全体起立”班里同学听到后都站起来这个口令就有广播的含义 本地环回 本地环回loopback是一个特殊的网络接口通常用于网络设备的内部通信和管理本地环回接口在IP地址中属于特殊的一类称为环回地址通常指定为127.0.0.0/8网段其中最常见的是127.0.0.1本地环回它不仅可以用于远程管理和故障诊断还可以用于测试网络服务和内部通信
五、IP地址的数量限制
IP地址IPv4是一个4字节32位的正整数因此一共有2^32个IP地址也就是将近43亿个IP地址。但TCP/IP协议规定每个主机都需要有一个IP地址
现在全世界人口已经有70多亿了就算有一半的人没有智能手机算下来也有30多亿台智能手机需要IP地址随着科技的发展我们使用的电脑、智能手表、智能冰箱、智能洗衣机等设备如果要入网也是需要IP地址的另外IP地址并不是按照主机台数来配置的因此一个主机可能需要多个IP地址更别谈还有很多组网的路由设备也需要IP地址以及一些特殊的IP地址不能使用的问题
所以43亿个IP地址其实早就不够用了因此才提出了CIDR的方案对已经划分好的五类网络继续进行子网划分其目的就是为了减少IP地址的浪费根本原因就是IP地址本来就不够了所以不能够再浪费了。
CIDR虽然在一定程度上缓解了IP地址不够用的问题因为CIDR提高了IP地址的利用率减少了浪费但IP地址的绝对上限并没有增加依旧是43亿左右 解决IP地址的三种方法 动态分配IP地址只给接入网络的设备分配IP地址因此同一个MAC地址的设备每次接入互联网中得到的IP地址不一定是相同的避免了IP地址强绑定于某一台设备NAT技术能够让不同局域网当中同时存在两个相同的IP地址NAT技术不仅能解决IP地址不足的问题而且还能够有效地避免来自网络外部的攻击隐藏并保护网络内部的计算机IPv6IPv6用16字节128位来表示一个IP地址能够大大缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级版它们是互不相干的两个协议彼此并不兼容因此目前IPv6还没有普及
IPv6我国目前搞得比较好但是由于与IPv4不兼容导致推广迟迟无法展开。因为IPv4是内嵌在OS里面的还有底层设施与IPv6不兼容导致IPv6的推广很困难
由于NAT技术的出现IP地址不足的问题得到了解决但是IP地址的绝对上限并没有增加NAT技术依旧没有彻底解决这个问题
NAT技术的出现虽然阻碍了IPv6的发展但是也帮助了我国IPv6的推广通过NAT技术可以把IPv6的地址转化成IPv4的地址目前我国大部分互联网公司的内网环境都是IPv6
美国虽然也搞IPv6但是没有动力我闲着没事干为什么要推翻我的IPv4
彻底解决IP地址不足的问题还是得靠IPv6
六、私有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或全局IP 查看自己主机的IP ifconfig该命令的作用是显示和配置网络接口的信息
比如购买的Linux服务器输入该命令
eth0代表的是通常表示系统的第一个以太网接口。它是物理网络接口用于连接到局域网或互联网。eth0可以是有线或无线以太网接口具体取决于你的系统设置和网络硬件lo是本地回环接口loopback interface也被称为环回地址。它是一个虚拟网络接口用于系统内部通信。lo接口的IP地址通常是127.0.0.1子网掩码为255.0.0.0。它允许系统内部的进程和服务之间进行通信而不需要通过物理网络接口图中eth0接口中的inet对应的地址192.168.0.213就是私网IP 用于连接Linux服务器的IP叫做公网IP 注在Windows下查看使用命令ipconfig 我们为什么要给运营商交钱 我们享受的是互联网公司提供服务比如刷抖音在淘宝上买东西…但是我们并没有给互联网公司交钱上网的费用而是把钱交给了运营商为什么把钱交给运营商而不是互联网公司我们明明享受的是互联网公司提供的各种服务
运营商是网络通信的基础设施的建设者我们进行上网各种数据请求响应的数据必须经过运营商也就是说我们访问服务器的数据请求并不是直接发送到了对应的服务器而是需要经过运营商建设的各种基站以及各种路由器、集群转发最终数据才能到达对应的服务器上对应服务器给我们响应的数据也必须经过运行商经过运营商的转发最终响应才到达我们的客户端我们给运营商交网费实际就相当于购买入网许可一样允许我们进行上网因为我们必须使用运营商提供了通信的基础设施不使用就无法上网
比如你的手机号欠费了你还想进行上网在经过运行商的时候运营商就会对你的账号进行认证发现你欠费了直接丢掉了你的请求不转发给相应的服务器
相反互联网公司想要上网也必须向运营商进行交费否则也上不了网即服务端的数据发送不到客户端上运营商相当于扮演中间人的角色两边进行收费所谓的网段划分、子网划分等工作实际都是运营商做的没有运营商提供的这些基础设施就不会诞生所谓的互联网公司因为互联网公司是诞生在网络通信基础之上的同理既然我们的数据报必须经过运营商运营商就可以对我们的数据包进行检测如果发现你请求的网址是非法网址或者该数据包访问的是外网比如Google、推特等运营商就直接把你的请求叉掉了不给你的数据包做转发
也就是说用户上网的数据首先必须经过运营商的相关网络设备然后才能发送到互联网公司对应的服务器所以我们想上网必须要给运营商交钱 路由器的功能 数据转发DHCP 和组建局域网子网NAT
路由器又分家用版路由器和企业级路由器
组建局域网使用的IP必须是私有IP不能使用公网IP家用版路由器功率较低满足日常使用搭建局域网使用的私有IP通常是 192.168.的企业级路由器搭建局域网使用的私有IP通常是10.或者是172.16.到172.31. 数据是如何发送到对应的服务器上的 路由器是连接两个或多个子网的硬件设备在路由器上有两种网络接口分别是LAN口和WAN口
LAN口Local Area Network表示连接本地网络的端口主要与家庭网络中的交换机、集线器或PC相连 WAN口Wide Area Network表可以理解为连接公网网络的接口一般指互联网
我们将LAN口的IP地址叫做LAN口IP对内也叫做子网IP将WAN口的IP地址叫做WAN口IPO也叫做外网IP对外
我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下
不同的路由器子网IP其实都是一样的通常都是192.168.1.1子网内的主机IP地址不能重复但是子网之间的IP地址就可以重复了每一个家用路由器其实又作为运营商路由器的子网中的一个节点这样的运营商路由器可能会有很多级最外层的运营商路由器的WAN口IP就是一个公网IP了如果希望我们自己实现的服务器程序能够在公网上被访问到就需要把程序部署在一台具有外网IP的服务器上这样的服务器可以在阿里云/腾讯云上进行购买
注私网IP不能出现在公网当中
为什么私网IP不能出现在公网当中
私网IP可以重复也就意味着我们可以在不同的局域网使用相同的IP地址缓解了IP的不足即私有IP地址是全球不唯一的如果直接用在公网上会造成路由混乱。所以私有IP地址要想访问外网会经过路由器并进行地址转换将私有IP局域网唯一转换成公有IP全球唯一
由于私网IP不能出现在公网当中
因此子网内的主机在和外网进行通信时路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP这样逐级替换最终数据包中的源IP地址成为一个公网IP这种技术成为NATNetwork Address Translation网络地址转换把私有地址转换成合法的IP地址
数据转发的大致流程如下
假设数据包要去往122.77.241.3/24数据包从自己的主机发送给家用路由器之后路由器发现要去往的目的IP不再自己的子网内此时就会进行源IP替换成路由器的WAN口IP再转发给跟自己直接相连的另一个子网假设转发的数据包到了运营商的路由器经过多级转发经过运营商的多个子网最后发现数据包要去往的目的IP不在自己的子网内此时也进行源IP替换成路由器的WAN口IP然后直接把数据包转发到公网上再由公网转发到对应的目的IP
如图 关于数据包怎么回来的问题后面再谈
七、路由 数据包路由的过程类似于问路的过程一个个接力下去 数据包在路由的过程中实际就是一跳一跳Hop by Hop类似于“问路”的过程所谓“一跳”就是数据链路层中的一个区间具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间 IP数据包的传输过程也和问路一样IP数据包的传输过程中会遇到很多路由器
这些路由器会帮助数据包进行路由转发每当数据包遇到一个路由器后对应路由器都会查看该数据的目的IP地址并告知该数据下一跳应该往哪跳
当IP数据包, 到达路由器时路由器会先查看目的IP路由器决定这个数据包是能直接发送给目标主机还是需要发送给下一个路由器查路由表依次反复一直到达目标IP地址 如何判定当前这个数据包该发送到哪里 这个就依靠每个节点路由器内部维护一个路由表通过查路由表就可以知道应该把数据表发送给谁 IP数据包中的目的IP在路由器的路由表查找结果可能有以下三种 路由器经过路由表查询后得知该数据下一跳应该跳到哪一个子网路由器经过路由表查询后没有发现匹配的子网此时路由器会将该数据转发给默认路由默认网关路由器经过路由表查询后得知该数据的目标网络就是当前所在的网络此时路由器就会将该数据转给当前网络中对应的主机 查看路由表 路由表可以使用route命令查看该命令可以显示当前系统的路由表 条目部分解释
Destination目标网络或主机的IP地址Gateway下一跳网关的IP地址即发送数据包到目标网络或主机的下一跳路由器Genmask目标网络或主机的网络掩码Flags标志位用于表示路由表项的状态和属性。常见的标志位包括U路由表项是可用的G路由表项是由网关指定的表示此条目的下一跳地址是某个路由器的地址H路由表项是一个主机路由Iface接口表示数据包将通过哪个网络接口发送
其中一些字段的意思
default表示这是默认路由网关即当系统找不到匹配的目标网络或主机时将使用这个路由表项0.0.0.0表示目标网络或主机为任意网络或主机UG表示这是一个默认路由表项并且网关字段是有效的没有G标志的条目表示目的网络地址是与本机接口直接相连的网络不必经路由器转发 查路由表的过程 当IP数据包到达路由器时路由器就会查该数据包的目的IP地址依次与路由表中的子网掩码 Genmask进行“按位与”操作遍历路由表然后将结果与子网掩码对应的目的网络地址Destination进行比对如果匹配则说明该数据包下一跳就应该跳去这个子网此时就会将该数据包通过对应的发送接口Iface发出 如果将该数据包的目的IP地址与子网掩码进行“按位与”后没有找到匹配的目的网络地址此时路由器就会将这个数据包发送到默认路由也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG实际就是将该数据转给了另一台路由器让该数据在另一台路由器继续进行路由 数据包不断经过路由器路由后最终就能到达目标主机所在的目标网络此时就不再根据该数据包目的IP地址当中的网络号进行路由了而是根据目的IP地址当中的主机号进行路由最终根据该数据包对应的主机号就能将数据发送给目标主机
路由表可以由网络管理员手动维护(静态路由)也可以通过一些算法自动生成(动态路由)
路由表生成算法距离向量算法, LS算法, Dijkstra算法等
注意网络层的IP协议是为数据的路由提供决策而真正的对数据进行转发路由的是数据链路层正真做事的
最后补充上面没有谈到的16位标识id、3位标志字段、13位片偏移
八、分片与组装
下面进行解释16位标识id、3位标志字段、13位片偏移 这里会涉及到数据链路层的问题
IP能够将数据包跨网络从一台主机送到另一台主机而数据包在进行跨网络传送时需要经过一个个的路由器进行路由转发最终才能到达目标主机因此IP进行数据包跨网络传送的前提是需要先将数据包从一个节点传送到和自己相连的下一个节点这个问题实际就是由IP之下的数据链路层解决的其中数据链路层代表协议就是MAC帧协议即数据链路层负责在相邻节点之间进行通信将数据包封装成帧并通过物理介质进行传输而两个节点直接相连也就意味着这两个节点是在同一个局域网当中的因此要讨论两个相邻节点的数据传送时实际讨论的就是局域网通信的问题 最大传输单元 MTU MAC帧作为数据链路层的协议它会将IP传下来的数据封装成数据帧然后发送到网络当中跑在网线上的是数据帧但是MAC帧协议传输数据是有限制大小的传输数据帧的时候不能超过这个值这个值被称为MTU最大传输单元最大传输单元Maximum Transmission UnitMTU是指在网络通信中数据链路层能够传输的最大数据帧的大小。MTU的大小通常由网络设备或网络协议规定它限制了一次可传输的数据量MTU默认的大小一般是1500字节
在Linux下使用ifconfig命令可以查看对应的MTU
MAC帧协议无法发送大于1500字节的数据因此IP层向下交付的数据包的长度不能超过1500字节而且IP报头有效载荷 1500字节如果大于1500字节MAC帧协议就无法发送该数据如果IP层要发送的数据超过了1500字节那么就需要先在IP层对该数据进行分片然后再将分片后的数据交给下层MAC帧进行发送因为IP协议控制不了发送一个报文的大小控制发送一个报文大小是传输层协议控制的TCP或UDP
既然有分片就也要有组装分片与组装是在IP层完成的分片与组装单纯是IP协议的行为与上一层传输层和下一层数据链路层没有任何关系
注意IP的分片与组装不是主流情况IP的分片与组装是特殊情况主流的情况下一篇文章数据链路层再谈 如何分片和组装 靠这三个字段即可完成分片与组装
16位标识id唯一的标识主机发送的报文如果数据在IP层进行了分片那么每一个分片对应的id都是相同的3位标志字段第一位保留保留的意思是现在不用但是还没想好说不定以后要用到。第二位表示禁止分片表示如果报文长度超过MTUIP协议就会丢弃该报文。第三位表示“更多分片”如果报文没有进行分片则该字段设置为0如果报文进行了分片则除了最后一个分片报文设置为0以外其余分片报文均设置为1最后一个分片报文该字段为0类似于结束标志类似于C语言的字符串以\0结尾13位片偏移framegament offset分片相对于原始数据开始处的偏移表示当前分片在原数据中的偏移位置实际偏移的字节数是这个值× 8得到的。因此除了最后一个报文之外其他报文的长度必须是8的整数倍否则报文就不连续了
注意被分片的报文都要重新封装IP报头 怎么知道一个IP报文是否被分片了 3位标志字段中的第三位标志位表示“更多分片”如果报文没有进行分片则该字段设置为0如果报文进行了分片则除了最后一个分片报文设置为0以外其余分片报文均设置为1 同一个报文的分片如何都能被识别出来 通过16位标识被分片的报文16位表示ID都是相同的 如何判断分片的报文哪一个是第一个哪一个是最后一个 最后一个分片的报文可以通过第三位标志位更多分和片偏移得知即更多分片标志位为0 片偏移0 即代表最后一个分片报文第一个分片报文通过多分片标志位为1 片偏移 0 进行判断如果满足则是第一个分片报文 如何得知被分片的报文有没有被收全如何进行组装哪个分片报文在前哪个平分报文在后 分片的报文是否收全通过13位片偏移判断当前的起始位置自身长度 下一个分片报文中填充的偏移量大小如果分片报文不全则直接丢弃让对端TCP重发整个报文如何组装也是通过13位片偏移判断对分片报文的片偏移量升序排序即可 如何保证组装起来的报文是正确的 通过16位首部检验和判断交付给上层TCP/UDP时TCP/UDP也会通过TCP/UDP自己的16位首部检验和判断进行判断如果校验失败则直接丢弃该报文 数据的分片和组装都是由IP层完成的 数据的分片和组装都是在IP层完成的上层的传输层和下层的链路层并不关心 分片好不好 答案是肯定是不好虽然传输层并不关心IP层的分片问题但分片对传输层也是有影响
如果一个数据在网络传输过程中进行了分片那么只有当接收端收到了全部的分片报文并将其成功组装起来这时我们才认为该数据被对方可靠的收到了但如果众多的分片报文当中有一个报文出现了丢包就会导致接收端就无法将报文成功组装起来这时接收端会将收到的分片报文全部丢弃此时传输层TCP就会重发该报文整个分片会增加丢包的概率假设丢包的概率是99.99%一个报文在IP层发生了分片分成了三个分片报文此时该报文丢包概率就会增加99.99%*99.99%*99.99% 99.99% 如何减少分片 实际数据分片的根本原因在于传输层一次向下交付的数据太多了导致IP无法直接将数据向下交给MAC帧如果传输层控制好一次交给IP的数据量不要太大那么数据在IP层自然也就不需要进行分片。
因此TCP作为传输控制协议它需要控制一次向下交付数据不能超过某一阈值这个阈值就叫做MSSMaximum SegmentSize最大报文段长度通信双方在建立TCP连接时会协商MSS的MAC帧的有效载荷最大为MTUTCP的有效载荷最大为MSS一般情况下MSS的值等于MTU减去IP和TCP协议头的长度因为IP和TCP协议头的长度一般都是20字节。而MAC帧的MTU一般是1500字节MSS MTU - 20 - 20所以MSS的值一般为1460字节因此为了避免数据分片建议TCP将发送的数据控制在MSS的大小以内但是需要注意的是不同网络链路的MTU可能不同如果数据在传输过程中经过MTU较小的网络仍然可能需要进行分片
总结来说实际数据分片的原因是传输层一次向下交付的数据太多了为了避免数据分片需要控制TCP发送的数据大小在MSS以内 分片的过程 假设IP层要发送3000字节的数据IP报头有效载荷由于该数据超过了MAC帧规定的MTU1500因此IP需要先将该数据进行分片然后再将一个个的分片交给MAC帧进行发送
假设IP层添加的IP报头的长度就是20字节并按下列方式将数据分片后形成了三个分片报文
分片报文报文字节总数IP报头字节数有效载荷16位标识更多分片标志位13位片偏移11500201480假设是1111021500201480111118536020401111370
注意13位片偏移当中记录的字节数是当前分片在原数据开始处的偏移字节数的值÷ 8得到的 关于组装的问题上面已经谈论了大部分不再赘述下一篇进入数据链路层的MAC帧协议
「 作者 」 枫叶先生
「 更新 」 2023.10.14
「 声明 」 余之才疏学浅故所撰文疏漏难免或有谬误或不准确之处敬请读者批评指正。