计算机网络--网络层

📅 2026/7/27 20:39:40
计算机网络--网络层
前言关于网络层我刚开始学的时候还好越到后面越搞不懂这些那些的规定还有什么协议因此创作这篇文章来帮助和我一样对网络层很多非常抽象的概念加以了解。ps:本篇文章很大可能不会去用一些非常专业的术语去讲那些概念需要专业深度的小伙伴可以去找更加专业的文章去看哦我这篇文章会用不是那么专业的方式和比喻来达到让小伙伴们对网络层的某个“玩意”不再那么抽象是什么做什么的。那么网络层那么多内容你可能看到了各种名词子网、子网掩码、IPv4、RIP、OSPF等等........它到底重点在什么地方?首先在网络层我们引入了互相连接的网并且引入了路由器来帮助这些不同网络下的主机之间的通信。并且它在传输从应用层下发下来的数据的时候会对上层传下来的数据报再封装一次。好那么我们就把网络层的学习重点划分为三个IP、路由器、对上层数据报再一次封装三大核心任务IP、路由器、再封装目录IPIP编址分类IP编址无分类IP编制CIDR子网掩码子网划分地址解析协议ARP主机路由默认路由生动但不专业的比喻路由IP数据报格式细枝末节的补充ICMP网际控制报文协议IGMP(网际组管理协议)NAT网络地址转换结语一、IP一 IP编址分为两类分类IP编址和无分类IP编制CIDR1. 分类IP编址A、B、C、D、E类网共32位二进制比特8位为1组采用十进制表示x.x.x.x如下图所示这里我们分为网络号部分和主机号部分。需要强调比如A类地址前8位都是网络号但规定第一位必须是0后24位是主机号 为什么A类地址表示是1---126而不是0---127呢?0和127这两个数字段被保留用于特殊用途因此可用的A类网络号实际上是从1到126。详解1.网络号全0表示“本网络”一台新主机接入网络后没有IP地址。为了获取配置它会启动DHCP协议。在初始阶段主机会创建一个特殊的DHCP Discover数据包。因为这个包没有确定的源IP地址所以主机会将IP包的‘’源地址‘’字段设置为 0.0.0.0。同时由于主机也不知道DHCP服务器在哪里它会将这个包以‘’广播‘’的形式(目标IP地址为255.255.255.255)发送到当前局域网内。网络中的DHCP服务器收到这个广播包后就会响应并为其分配一个可用的IP地址。此过程理解为:新主机举着 0.0.0.0的牌子在小区里大喊广播到 255.255.255.255“物业DHCP服务器我是个新来的我需要一个门牌号IP地址”2.网络号为127127.x.x.x都属于本地回环地址。让一台主机能够将网络数据包发送给自己用于本机上的网络软件测试和进程间通信。其余特殊1.主机号全0:注意这里是主机号了这代表主机所在的网络代表的是网络。比如A类有一个叫10.0.0.0的网络不论内部怎么划分都是在这个A类网的前提下它是从整个互联网IP 地址总池中划分出来的。又如:B类x.y.0.0C类x.y.x.0这些‘主机号全0’的地址不能分配给任何一台计算机作为IP地址它们唯一的用途就是在路由表中标识一个网段。2.主机号全1如C类网中的x.y.z.255是定向广播地址用于向某个特定网络内的所有主机广播。与255.255.255.255地址的区别是255.255.255.255是受限广播地址它仅限于在发送方所在的本地网络内广播主要用于像DHCP这样在主机完全没有IP地址和网络信息的情况下进行通信。举例当你身处192.168.1.0网络时你发往192.168.1.255和255.255.255.255的数据包效果确实是一样的都只会在你的本地网络内传播。但当你想从网络外部比如从192.168.2.0网络对192.168.1.0网络进行广播时区别就出来了1. 你可以尝试发往192.168.1.255定向广播。2.你绝对无法发往255.255.255.255来达到目的因为路由器会阻止它。无分类IP编制CIDR一句话总结用斜线记法表示IP地址的网络号有几位。核心打破A/B/C类固定边界eg:128.14.35.7/2032bit10000000 00001110 00100011 00000111蓝色部分网络号20bit红色部分主机号(12bit)主机号全010000000 00001110 00100000 00000000128.14.32.0/20:表示本网络这就是CIDR地址块主机位全1仍代表该CIDR地址块的广播地址子网掩码我们通过CIDR 实现了对IP地址的灵活划分可是计算机根本不懂那一串32位的比特流哪里是网络号部分哪里是主机号部分因此引入子网掩码目的就是为了让计算机正确解析IP地址。格式根据CIDR的IP地址子网掩码与CIDR同样位数的网络号位全为1主机号为0.相与操作AND1和111和000和00eg:IP地址128.14.35.7/20对应子网掩码255.255.240.032bit10000000 00001110 00100011 0000011111111111 11111111 11110000 00000000相与: 10000000 00001110 00100000 00000000可以看到子网掩码会筛出IP地址的网络号部分。子网划分分为定长子网划分和变长子网划分。就是把一个网往下划分为更小的网定长子网划分是从主机号借位划分到网络号形成新的网络号。核心在于每个子网最后划分的主机号都是一样的此时会造成资源浪费。变长子网划分就是解决这个浪费。eg:有一个CIDR地址块193.115.21.0/24,A需要51个IP,B需要6个IP,C需要21个IP需划分3个子网定长子网划分193.115.21.0000 0000从主机号中划分2个比特为子网号可表示4个子网。00011011剩余主机号个主机减去主机全0和全1满足所需IP 数量此时A193.115.21.0000 0000/26 即192.115.21.0/26B:193.115.21.0100 0000/26 即192.115.21.64/26C:193.115.21.1000 0000/26 即192.115.21.128/26变长子网划分A需要51个IP,需6比特主机号193.115.21.0000 0000/26 即193.115.21.0/26B需要6个IP,需3比特主机193.115.21.0110 0000/29 即 193.115.21.96/29C需要21个IP,需5比特主机号193.115.21.0100 0000/27 即193.115.21.64/27ps:要注意子网号部分不能互为前缀A:00 B: 01100 C:010地址解析协议ARP数据在转发过程中IP始终不变变的是MACARP 就是一个请求知道对方IP所对应的MAC地址的协议。举例ARP请求问主机A想和同一局域网内的主机BIP_B通信。A会封装一个 ARP请求包。注这个包是广播包目标MAC FF:FF:FF:FF:FF:FF内容大概是“我的IP是IP_AMAC是MAC_A。请问IP_B的MAC地址是什么”关键点此时目标MAC地址在封装以太网帧时使用的是广播地址因为A还不知道B的MAC。ARP应答答局域网内所有主机都收到广播。只有IP_B的主机会处理这个请求并发送一个 ARP应答包其余主机丢弃。注这个包是单播包直接回复给主机A内容“我是IP_B我的MAC地址是MAC_B。”缓存结果记主机A收到应答后会把 IP_B - MAC_B这个对应关系存到自己的ARP缓存表中。后续发往B的数据包就可以直接填写B的正确MAC地址无需再次广播询问。主机路由VIP通道对特定目的主机的IP设置一个专门的路/32是它的”专属身份证“,即32位全是网络号。eg:a.b.c.d/32默认路由0.0.0.0/0,类似一个收容所所有找不到目的路由的都默认走这条路最长前缀匹配原则即我们不用担心0.0.0.0/0会与所有的IP 都能匹配的上导致所有IP 都去走这个默认路由了IP在路由表里的匹配基于最长匹配原则它会匹配路由表里所有的IP走和它最配的那一个IP的接口。举个不专业的例子一份外卖地址写的是192.168.1.100外卖员来了一看公司门口贴着告示路由表所有外卖一律默认放公司前台默认路由0.0.0.0/0ps192.168.1.100/32一个特定主机路由(外卖地址是192.168.1.100的专门放办公桌)根据最长前缀匹配原则外卖员将你的这份地址为“92.168.1.100”的外卖放到了你专门指定的一个地方办公桌指定的接口生动但不专业的比喻接下来我会用一个不太严谨的举例来完整的说明一下我一上描述的整个过程国家整个网给你这个学校A划分了一块地局域网A然后你这个学校要好好利用这块地你划分了不同子网图书馆教学楼公寓....定长划分还是会浪费比如公寓就不用图书馆这么大于是你想到了可变长的子网划分方式。你建好了学校之后你就考虑到了各个区域该怎么走啊你得建路吧你用了路标ARP来解析每个区域的MAC地址。然后学校的路你解决了你还要去学校之外的地方活动吧于是当你察觉到你要去的地方不再属于局域网A你就要通过路由器找到你的下一跳比如学校大门你要从学校大门走你明白了。你出去了之后开始通过路标APR找到每个结点的MAC地址甚至可能要经过很多路由器此时肯定也解析出了路由器的MAC地址这很重要这决定了你要去哪个接口最后你历经千辛万苦来到了局域网B。当你想去局域网B里面你基本都是走的局域网B的大门0.0.0.0/0因为这是一个任何人都能进的门然后你想去局域网B的图书馆你发现走0.0.0.0/0还是太远了最近的路上a.b.c.d/32。这是一个直接去局域网B图书馆的门那你肯定根据最长前缀匹配原则直接选择走了a.b.c.d/32。路由我们在传输数据的时候如何规划这条源地址到目的地址的路就是通过路由算法。当然这三个协议RIP、OSPF、BGP就是帮助路由找路。都是为了找到一个它们认为的“最佳”路径。这里我不再详细接受每个协议具体是怎么工作的需要更进一步学习的小伙伴可以去找其他博客看看需要明白的是它们的主要目的就是为了找到一个路径并且会定时更新路由表这就是我们路由表控制层面的辅佐协议生成路由表用于路由之间的路线就是通过这些协议不断更新路由表。这里我给大家贴一个王道书上对这三个协议的总结比较全面顺势我给大家再介绍一下SDN我们已经了解了路由器的作用无非就两个数据层面控制信息转发。控制层面规划路径通过运行某个路由协议规划各路由器之间的路更新路由表。路由器说我好累SDN看到了路由器的痛苦于是它来了它对所有路由器/交换机下令“你们数据层忘掉复杂的路由协议别再自己算路了。你们以后就变成一个‘傻白甜’只负责一件事——看我给你的‘流表’来转发数据怎么走由我控制层统一规划”于是SDN充当了控制层面的角色。SDN流表可以看源IP、目的IP、协议类型、端口号等等进行非常精细化的控制。比如“来自财务部的、去往视频网站的数据全部从低速链路走”。IP数据报格式这个我废了九牛二虎之力才理解了的东西博主比较笨。在介绍这个概念之前我一定要先给大家灌输一个概念当一个从上层传下来的数据报被网络层接收到的时候,网络层并不关心它传的是什么而只是加个IP头部进一步的封装而IP数据报格式就规定了这个IP首部具体内容都是什么各部分分别起什么作用。接下来我们以王道书IPv4的数据报格式为例介绍如图所示是这样一个图片横纵都有含义并且还是5层这让我一开始学习的时候分不清到底是一个32位的数据按照不同的划分会出现不同的含义是一条很长的数据还是一个5层表然后每一层32bit。接下来我们只讲首部也就是“封装”数据报的IP头部回答是一条很长很长的二进制比特流固定长度20B20*8160位即160个‘0’‘1’构成的一个比特流。然后它把这20B的固定部分每4B32bit一次划分给你展示它这么长的一个20B都包含了什么东西。固定字段20B版本4bit。指的是IP版本这里的是IPv4,即0100数值是4通信双方使用的IP版本必须一致首部长度4bit。这个就是说明一下我们这个IP 数据报的首部多长已知固定长度已经规定为20B那么它最小只能是01015了因为我i们每4B32bit一次划分。由于首部最长可以达60B20B规定的固定长度40B可变长度。15*4B60B最大111115最小为啥是01015固定部分20B正好占5行5×4B20B所以首部长度字段填0101十进制的5就表示我的首部长5个4B也就是20B。哪怕你没有任何可选字段最少也得把这5行写完所以最小值锁死为5。最大为啥是1111154个bit最多能表示 24−115也就是1111。15×4B60B这就是IP首部的理论上限60B。其中20B 是固定部分必须有剩下 40B 留给可选字段Options可选可不选选了就往里塞最多塞满40B即范围是5-15区分服务8bit。不重要。总长度16bit。表示了IP数据报的总长度首部数据部分这个是你要从网络层向数据链路层传输的东西因此虽然规定数据报总长度是,但是以太网帧的最大传输单元MTU是1500B因此数据报总长度不能超过1500B所以太长就会分片即IP数据报交给数据链路层时需要在数据报前再封装一个IP首部整个东西首部数据会被塞进以太网的数据字段而这个字段最多1500B。eg:假设首部告诉是0101数据报长度是1020B问数据长度多少数据报长度1020B首部数据部分由首部长度等到IP数据报的首部部分的长度是4B*520B数据长度1020B-20B1000B标识、标志、片偏移共同提供分片。上面说过了网络层向下传输数据报时不能超过数据链路层的最大MTU这是规定那我的数据报就是很长怎么办那就分开传呗一个很长的 首部数据部分分成几个 首部数据部分1 首部数据部分2 首部数据部分3标识16bit.同一个数据报的分片有相同标识。这是因为分片传输到另一个主机后会重新组装。而一个主机可能会一次性收到好几个主机发来的分片此时要靠标识来组装属于同一个数据报的分片。标志3bit。 MF:本分片的后面是否有分片。“0”没有“1”后面有DF是否允许分片。“0”允许“1”不允许片偏移13bit.一个很长的数据报分片后到另一个主机需要合并通过片偏移找到正确的顺序才能再次重新合成原先正确的数据报。以8B为一个偏移单位除最后一个分片其余长度都得是8B的整数倍你实在理解不了就想一下数组中从第一个数组找第二个数组不就是首地址1*一块数组的大小吗举个例子假设一个原始数据报的数据部分有3000字节。它被分片了分片1携带了0-1399字节的数据。它的片偏移 0表示从第 0 * 8 0字节开始。分片2携带了1400-2799字节的数据。它的片偏移 175表示从第 175 * 8 1400字节开始。分片3携带了2800-2999字节的数据。它的片偏移 350表示从第 350 * 8 2800字节开始。生存时间(TTL)8bit.最初以秒为单位最大生存时间为255秒路由器转发IP数据报时将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间若不为0就转发否则就丢弃。现在以“跳数”为单位路由器转发IP数据报时将IP数据报首部中的该字段的值减1若不为0就转发否则就丢弃。目的是为了防止IP数据报在路由里面因为找不到对应接口转发而反复兜圈。另外Traceroute路由追踪就是用的这个原理。协议8bit.指出数据报使用的什么协议核心目的多路分解。当网络层拆封IP数据报后告诉主机的操作系统应该把数据部分交给传输层的哪个协议去处理。TCP字段值为6、UDO字段值为17等。首部检验和16bit.检验首部部分是否出现错误路由器转发过程中都要重新计算首部检验和。源地址字段32bit目的地址字段32bit.可变部分40B当这个数据报需要一些特殊要求的时候会额外声明在可变字段里但由于规定IP数据报首部部分总长度必须4的整数倍因此当可变字段添加的bit流使得首部不再是4的整数倍时就会让填充字段补充到符合要求。类似于外卖订单的备注信息。总结来说我们在学网际层的ip数据报格式听起来很高大尚的名字其实就是给上层数据报再套一层包装的包装纸只不过这个包装纸细看就是由那固定的20B组成➕可变字段有可能有➕填充如果可变字段加上后不是4的整数倍构成的它就是给上层继续添加封装的“ip首部”当然它不只是单纯的只起一个封装作用他里面的每个部分的设计都是有一定的目的或者告知一个怎样的信息就比如在第三个32位比特里生存时间TTL就规定了他最多能中转多少次。细枝末节的补充ICMP网际控制报文协议尽管网络层提供的是不可靠传输我们依然想要努力可靠一点。ICMP相当于一个管理员的允许主机或者路由器向源主机“打个小报告”报告哪里出现了小差错。我们都熟悉的PING操作用来测试两台主机之间是否连通。IGMP(网际组管理协议)我讲一个故事就是大概让大家知道它是干什么的可能不够严谨。借鉴于beokayy小姐姐相当于一个聚会我是新来的来了介绍给所有人并且还会时不时问大家都活着没只整体问一次只要有人说活着那就继续更新聚会的状态比如又来了谁怎么怎么样的。等再次问的时候没有一个人回答活着。那么他就默认这个聚会已经结束了就再也不管了。一个聚会 一个组播组用一个组播IP地址来标识我是新来的来了介绍给所有人 主机发送“IGMP成员报告”报文主动声明“我要加入这个组”时不时问大家都活着没只整体问一次 路由器作为“IGMP查询器”定期发送一个“通用组查询”报文这个查询是发给“所有主机”组播地址的一次询问所有组。只要有人说活着那就继续更新聚会的状态 组内的任一成员收到查询后会发送报告报文作为响应。路由器只要收到至少一个响应就知道这个组播组里还有活跃成员需要继续为其转发流量。等再次问的时候没有一个人回答那么他就默认这个聚会已经结束了 如果在多次查询后路由器都没有收到任何成员的报告它就认为该组播组在本网段内已无成员于是停止转发对应的组播流量。NAT网络地址转换为了网络安全我们去上网不能把自己的真正IP暴露在互联网下NAT给我们的个人IP 套上一个马甲去访问互联网。具体非常详细的过程感兴趣的小伙伴可以去翻阅更加专业的资料哦。结语那么这一整个网络层差不多就是这样啦包括了我的个人理解还有一些比喻可能都不太严谨但在我看来计网的很多概念它就是很抽象如果我不把它的这个过程跟现实中的实际例子结合起来类比理解我很难真的去建立一个这些东西到底怎么组合起来工作的宏观架构。那希望我的这篇文章对你理解计网有所帮助欢迎纠错~