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

【网络原理】TCP/IP五层网络模型之网络层-----IP协议详解,建议收藏!!

💐个人主页:初晴~

📚相关专栏:计算机网络那些事


        前几篇文章中我们深入研究了TCP协议,因为TCP协议在我们日常开发中的使用频率非常高。而相比之下,IP协议与我们普通程序员关系就没那么近了。一般是专门开发网络设备的程序员(开发路由器、交换机、防火墙)才会用到。不过,了解IP协议的构成与性质业可以加深我们对网络传输的理解,一定程度上能提高我们的认知,因此还是有必要学习一下的

一、初识IP协议

IP协议主要作用:

1、地址管理 ===>  IP地址

2、路由选择 ===>  对数据传输的路径进行规划

  • 主机: 配有IP地址, 但是不进⾏路由控制的设备
  • 路由器: 即配有IP地址, ⼜能进⾏路由控制
  • 节点: 主机和路由器的统称

协议头格式:

 4位版本

实际上只有两个取值:

4 ==> IPv4

6 ==>IPv6

4位首部长度

IP协议的报头与TCP类似,也是变长的

注意:这里的一位代表着四个字节

4位首部长度的表示范围:0=>15

  • 则其表示的实际报文长度范围:0=>60字节

8位服务类型

服务类型(TOS),即 “type of service”

3位优先权字段(已经弃⽤),4位TOS字段,和1位保留字段(必须置为0)
4位TOS分别表⽰:
  • 最⼩延时:数据从 A 到 B 的时间消耗最短
  • 最⼤吞吐量:数据从 A 到 B 单位时间内,传输的数据更多
  • 最⾼可靠性:一定程度上降低丢包的概率(IP协议并不像TCP那样有严格的可靠性)
  • 最⼩成本:设备上消耗的资源较少
注意: 这四者相互冲突,只能选择⼀个

16位总长度

表示IP数据报的长度。

与UDP协议一样也是16 位(2个字节),因此单个数据报最多只能传 64 KB的数据。但这并不是IP协议传输的极限。

IP协议有专门的拆包组包机制:当需要传输 64 KB以上的数据时,会自动把大的数据包,拆分成多个 IP 数据报携带传输,传输到接收方后再进行拼接。

16位标识、3位标志、13位片偏移

IP协议会自动拆包,同一个载荷的数据会被拆分成多份,交给多个 IP 数据报来携带。

  • 16 位标识

这多个 IP 数据报是相同的值,表示这些数据报是同一组的。

  • 13 位片偏移

决定组包时该数据报的位置。因为网络传输中存在“后发先至”问题,不能直接根据接收顺序进行组包

  • 3 位标志位

只有两个有效位。(剩下一个保留位)

  • 一个表示当前这个包是否需要组包(是否是拆包的一部分)
  • 另一个表示当前包是否为组包中的最后一个包(确认组包是否结束)

8 位生存时间(TTL)

表示一个数据包在网络中最多存活多长的时间

假如在构造一个 IP 数据报时,目的 IP 写错了,写成不存在的 IP 了,如果不加以限制,这样的数据报就会无限地传输下去,会浪费许多网络资源。而通过 TTL 就约定了传输的上限,达到上限时,数据报就会被自动丢弃掉。

  • TTL 的单位不是 s 或 min ,而是“次数”,指经过路由器转发的次数

当发送一个数据报时,会设置一个初始的 TTL 值(32,64,128等),数据报每经过一个路由器转发,TTL 就会 -1 (经过交换机并不会减少),一旦TTL减至 ,该数据报就会被路由器直接丢弃。

 可以通过 ping 命令来检测网络的联通性:

输入上述命令,就会向bilibili发送一个数据包,然后bilibili会返回一个响应。

该数据包初始 TTL 为64,而返回的 TTL 为56,说明传输中经过了 8 个数据包的转发,最终到达了b站

TTL 初始值设为 64 够用吗?

正常情况下,是非常充裕的。社会学中对此有专门的“六度空间”理论

并且在发送数据包时,还能将 TTL 设为128。因此一般不用担心TTL会不够用

8 位协议

记录 IP数据包中携带的载荷的传输层协议。

  • 即通过这里的记录,来告诉接收端该用 TCP 、UDP还是其它协议去解析数据。保证数据解析的准确性。

类似于 TCP/IP 报头中的“端口号”作用就是决定要将数据交给哪个应用程序,这里协议的记录就是为了决定要将数据交给哪个传输层协议进行解析

16 位首部校验和

