当前位置: 首页 > news >正文

计算机网络之网络层超详细讲解

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

计算机网络之网络层超详细讲解

收录于专栏【计算机网络】
本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 
  

目录

网络层

IP 协议 

基本概念 

协议头格式 

网段划分 

特殊的 IP 地址 

IP 地址的数量限制

私有 IP 地址和公网 IP 地址 

路由 


网络层

在复杂的网络环境中确定一个合适的路径.

IP 协议 

基本概念 

主机 : 配有 IP 地址, 但是不进行路由控制的设备.

路由器 : 即配有 IP 地址, 又能进行路由控制;

节点 : 主机和路由器的统称. 

协议头格式 

4位版本号 (version) : 指定 IP 协议的版本, 对于 IPv4 来说, 就是4

4位头部长度 (header length) : 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 数据报整体占多少个字节.

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位目标地址 : 表示发送端和接收端

选项字段 (不定长, 最多40字节)

网段划分 

IP 地址分为两个部分, 网络号和主机号

网络号 : 保证相互连接的两个网段具有不同的标识

主机号 : 同一网段, 主机之间具有相同的网络号, 但是必须有不同的主机号. 

不同的子网其实就是把网络号相同的主机放到一起.

如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复

通过合理设置主机号和网络号, 就可以保证相互连接的网络中, 每台主机的 IP 地址都不相同. 

那么问题来了, 手动管理子网内的 IP, 是一个相当麻烦的事情.

有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便.

一般的路由器都带有 DHCP 功能, 因此路由器也可以看做一个 DHCP 服务器.

过去曾经提出一种划分网络号和主机号的方案, 把所有 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

随着Internet 的飞速发展, 这种划分方案的局限性很快显现出来了, 大多数组织都申请 B类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址

例如, 申请一个B类地址, 理论上一个子网内能允许6万5千多个主机, A类地址的子网内的主机数更多.

然而实际网络架设中, 不会存在一个子网内有这么多的情况, 因此大量的 IP 地址都被浪费掉了

针对这种情况提出了新的划分方案, 称为 CIDR (Classless Interdomain Routing):

引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号

子网掩码也是一个32位正整数, 通常用一串 "0" 结尾

将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号.

网络号和主机号的划分这个 IP 地址是 A 类, B类还是 C类无关. 

下面举两个例子

IP地址140.252.20.688C FC 14 44
子网掩码255.255.255.0FF FF FF 00
网络号140.252.20.08C FC 14 00
子网地址范围140.252.2.0 ~ 140.252.20.255
IP 地址140.252.20.68

8C FC 14 44

子网掩码255.255.255.240FF FF FF F0
网络号140.252.20.648C FC 14 40
子网地址范围140.252.20.64 ~ 140.252.20.79

子网掩码与网络号的关系

子网掩码用于确定网络号的主机号的划分. 子网掩码中连续的 1 表示网络号部分, 连续的 0 表示主机号部分.

在第一个例子中, 子网掩码是 255.255.255.0, 对应的二进制是 : 
11111111, 11111111, 11111111, 00000000. 这意味着前 24 位是网络号, 后 8 位是主机号.

在第二个例子中, 子网掩码是 255.255.255.240, 对应的二进制是 : 

11111111.11111111.11111111.11110000. 这意味着前 28 位是网络号, 后 4 位是主机号

那么第一个例子 : 

网络号是 140.252.20.0, 主机号部分有 8 位

主机号全 0 时是网络地址 : 140.252.20.0

主机号全为 1 时是广播地址 : 140.252.20.255

子网地址范围是 140.252.20.0 ~ 140.252.20.255 (除去网络地址和广播地址, 实际可用的主机地址范围是 140.252.30.1 ~ 140.252.20.254)

第二个例子 : 

网络号是 140.252.20.64, 主机号部分有 4 位

主机号全 0 时是网络地址 : 140.252.20.64

主机号全为 1 时是广播地址 : 140.252.20.79

子网地址范围是 140.252.20.64 ~ 140.252.20.79 (除去网络地址和广播地址, 实际可用的主机地址范围是 140.252.30.65 ~ 140.252.20.78)

可见, IP 地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围 : 

IP 地址和子网掩码还有一种简洁的表示方法, 例如 140.252.20.68/24, 表示 IP 地址为 140.252.20.68, 子网掩码的高24位是1, 也就是 255,255,255.0 

特殊的 IP 地址 

将 IP 地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网

将 IP 地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包

