【Linux从青铜到王者】详解ip协议(待完善)

news/2024/11/20 6:26:25/

前言

之前我们讲的udp和tcp协议,是处于传输层的协议

而ip协议,是处于传输层下面的网络层的协议

一个报文传输的时候,表面上是一个主机的传输层运输到另一个主机的传输层,本质是其实是由应用层不断向下交付到数据链路层,再通过物理层通过各种信号什么的传输到对方的数据链路层,然后再不断向上解包分用

上一章我们讲tcp主要解决数据可靠地从一个主机传输到另一个主机,其实准确来说这是tcp/ip组合起来解决的

tcp主要是保证可靠性,ip则是提供将数据包从A主机运到B主机的能力

ip协议

以上就是ip协议的报文(报头+有效载荷)

有效载荷就是传输层tcp或者udp的完整报文,再加上ip自己的报头,组成一个完整的ip报文

32位目的ip和32位源ip地址

我们之前讲的,ip地址标明唯一主机,而端口号标明进程,所以ip+port可以表示互联网中唯一的进程

ip地址一共有32位,所以最大表示2^32,也就42亿,这个数字肯定远远满足不了现在需求的,所以就有了后面要讲的两个技术——NAT和IPV6,而网络也是分成公网和私网的

在认识ip协议的时候,我们也要体会到运营商在网络世界作出的不可磨灭的贡献

首部长度+总长度

4位首部长度和tcp报文里的一样,[0,15]×4,所以ip最大报头长度也是60字节,然后总长度减去报头长度就是有效载荷的长度,通过上面的关系也就能实现报头和有效载荷的问题了

8位服务协议

填传输层是tcp还是udp,发送方填充,对方识别,解决有效载荷向上交付的问题

第二行的16位标识和3位标记位和13位片偏移与数据链路层相关,放在后面一点再讲

网段划分

ip=网络号+主机号,但是ip地址总共也就42亿个,所以为了提高ip地址的利用率,将ip地址进行了分类,分成ABCDE五种,从前往后网络号占比增加,主机号减少

但是一个局域网内大部分都不会需要2^24个主机,大部分的需求是C类,所以C很快就不足了

所以为了再进一步提高ip地址的利用率,有了子网掩码技术

有了子网掩码以后,网络号和主机号的划分与这个ip地址是什么类无关

将ip地址与子网掩码按位与后得到的结果就是网络

子网掩码虽然提高了使用率,但ip地址仍然还是不够用的,所以有了NAT技术

NAT

关于路由器的知识:

每个路由器有两个ip地址,能构建子网

路由器有一张表,根据目标ip进行查找,如果表中不存在目标ip地址,则发送给默认路由

路由器在转发的时候,会将源ip替换成WAN口ip,有的时候端口也会进行替换

在一个局域网内,一个信息发送后会被所有主机接受,就如同石头掉入湖里激起的波纹

收到信息后,不属于自己的就会被丢弃

公网的ip地址是唯一的,内网的ip允许重复,这大大缓解了ip地址不足的问题

上图假设局域网以地区来划分,方便理解,实际情况并不是这么简单粗暴

中国通过路由器构建一个很大的子网,包含各个省区,这里是公网

每个省区也通过路由器构建自己的子网,包含每个市

如何循环...

这样一圈套一圈下来后,最后的几个圈就是内网了,内网内的ip地址不能重复,但是子网之间的ip地址可以重复

服务器都是部署在公网的,那么内网里的机器是如何访问到内网的呢?

假如我用微信发送一条信息给朋友,这条信息是要先到达微信的后台服务器的,而服务器的公网ip地址我们肯定是知道的

从发送信息的子网里寻找目标ip,路由器将目标ip与子网掩码按位与发现网络号不一样,证明不在当前子网内,向外转发并进行源地址的替换,如此循环

如果目标ip与子网掩码按位与后发现网络号一样,证明在当前子网内,接下来对在该子网内的所有主机发送arp请求,目标主机收到arp请求后发送arp应答给回给路由器,这样就知道了目标主机的mac地址,通过mac协议(数据链路层)才能进行实际的发送