验证数据在传输中是否出错(只针对首部,即IP报头)

因为载荷部分会由 TCP/IP 协议通过其校验和进行校验。

32 位源 IP 地址、32 位目的 IP 地址

这是IP数据报中最关键的信息,记录了数据包的起始地与目的地。

可以通过  ipconfig  命令查看本机的IP地址:

IP 地址是32位的整数, 不太方便让人直接阅读,通常会采用 “点分十进制” 的表示方法,即把 32 位 IP地址通过 “.” 号每 8 位一组分为 4 组,这样每组就是一个字节,范围是0-255。

因此 IP地址的表示范围就可以为 “0.0.0.0”“255.255.255.255”了。

二、地址管理

1、地址分配

IP 地址,是用来标识网络上的某一个设备,相当于互联网中的 “身份证”。这样,我们当然希望每个设备的 IP 地址都是唯一的。这样在网络通信中就能更方便地找到每一个设备了。

而上文中我们谈到,IP 地址是 32 位的整数。而 32 位表示的数据范围是 “0=>42亿9千万”

这个数字放在几十年前 IPv4 刚提出时还是个天文数字。那时候能网络上的设备数是远远达不到这个数字的,可以说绰绰有余。

但是在信息化高度发展的今天,不用说几乎人手一部的手机了,汽车、冰箱、手表、空调……等等,恨不得啥玩意都给你连个网。如今在在互联网上活跃的设备数已经远远超过 42亿9千万 了。

类似的问题在 UDP 协议中也出现过。那么 IP协议是如何应对这一问题的呢?我们接着往下看

1、动态分配 IP 地址

一个设备上网就分配 IP,不上网就不分配。这样,只要同时上网的设备数不超过 42亿9千万,就勉强还能应对了

不过这种方法治标不治本,还是不能从根本上解决问题。

2、NAT 网络地址转换

以一当千,通过一个 IP 代表一大波设备

将 IP地址分为两大类:

  • 内网IP/私网IP
  • 外网IP/公网IP

要求公网 IP必须是唯一的,但是私网 IP在不同的局域网中是允许重复的

这样运营商的公网 IP,不是服务一个设备,而是服务一个片区,可能有上万个设备。此时一个 IP 就代表了上万个设备,此时 IP 的利用率就大大提高了。

至于NAT的具体地址分配机制,博主之后会专门写一篇文章介绍

3、IPv6 协议

从根本上解决了 IP 地址不够用的问题。

  • IPv4通过 32 位 4个字节表示 IP地址
  • IPv6则通过 128位 16个字节表示 IP地址

注意,这提升的可不止是 4倍。这里每一位的提升都是指数关系。

4个字节能表示最多 2^{32},而16个字节最多可以表示 2^{128},相当于 2^{32}*2^{32}*2^{32}*2^{32}。什么概念呢?它可以做到给地球上的每一粒沙子都分配一个唯一的地址。

  • IPv6 那么好用,为什么现在还没有代替IPv4呢?

因为其提出的时间在上世纪 90 年代,时间上与 NAT 差不多。之所以 IPv6 推广举步维艰,就是因为 IPv6IPv4 并不兼容。

  • 如果要使用 IPv6 就需要更换新的设备,成本是比较高的
  • NAT 机制只需要给路由器设备更新升级软件就行了,不需要更换硬件。相比之下成本就低很多了

不过,目前 IPv6 在国内的普及率已经非常高了,超过 70%了。

2、网段划分

目前流行的划分方式是CIDR(Classless Interdomain Routing)
将 IP地址分为两个部分, ⽹络号和主机号
  • 左半部分:⽹络号
  • 右半部分:主机号

需要通过 “子网掩码” 区分出网络号与主机号。

子网掩码也是 32 位整数,左半部分全是 1,右半部分全是 0;

  • 比如这里的 “255.255.255.0” 就是 “11111111.11111111.11111111.00000000”
  • 所以上图中网络号就是 “192.168.100” ,主机号就是 “152”

还有一种更简洁的表示方式,如140.252.20.68/24,表⽰IP地址为140.252.20.68, ⼦⽹掩码的⾼24位是1,也就是255.255.255.0

网络中规定:

  • 同一个局域网中的设备,网络号必须相同,主机号必须不同

 在这个局域网中:

某个设备号不相同的话,就无法上网

某个设备的网络号虽然相同,但主机号和别的设备重复,也无法上网

路由器上有两种网络接口:

  • LAN口
  • WAN口

  • LAN口接局域网内的设备
  • WAN口接上层路由器

