🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:计算机网络
🌹往期回顾🌹: 【计算机网络】传输层TCP协议------协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、
🔖流水不争,争的是滔滔不息
一、传输层和网络层
网络层主要负责主机之间的逻辑通信,处理数据包的寻址和路由。它的核心功能包括:定义IP地址,确保数据包能够从源主机传输到目标主机、通过路由算法选择最优路径,避免网络拥塞、处理分片和重组,以适应不同网络的最大传输单元(MTU)。
**传输层则专注于端到端的通信,确保数据可靠、有序地传输。**主要功能包括:提供进程间的通信,通过端口号区分不同的应用程序、实现流量控制和拥塞控制,优化数据传输效率、支持可靠传输(如TCP)或不可靠传输(如UDP)。
网络层的的ip协议通过源主机ip找到目的ip主机,更像是一种实现网络通信的能力。传输层的如tcp协议保证报文数据如不丢包实现可靠传输,更像是网络通信的策略。网络层的ip协议和传输层的TCP协议,把数据100%可靠的从主机A跨网络的送到了主机B。
二、IP协议
IP(Internet Protocol)是互联网的核心协议之一,属于网络层协议,负责将数据包从源主机路由到目标主机。它定义了数据包的格式、地址分配规则以及路由机制,但不保证可靠性(如丢包、乱序等问题由更高层协议处理)。IP协议分为IPv4和IPv6两个主要版本。
ip协议提供一种能力,把数据从A主机跨网络送到B主机。所以必须要有一种方式标识通信两端主机的唯一性。ip协议解决的是主机到主机的问题。ip=目标网络+目标主机。
主机: 配有 IP 地址, 但是不进行路由控制的设备。路由器: 即配有 IP 地址, 又能进行路由控制。节点: 主机和路由器的统称。路由的本质是,网络在从源主机发往目的主机的路途中,从一个子网进入另一个子网。
协议头格式

- 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4。
- 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 length 4的字节数. 4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节。
- 16 位总长度(total length): IP 数据报整体占多少个字节。
- 8 位服务类型(Type Of Service): 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和1 位保留字段(必须置为 0). 4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性,最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要。
- 16 位标识(id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的。
- 3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类似于一个结束标记。
- 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了)。
- 8 位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
- 8 位协议: 表示上层协议的类型。
- 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏。
- 32 位源地址和 32 位目标地址: 表示发送端和接收端。
三、子网划分
引入子网划分的概念
网络发展到现在肯定是被设计过的,理解报文路由的时候是如何被设计的,下面举一个例子。
在学校中,分为很多个学院,有计算机学院、理学院、材料学院、化工学院、经管学院、每个学生都有学号,假设每个学院的学生开头学号都是一样的。比如计算机学院学生开头都是01,理学院学生开头都是02,化工学院学生开头是03,有了标识学院的开头数字,每个学院内部给每个学生标识的数字。假设每个学院内部都有个群聊,有一个大的群聊里面是每个学院的代表。有一个计算机学院的学生捡到了一个学生证(学生证只标识了学号),现在自己学院内部群聊问有没有是这个学生,发现不是,然后通过这个学生代表在学校大群问,找到了这个学生证所属的学院(比如是理学院),理学院的学生代表把这个学生证发到了理学院内部的群聊找丢学生证的人。
上面例子,学院就是子网,学生是主机号,学号是ip地址,学院前缀是网络号,学院代表是路由器,群聊是进行局部网络广播/子网通信,大群是核心网络公网。整个学校是运营商对网络进行设计。
划分学院,带上唯一编号的过程,就是子网划分。查找目标主机,必须查找目标网络,本质可以淘汰其他子网,可以是在全网中提高查找目标主机的效率。(内网是整体私有网络,子网是其细分网络段,子网的颗粒度更细)。
IP地址分为两个部分,网络号和主机号。
网络号:保证相互连接的两个网段具有不同的标识。
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。