ip地址标明方向,mac才有一跳一跳的能力

arp协议——同一子网内,根据目标ip地址,得到目标mac地址

局域网中,任何时候只允许一台主机发送数据,如果同时发送会产生数据碰撞的问题

划分碰撞域——交换机

主机得到arp应答,会将arp应答缓存起来(有时间限制),如果收到许多同类型的,会将最新的缓存起来

任何一台主机,都可能即会收到arp应答,又会收到arp请求

arp请求,广播报文

arp应答

分片

受限于物理底层各种因素,如果要传送的数据太大,是会分片的,也就是将一个大的数据分成几个小的数据来发送

分片一定是不好的,提高了数据的发送个数,增加了丢包概率

如何做到不分片呢?将每次发送的数据限制在规定大小内,这也是之前为什么tcp发送缓冲区画成一小格一小格的原因


http://www.ppmy.cn/news/1548428.html

相关文章

CTFL(六)测试工具

测试工具 测试自动化(test automation) 测试活动中的工具支持 测试工具支持并促进许多测试活动。示例包括但不限于: 管理工具 — 通过促进 SDLC、需求、测试、缺陷和配置的管理,提高测试过程的效率。静态测试工具 — 支持测试人…

Unity类银河战士恶魔城学习总结(P133 Merge skill tree with Parry skill把技能树和格挡技能相组合)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 完成了技能树上的格挡技能的UI逻辑 Parry_SKill.cs 核心功能 代码主要围绕以下功能展开: (1)技能解…

【IDER、PyCharm】免费AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1 Claude3.5

文章目录 CodeMoss 简介CodeMoss 的模型集成如何安装和配置 CodeMossIDER 插件安装步骤 CodeMoss 的实战使用AI 问答功能代码优化与解释优化这段代码解释这段代码 文件上传与对话联网查询与 GPT 助手联网查询GPT 助手 提升开发效率的最佳实践结语更多文献 CodeMoss 简介 CodeM…

蓝桥杯第22场小白入门赛

刚好牛客周赛和蓝桥杯周赛时间撞了,于是毅然决然选择了打牛客,结局是本蒟蒻被牛客薄纱/(ㄒoㄒ)/~~ 好吧,然后第二天就来水一水蓝桥杯了(bushi),小白入门赛和前几次一样,6道题只能写5道(什么时候…

【Vue笔记】基于vue3 + element-plus + el-dialog封装一个自定义的dialog弹出窗口组件

这篇文章,介绍一下如何使用vue3+element-plus中的el-dialog组件,自己封装一个通用的弹出窗口组件。运行效果如下所示: 目录 1.1、父子组件通信 1.2、自定义VDialog组件(【v-model】模式) 1.2.1、编写VDialog组件代码 1.2.2、使用VDialog组件 1.2.3、运行效果 1.3、自…

Vue3项目实战(vue3+vite+pinia+element-plus+axios+mock)

许苑后台管理系统 一、项目介绍1、技术栈2、业务功能3、应用场景4、项目源码 二、项目实战2.1、项目初始化2.2、项目实战1、引入router配置2、App.vue组件引入3、创建RootView根路由组件4、依次创建5、进行对应各个环境的配置环境设置 一、项目介绍 1、技术栈 vue3vitevue-rou…

《YOLO:目标检测领域的璀璨之星》

《YOLO:目标检测领域的璀璨之星》 一、YOLO 目标检测算法二、YOLO 的技术原理(一)YOLOv1 的原理(二)后续版本的改进 三、YOLO 与其他目标检测算法的比较(一)与 DETR 的比较(二&#…

倒计时功能分享

今天想要分享的是一个面试题,也是一个我们在项目中常用的功能:倒计时。 首先我们在写倒计时的时候必须要考虑到是:准确性、性能。接下来我们一步一步实现这个完美地倒计时功能。 setInterval 先来简单实现一个倒计时的函数: func…