这里的路由器1就负责连接了两个局域网。这两个局域网就被称之为相邻局域网,IP地址的网络号就必须不同。如果相邻局域网网络号出现重复,就会导致无法正常上网。

3、特殊的 IP地址

1、主机号为全 0

此时这个IP就表示当前网段(相当于网络号

注意:给局域网中的设备分配 IP地址时,不能把主机号设为全0

2、主机号全 1

⼴播地址,⽤于给同⼀个链路中相互连接的所有主机发送数据包
一般会在手机投屏时使用:
手机上点击投屏按钮后,就会往对应的广播 IP上发一个 UDP数据包。
  • 收到这个数据包的设备不具备投屏功能,就不会做出反应
  • 收到这个数据包的设备具备投屏功能,就会返回一个响应,告诉手机自己的信息(如IP地址等)

3、127.* 环回IP(loopback)

  • 自发自收:给这个IP发数据,这个IP就会发一个相同的数据返回给该设备,相当于自己发给自己
一般使用环回IP进行测试。虽然我们写的网络程序一般都是要跨主机通信的。但是在代码研发阶段,往往需要在本机上自行测试。使用环回IP就能用一台主机模拟客户端与服务端的通信交互
一般使用的环回IP为 127.0.0.1

三、路由选择

网络是复杂的网状结构,从一个节点到另一个节点之间,可能会存在很多条路线。

就像现实中复杂的交通网络一般。当我们打开手机上的地图软件时,输入一个目的地,就会提供出多条线路供我们选择。

不过地图软件的路由选择与IP协议的路由选择是有本质区别的:

  • 地图软件:能够知道路线的全貌

从总体上规划出 “最优路线”(用时最短、成本最低、最少换乘)

  • 路由器:无法知道整个网络结构的全貌。只能知道其中的一小部分(每个路由器只知道其附近的设备的情况)

无法得到 “最优路线”,只能得到 “较优路线”

每个路由器都会维护一个路由表(类似于hash表):

  • key 就相当于 IP地址(网络号)
  • value 就是对应的网络接口(往哪个方向走)

这个路由表并不会记录网络中所有线路的信息,但是会记录与他相邻的一片区域的线路信息。

当 IP数据报到达路由器时,就会进行查表操作,判断IP数据报中的目的IP在路由表中是否存在。

  • 如果存在,则继续按照路由表指向的方向继续转发即可
  • 如果不存在,则会触发“默认的表项”,将数据报转发至更高层级的路由(认识的设备范围更广)

这样一级一级往上传,遇到认识目的 IP的路由器的概率就更高,最终成功找到目标路线,将数据报送达目的地


那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

相关文章:

【网络原理】TCP/IP五层网络模型之网络层-----IP协议详解,建议收藏!!

💐个人主页:初晴~ 📚相关专栏:计算机网络那些事 前几篇文章中我们深入研究了TCP协议,因为TCP协议在我们日常开发中的使用频率非常高。而相比之下,IP协议与我们普通程序员关系就没那么近了。一般是专门开发…...

三次握手与四次挥手

一、三次握手 AB之间 都会发送一个syn - ack。 A 先发 syn ,B收到 。 A: 什么都不知道 B:知道A可以发送。 B发送syn-ack,A收到 。 A: 知道B可以收也可以发 , B知道A可以发送。 A发送ack,B收到。 A : 知道B可以收也可以发 , B知道A…...

awk命令学习记录

awk命令 awk命令 表示将一行数据按特定分割符分割成多列,而从而选取特定列数的数据,默认分割符为空格,连接符默认也是空格 // 1. 更换分割符 awk -F : 1.txt // 1.txt为你的文件名 // 2. 打印多列 awk {print $1,$2} // $0为整行&#xff…...

科大讯飞嵌入式面试题及参考答案

平衡二叉树和普通二叉树的区别 平衡二叉树是一种特殊的二叉树,与普通二叉树相比有以下显著区别: 一、定义与结构 普通二叉树:二叉树是每个节点最多有两个子树的树结构。它没有特定的平衡要求,节点的分布可能比较随机。例如&#x…...

C Lua5.4.6 SDK开发库

下载 .lua执行 #include "lua.h" #include "lualib.h" #include "lauxlib.h"static int luaopen_ui(lua_State *L) {static const struct luaL_Reg lib_f[] = {{"saveFile", saveFile},{"loadFile", loadFile},{NULL, NULL…...

无线网卡知识的学习-- wireless基础知识(cfg80211)

1. 基本概念 mac80211 :这是最底层的模块,与hardware offloading 关联最多。 mac80211 的工作是给出硬件的所有功能与硬件进行交互。(Kernel态) cfg80211:是设备和用户之间的桥梁,cfg80211的工作则是观察跟踪wlan设备的实际状态. (Kernel态) nl80211: 介于用户空间与内核…...

Next.js 学习 - 路由系统(Routing)

Next.js 的路由系统基于文件系统,这意味着文件和文件夹的结构决定了 URL 路径。相较于传统的 React 应用中的路由配置,Next.js 的文件路由系统非常简洁和自动化。下面是对 Next.js 路由的详细介绍。 1. 目录结构 在 Next.js 13 中,app 目录…...

Unity XR PICO 手势交互 Demo APK

效果展示 用手抓取物体,调整物体位置和大小等 亲测pico4 企业版可用, 其他设备待测试 下载链接: 我标记的不收费 https://download.csdn.net/download/qq_35030499/89879333...

EM算法学习

1.EM算法的介绍 可以发现:计算出θA和θB的值的前提是知道A、B币种的抛掷情况。 所以我们需要使用EM算法:求出每轮选择硬币种类的概率 2.EM算法执行过程: 第一步:首先初始化设置一组PA和PB证明的值。然后通过最大似然估计得到每…...

019_基于python+django食品销售数据分析系统2024_4032ydxt

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…...

C语言笔记(数据的存储篇)

目录 1.数据类型的详细介绍 2.整型在内存中的存储:原码、反码、补码 3.大小端字节序介绍及判断 4.浮点型的内存中的存储解析 1.数据类型的详细介绍 下述是内置类型: char // 字符数据类型 short // 短整型 int // 整型 long …...

wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理的解决方法

前言 开头先讲讲wsl2启用代理的必要性,一般来说,会用wsl的都是开发者,那么就避免不了从网络上下载软件和应用,但是由于众所周知的原因,你使用apt,wget等工具下载国外网站的东西时,下载速度就会…...

CSS 居中那些事

一、父子元素高度确定 简单粗暴, 直接通过设置合适的 padding 或 margin 实现居中 <style>.p {padding: 20px 0;background: rgba(255, 0, 0, 0.1);}.c {width: 40px;height: 20px;background: blue;} </style> <div class"p"><div class"…...

Java项目-基于springboot框架的智能热度分析和自媒体推送平台项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…...

跨平台进程池背后的思想

背景是基于业务需求,需要实现一个跨平台的项目。项目中由于有部分功能存在大量计算,所以打算单独分配一个进程去进行计算。 进程池的实现与线程池的实现逻辑上如出一辙。但是实现上进程池的实现会比线程池实现复杂的多,主要比较复杂的点的就在于并发安全的任务队列。…...

前端性能优化之加载篇

前端页面加载的过程其实跟我们常常提起的浏览器页面渲染流程几乎一致: 网络请求,服务端返回 HTML 内容。 浏览器一边解析 HTML,一边进行页面渲染。 解析到外部资源,会发起 HTTP 请求获取,加载 Javascript 代码时会暂停页面渲染。 根据业务代码加载过程,会分别进入页面开始…...

数据结构(栈)

每当误会消除冰释前嫌的时候&#xff0c;故事就距离结尾不远了。 栈 概念与结构 1. 栈⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进行插入和删除元素操作。 2. 进行数据插入和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。 3. 栈中的数据元素遵守后进先出的原则…...

Aspose.PDF功能演示:使用 JavaScript 从 PDF 中提取文本

在数据提取、业务文档自动化和文本挖掘方面&#xff0c;使用 JavaScript 从PDF中提取文本非常有用。它允许开发人员自动执行从 PDF 收集信息的过程&#xff0c;从而显著提高处理大量文档的生产力和效率。在这篇博文中&#xff0c;我们将学习如何使用 JavaScript 从 PDF 中提取文…...

计算机系统简介

一、计算机的软硬件概念 1.硬件&#xff1a;计算机的实体&#xff0c;如主机、外设、硬盘、显卡等。 2.软件&#xff1a;由具有各类特殊功能的信息&#xff08;程序&#xff09;组成。 系统软件&#xff1a;用来管理整个计算机系统&#xff0c;如语言处理程序、操作系统、服…...

学习文档10/18

MySQL高性能优化规范&#xff1a; 数据库命名规范 所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用 MySQL 保留关键字&#xff08;如果表名中包含关键字查询时&#xff0c;需要将其用单引号括起来&#xff09;数据库对象的命名要能做到见名识意…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...