127.* 的 IP 地址用于本机环回 (loop back) 测试, 通常是 127.0.0.1 

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 地址只用于局域网内的通信, 而不直接连到 Iternet 上, 理论上使用任意的 IP 地址都可以, 但是 RFC 1918 规定了用于组建局域网的私有 IP 地址

10.* 前8位是网络号, 共 16,777,216 个地址

172.16* 到 172.31.*, 前 12 位是网络号, 共 1,028,576 个地址

192.168.*, 前 16 位是网络号, 共 65536 个地址

包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP (或公网 IP)

一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP , 一个是 LAN 口 IP (子网 IP)

路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中

不同的路由器, 子网 IP 其实都是一样的 (通常是 192.168.1.1) 子网内的主机 IP 地址不能重复, 但是子网之间的 IP 地址就可以重复了.

每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点, 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN 口 IP 就是一个公网 IP 了.

子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换 (替换成 WAN 口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP, 这种技术称为 NAT (NetWork Address Transiation, 网络地址转换)

如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网 IP 的服务器上, 这样的而服务器可以在阿里云/腾讯云上进行购买.

路由 

在复杂的网络结构中, 找出一条通往重点的路线;

路由的过程, 就是这样一跳一跳 (Hop by Hop) "问路" 的过程.

所谓 "一跳" 就是数据链路层中的一个区间, 具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间. 

IP 数据包的传输过程也和问路一样.

当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP

路由器决定这个数据包是直接发送给目标主机, 还是需要发送给下一个路由器

依次反复, 一直到达目标 IP 地址了. 

那么如何判定当前这个数据包发送到哪里呢? 这个就依靠每个节点内部维护一个路由表; 

路由表可以使用 route 命令查看

如果目的 IP 命中了路由表, 及直接转发即可

路由表中的最后一行, 主要由下一跳地址和发送接口两部分组成, 当目的地址与路由表中其它都不匹配时, 就按缺省路由条目规定的接口发送到下一跳地址.

假设某主机上的网络接口配置和路由表如下: 
 

DestinationGetwayGenmaskFlagsMetricRefUse Iface
192.168.10.0*255,255,255.0U000 eth0
192.168.56.0*255.255.255.0U000 eth1
127.0.0.0*255.0.0.0000 lo
default192.168.10.10.0.0.0UG000 eth0

这台主机由两个网络接口, 一个网络接口连到 192.168.10.0/24网络, 另一个网络接口连到 192.168.56.0/24 网络

路由表 Destination 是目的网络地址, Genmask 是子网掩码, Gateway 是下一跳地址, Iface 是发送接口, Flags 中的 U 标志标识此条目有效 (可以禁用某些条目), G 标志表示此条目的下一跳地址是某个路由器的地址, 没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络, 不必经路由器转发

转发过程例1 : 如果要发送的数据包的目的地址是 192.168.56.3

跟第一行的子网掩码做与运算得到 192.168.56.0, 与第一行的目的网络地址不符

再跟第二行的子网掩码做与运算得到 192.168.56.0, 正是第二行的目的网络地址, 因此从 eth1 接口发送出去

由于 192.168.56.0/24 正是与 eth1 接口直接相连的网络, 因此可以直接发到目的的主机, 不需要经路由器转发 

转发过程例2 : 如果要发送的数据包的目的地址是 202.10.1.2 

依次和路由表前几项进行对比, 发现都不匹配

按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器

由 192.168.10.1 路由器根据它的路由表决定下一跳

相关文章:

计算机网络之网络层超详细讲解

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之网络层超详细讲解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 …...

代码随想录算法训练营day51|动态规划part13

回文子串 回文子串这里的递推式不太一样,dp[i] 和 dp[i-1] ,dp[i 1] 看上去都没啥关系。所以要回归到回文的定义 而我们发现,判断一个子字符串(字符串下标范围[i,j])是否回文,依赖于,子字符串…...

ESP8266自制桌宠机器狗

看到别人的桌宠机器狗有没有想要拥有一台的冲动,其实我们可以使用少量的资金自制一台机器狗 1 硬件 esp8266芯片 舵机 超声波传感器 2 接线 ESP8266配件...

【力扣】409.最长回文串

问题描述 思路解析 因为同时包含大小写字母,直接创建个ASCII表大小的桶来标记又因为是要回文子串,所以偶数个数的一定可以那么同时,对于出现奇数次数的,我没需要他们的次数-1,变为偶数,并且可以标记出现过…...

git 拉取代码时报错 gitignore Please move or remove them before you merge.

git 拉取代码时报错, The following untracked working tree files would be overwritten by merge: .gitignore Please move or remove them before you merge. 当你在使用 Git 进行代码拉取(通常是执行 git pull 或 git merge 命令)时遇到这…...

19,[极客大挑战 2019]PHP1

这个好玩 看到备份网站字眼&#xff0c;用dirsearch扫描 在kali里打开 爆破出一个www.zip文件 访问一下 解压后是这个页面 class.php <?php include flag.php; error_reporting(0); class Name{ private $username nonono; private $password yesyes; publi…...

MQTT消息服务器mosquitto介绍及说明

Mosquitto是一个开源的消息代理软件&#xff0c;支持MQTT协议&#xff08;消息队列遥测传输协议&#xff09;。MQTT是一种轻量级的发布/订阅消息传输协议&#xff0c;专为低带宽、不可靠网络环境下的物联网设备通信而设计。以下是关于Mosquitto服务器的一些介绍和说明&#xff…...

uniapp结合movable-area与movable-view实现拖拽功能

前言 因为公司业务开发需要拖拽功能。 ps&#xff1a;该功能只能针对高度一致的&#xff0c;如果高度不一致需要另外二开 演示 开始 <template><view style"height: 100%;"><movable-area :style"{width: 100%, height: allHeight px}"…...

十九(GIT2)、token、黑马就业数据平台(页面访问控制(token)、首页统计数据、登录状态失效)、axios请求及响应拦截器、Git远程仓库

1. JWT介绍 JSON Web Token 是目前最为流行的跨域认证解决方案&#xff0c;本质就是一个包含信息的字符串。 如何获取&#xff1a;在使用 JWT 身份验证中&#xff0c;当用户使用其凭据成功登录时&#xff0c;将返回 JSON Web Token&#xff08;令牌&#xff09;。 作用&#xf…...

文生图模型开源之光!ComfyUI - AuraFlow本地部署教程

一、模型介绍 AuraFlow 是唯一一个真正开源的文生图模型&#xff0c;由Fal团队开源&#xff0c;其代码和权重都放在了 FOSS 许可证下。基于 6.8B 参数优化模型架构&#xff0c;采用最大更新参数化技术&#xff0c;还重新标注数据集提升指令遵循质量。在物体空间和色彩上有优势…...

spring boot之@Import注解的应用

我们知道spring boot会通过ComponentScan定义包扫描路径进行业务定义的bean的加载&#xff0c;但是对于很多不在此包路径下定义的bean怎么办呢&#xff1f;比如其他jar包中定义的。这时候import就发挥作用了&#xff0c;通过它也可以实现bean的定义。具体是怎么做的呢&#xff…...

【记录】用JUnit 4的@Test注解时报错java.lang.NullPointerException的原因与解决方法

项目场景&#xff1a; 在练习黑马点评的逻辑过期解决缓存击穿时&#xff0c;编写了一个预热缓存数据的单元测试 SpringBootTest public class HmDianPingApplicationTests {Resourceprivate ShopServiceImpl shopService;Testpublic void testSaveShop() throws InterruptedE…...

Spring Boot 自动化脚本-多线程批量压缩图片

Spring Boot 自动化脚本-多线程批量压缩图片 支持多线程支持多路径配置支持断点续压支持压缩后文件层级路径不变脚本一键启动&#xff0c;支持本地 main 调用或远程 POST 接口调用 背景&#xff1a;在进行数据迁移时&#xff0c;发现附件文件夹过于庞大&#xff0c;且大都为图…...

依托 Spring Boot框架,精铸高扩展性招聘信息管控系统

1 绪 论 1.1 课题背景与意义 在Internet高速发展的今天&#xff0c;计算机的应用几乎完全覆盖我们生活的各个领域&#xff0c;互联网在经济&#xff0c;生活等方面有着举足轻重的地位&#xff0c;成为人们资源共享&#xff0c;信息快速传递的重要渠道。在中国&#xff0c;网上管…...

【前端】理解 JavaScript 对象属性访问的复杂性

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;理论基础&#xff1a;JavaScript 对象属性的访问模式1. 点符号访问&#xff08;Dot Notation&#xff09;2. 方括号访问&#xff08;Bracket Notation&#xff09;点符号…...

Django异步视图adrf解决办法

提问 在Django编写异步视图的时候会出现 AssertionError: Expected a Response, HttpResponse or HttpStreamingResponse to be returned from the view 或者 TypeError: sync_to_async can only be applied to sync functions. 诸如此类的错误的时候一般发生在异步视图中…...

【一文了解】C#基础-接口

目录 1. 定义 2. 接口的特点与规则 3. 接口的实现 3.1单接口实现 3.2多接口实现 4. 接口的作用和用途 1)扩展行为 2)规范行为 3)降低耦合 5. 接口与继承的比较 1)继承 2)接口 6. 接口与抽象类的比较 1)IComparable(比较器&#xff0c;常用) 2)IComparer(比较器)…...

活着就好20241210

亲爱的朋友们&#xff0c;大家早上好&#xff01;&#x1f31e; 今天是10号&#xff0c;星期二&#xff0c;2024年12月的第十天&#xff0c;同时也是第50周的开始&#xff0c;农历甲辰[龙]年十一月初六日。在这晨光熹微的美好时刻&#xff0c;愿那温暖而明媚的阳光轻轻拂过你的…...

多表设计 - 一对一多对多

一.一对一关系概述&#xff1a; 例如&#xff1a;一位用户只能有一张身份证&#xff0c;一张身份证也只能对应一位用户 如果用户基本信息查询频率比用户身份信息查询频率高&#xff0c;为了提高效率&#xff0c;可拆分为两张表&#xff1a; 此时如何体现一对一的关系呢&#xf…...

实现 DataGridView 下拉列表功能(C# WinForms)

本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能&#xff0c;并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表&#xff0c;并在选择某一项时触发事件。 2.…...

使用Java创建RabbitMQ消息生产者的详细指南

目录 在现代分布式系统中&#xff0c;消息队列是实现异步通信的重要工具。RabbitMQ作为一种流行的开源消息代理&#xff0c;支持多种消息协议&#xff0c;广泛应用于微服务架构和事件驱动的应用程序中。本文将深入探讨如何使用Java创建RabbitMQ的消息生产者&#xff0c;发送消息…...

【LC】160. 相交链表

题目描述&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&…...

Spark架构及运行流程

Spark架构图 Driver&#xff1a; 解析用户的应用程序代码&#xff0c;转化为作业(job)。创建SparkContext上下文对象&#xff0c;其负责与资源管理器(ClusterManager)通信&#xff0c;进行资源的申请、任务的分配和监控等。跟踪Executor的执行情况。可通过UI界面查询运行情况。…...

Linux安装Python2.7.5(centos自带同款)

卸载已安装的python,防止版本兼容问题 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 删除残余文件 whereis python |xargs rm -frv 安装前提是已安装gcc和g gcc --version g --version 下载安装python2.7.5 https://www.python.org/downloads/release/pyt…...

上传ssh公钥到目标服务器

创建密钥 ssh-keygen -t rsa -b 4096 -C "xxxx.xx"上传 sudo ssh-copy-id -i /Users/xx/.ssh/id_rsa.pub root127.0.0.1...

【LLMs】用LM Studio本地部署离线大语言模型

文章目录 一、下载LM Studio二、下载大语言模型1. 查看模型介绍2. 点击模型文件进行下载2.1 完整下载2.2 部分下载 三、加载模型1. 打开LM Studio图形化界面&#xff0c;点击**My Models**2. 然后&#xff0c;点击“...”&#xff0c;选择“change”&#xff0c;选择刚下载好的…...

SpringBoot下类加入容器的几种方式

SpringBoot下类加入容器的几种方式 在 Spring Boot 中&#xff0c;类加入容器的方式不仅多样&#xff0c;而且每种方式都有其特定的使用场景。以下是几种常见的将类加入 Spring 容器的方法及其适用场景&#xff1a; 1. 使用 Component 及其派生注解 使用场景&#xff1a;当开…...

【Mysql】忘记Root密码后如何不影响数据进行重置密码

方法一&#xff1a;通用方法--启动时跳过权限表 1> 停止数据库 以管理员方式打开cmd&#xff01;&#xff01; C:\Users\Administrator>net stop mysql MySQL 服务正在停止.. MySQL 服务已成功停止。 2> 启动时跳过权限表 mysqld --console --skip-grant-tables -…...

宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!

项目展现问题&#xff1a; Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxx.宝塔外链.ip.xxxx:6379 redis客户端连接失败&#xff1a; 1、宝塔中确认redis端口已放行 2、修改redis的配置 bind&#x…...

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…...