不同的子网就是网络号相同的主机放到一起,如果子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号不能和当前子网中的其他主机重复。
通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的ip地址都不相同。一个子网内的一台主机的ip是路由器分配的,路由器有构建子网的功能,有一种技术叫做DHCP,能够自动给子网内新增的主机节点分配IP地址,避免手动管理IP的不便,一般路由器都带有DHCP的功能,因此路由器可以看做一个DHCP服务器。因为路由器是连接两个子网的桥梁,一个路由器至少要配置两套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
A类用途是大型网络(如大型企业)主机数量多。B类中型网络(大学、公司)。C类小型企业(小型办公室)。
但是这种分类方式,有很大的弊端。比如大多数企业都申请B类网络地址,B类很快就快用完了,A类就剩余了很多网络地址。另一个角度,A类网络地址主机数量大约是1677万台主机,在一个子网内如果没有这么多主机,造成大量地址都被浪费。
现代使用子网掩码的网络划分方案叫做 CIDR (无类域间路由,Classless Inter-Domain Routing)。
引入一个子网掩码的概念来区分网络号和主机号。子网掩码本质上是一个32位的"过滤器",用来提取ip地址的"网络号"部分。将ip地址和子网掩码"按位与"操作,得到的结果就是网络号。掩码位为1的位,表示这部分就是网络号,掩码位为0的位,表示这部分就是主机号。
子网掩码是实现"动态划分"的核心。选了多少个掩码位是1,就代表用多少位来划分网络号,其他剩下的位就是主机号。也就是说子网掩码定义了网络的大小和主机数量。
为什么要动态划分呢?如果一个网络地址ip是有154台主机号,但是这个网络只用到了10台主机,那么这个网络下就会浪费主机号。运用子网掩码对ip网络灵活划分,需要多少台主机就划分多少子网,不浪费任何ip地址和主机号 。这也就是说一个ip可以划分为多个ip这也就是子网划分最本质的特征。
例子一,ip地址和子网掩码按位与
ip地址 ->二进制1000 1100.1111 1100.0001 0100.0100 0100
子网掩码 ->二进制1111 1111.1111 1111.1111 1111 .0000 0000
网络号 ->二进制1000 1100.1111 1100.0001 0100.0000 ip地址和子网掩码按位与
子网地址范围->最大范围,看还剩多少个主机可以用,0000 0000 看子网掩码
例子二
ip地址 ->二进制1000 1100.1111 1100.0001 0100.0100 0100
子网掩码 ->二进制1111 1111.1111 1111.1111 1111 .1111 0000
网络号 ->二进制1000 1100.1111 1100.0001 0100.0100 0000
子网地址范围->最大范围,0000 转换为10进制就是15,64+15=79
将IP地址中的主机地址全部设为0,就得到了网络号,代表这个局域网。
将IP地址中的主机地址全部设为1,就成了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
127.0.0.0这个ip地址用于本机环回的测试。
四、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 技术
- IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;
五、私有IP地址公网IP地址
如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet (公网)上,理论上 使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
- 10.*,前 8 位是网络号,共 16,777,216 个地址
- 72.16.到 172.31.,前 12 位是网络号,共 1,048,576 个地址
- 192.168.*,前 16 位是网络号,共 65,536 个地址
包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP(或公网 IP);
区分网络的概念,公网指全球可访问的互联网,通过公共IP地址实现设备间的通信。内网(子网,局域网)指在特定组织或机构内部建立的专用网络,不直接对外开放。通常用于企业内部通信、资源共享或数据交换。我们用到网络都是内网。公网:内网是1:n。
在网络通讯的过程中,私有ip不能出现在公网上。
运营商
运营商是网络通讯基础设施的建设和维护者,负责提供物理网络(如光纤、基站)和核心服务(如带宽分配、IP地址管理)。其职责包括骨干网运营、互联互通协调及服务质量保障。
我们支付费用给运营商,才能上网,比如路由器上面说过有构建子网的能力能给子网内的主机分配ip,这个功能是运营商维护的,所以上网肯定要钱。😄运营商可以控制我们的报完发到公网,所以"wall"技术就是运营商把我们的报完"卡住的"🤪
一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网IP)。
路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中。不同的路由器, 子网 IP 其实都是一样的(通常都是 192.168.1.1). 子网内的主机IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了。
如上图,我们访问公网上的服务器,从内网到公网,报完通过源ip地址目的ip地址和端口号,经过路由器的路由到达我们要访问的服务器。上面提到私有ip不能出现到公网上,为什么?内网中有多个子网,子网中可能会有IP地址重复。由子网到公网报文的转发需要经过路由器的路由一跳一跳的到达公网进而到达所要访问的服务器,当子网ip地址经过这个子网的路由器,会把原来的ip地址换为这个路由器的WAN口ip,一直到出内网,到达公网上的服务器。如果服务器有应答报文,也是可以把报文返回一开始发报文的主机的,这就用到了NAT技术。
公网
很多初学者会误以为"公网只有一个",其实这是一个常见的误区。**公网并不是某一个具体的网络或 IP,而是指全球范围内唯一可达、不属于私有地址范围的 IP 地址空间。**只要是没有被划分为私有地址(如 192.168.x.x、10.x.x.x、172.16.x.x ~ 172.31.x.x),并且可以在 Internet 上直接通信的 IP,统称为"公网 IP"。全球的运营商、数据中心、服务器、家庭宽带用户等,都会使用到不同的公网地址段。因此,公网地址是巨大的,是互联网中"人人可见"的地址,而不是单一某个网段。
六、路由
在复杂的网络结构中, 找出一条通往终点的路线。
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程.
所谓 "一跳" 就是数据链路层中的一个区间。具体在以太网中指从源 MAC 地址到目的MAC 地址之间的帧传输区间。
IP 数据包的传输过程也和问路一样,当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP。路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。依次反复, 一直到达目标 IP 地址。
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表。
路由表可以使用 route 命令查看。如果目的 IP 命中了路由表, 就直接转发即可。路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:
这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络。
路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,Flags 中的 U 标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
如果要发送的数据包的目的地址是 192.168.56.3
跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不符。
再跟第二行的子网掩码做与运算得 到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去。
由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
如果要发送的数据包的目的地址是 202.10.1.2
依次和路由表前几项进行对比, 发现都不匹配。
按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器。
由 192.168.10.1 路由器根据它的路由表决定下一跳地址。
不知道大家有没有玩过死亡搁浅这款游戏,小岛秀夫把"连接"设计为游戏世界的主基调。
在网络世界中,路由器就像《死亡搁浅》里的"节点城市"。每个路由器都是一个信息孤岛,独立而又互联,负责连接前一个网络与下一个网络,就像连接着一座又一座被隔绝的城市。在广阔的互联网"荒野"中,数据包就是快递员山姆,一步步穿越子网、翻越协议层的高山,最终将信息送达目标设备。
在这个过程中,路由器不仅仅是转发者,更像是守卫边境的"守门人"------它通过路由表判断数据该走哪条路径,通过ARP协议(后面文章)解析下一跳的MAC地址,像一个智能导航器,指引数据在复杂的网络拓扑中找到最短的路。它不关心数据内容,只在乎数据该去哪里,像是城市之间的传送门,一头连着本地局域网,另一头通往下一个世界。
路由器的工作原理和地位------它们维系着整个互联网的运行秩序,是现实与虚拟之间的通信节点。
七、分片与封装
是什么分片?
分片就是把一个超出传输限制的大的IP数据包,切成多个小片,分别发送。每个片都有自己的ip头部最终由接收方在网络层重新拼装。
为什么要分片
在数据链路层,从上层接收的完整报文不能超过MTU。MTY是指某个链路一次最多传输的数据大小(以字节为单位)。最经典的以太网MTU=1500字节。
比如发了一个IP数据报,总长度4000字节,但是中途路由器发现数据链路层的MTU最大只能发1500字节,没办法只能把这4000字节的包分片成多个小包。
分片有很多问题,效率低------每个片都有头,开销大,容易丢包------只要丢一片整个包作废,重组复杂------接收方需要缓冲、等待、拼接碎片。
P 分片是因为链路层有 MTU 限制,为保证报文能顺利传输,IP 层会将超出限制的包"切片",接收方再重组。但代价高,因此在实践中要尽量避免!
如何分片和组装

分片和组装和这三个字段有关。
- 16 位标识(id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的。
- 3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类似于一个结束标记。
- 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 除以 8 得到的. 因此, 除了最后一个报文之外(之前如果都是 8 的整数倍, 最后一片的偏移量也一定是 8 的整数倍), 其他报文的长度必须是 8 的整数倍(否则报文就不连续了)。注意: 片偏移(13 位)表示本片数据在它所属的原始数据报数据区中的偏移量(以 8 字节为单位)
如何判断特别报文是否被分片?
3位标志字段中第三位标识更多分片,a判断更多分片是否是1,是1就是分片。b如果一个报文中更多分片是1都丢了就剩下一个更多分片是0了,但是片偏移要大于0,那么也表示分片了。a和b就能判断报文分片了。
如何保证把分片全收完了?
a相同的标识的分片聚合在一起。b那就得收不全是怎么样的来解释,如果第一片丢失那么这里的片偏移就是0,如果结尾丢失了就是没有更多分片是0的分片,如果中间丢失了把收到的所有分片按照偏移进行升序排序,片偏移+自身报完长度=下一个分片的片偏移数字,通过这样的方式来判断中间是否丢失。来保证包分片全收全了。
组装
其实通过上述把收到的所有分片按照偏移进行升序排序也是组装的过程。