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

前言

之前我们讲的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.mzph.cn/bicheng/61380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch奇怪错误

ValueError: At least one stride in the given numpy array is negative, and tensors with negative strides are not currently supported. (You can probably work around this by making a copy of your array with array.copy().) 今天在这里遇到了一个奇怪的bug impor…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中,我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板,包括模型、逻辑、处理器、路由等,大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

集群聊天服务器(12)nginx负载均衡器

目录 负载均衡器nginx负载均衡器优势 如何解决集群聊天服务器跨服务器通信问题?nginx的TCP负载均衡配置nginx配置 负载均衡器 目前最多只能支持2w台客户机进行同时聊天 所以要引入集群,多服务器。 但是客户连哪一台服务器呢?客户并不知道哪一…

Springboot+Vue的项目搭建(二)

三个工具 一、Md5加密工具 MD5加密工具是一款用于数据加密的工具,它采用MD5算法将输入的数据转换成一个128位(16字节)的散列值(hash value)。以下是对MD5加密工具的详细介绍: MD5(Message-Di…

django启动项目报错解决办法

在启动此项目报错: 类似于: django.core.exceptions.ImproperlyConfigured: Requested setting EMOJI_IMG_TAG, but settings are not c启动方式选择django方式启动,以普通python方式启动会报错 2. 这句话提供了对遇到的错误的一个重要线索…

Linux:版本控制器git和调试工具cgdb

✨✨所属专栏:Linux✨✨ ✨✨作者主页:嶔某✨✨ 版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀…

Vue3 provide 和 inject的使用

在 Vue 中,provide 和 inject 是 Composition API 的一对功能,用于父子组件之间的依赖注入。它们的作用是让父组件可以向其所有子组件提供数据或方法,而不需要通过逐层传递 props。 1. provide provide 用于父组件中,提供数据或…

C++11——异常

1.异常概念 异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就会抛出异常,让函数的调用者处理这个错误 throw:当出现问题时,程序会抛出一个异常,通过 throw 来完成catch:catch 关键字捕获异…

Redis ⽀持哪⼏种数据类型?适⽤场景,底层结构

目录 Redis 数据类型 一、String(字符串) 二、Hash(哈希) 三、List(列表) 四、Set(集合) 五、ZSet(sorted set:有序集合) 六、BitMap 七、HyperLogLog 八、GEO …

AI风向标|算力与通信的完美融合,SRM6690解锁端侧AI的智能密码

当前,5G技术已经成为推动数字经济和实体经济深度融合的关键驱动力,进入5G发展的下半场,5G与AI的融合正推动诸多行业的数字化转型和创新发展,终端侧AI和端云混合式AI将广泛应用于各类消费终端和各行各业。 在推动5G和AI与各行业场…

简单工厂模式、方法工厂模式

简单工厂模式(Simple Factory Pattern) 简单工厂模式的核心思想是通过一个工厂类,根据提供的参数来决定创建哪一个具体的产品类实例。 这个模式通常用于产品种类较少,且不经常变化的场景。 interface Product {void create(); }…

torchvision库在进行图片转换操作中报antialias参数没有显式设置会导致不同图片后端中的值不统一的警告信息

诸神缄默不语-个人CSDN博文目录 这个警告信息是我在直接调用已经封装好的视觉模型时出现的,位置是: D:\anaconda3\envs\venv_path\Lib\site-packages\torchvision\transforms\functional.py:1603 警告信息全文是: UserWarning: The default…

【HOT100第四天】除自身以外数组的乘积,矩阵置零,螺旋矩阵,旋转图像

今天感觉是边界值练习专场。。。整体难度不大但是细节还是需要多动手写一写。 238. 除自身以外的数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意…

Angular中的ngOnchange()的汇总

ngOnChanges() 是 Angular 中的一个生命周期钩子函数,它在组件或指令的 输入属性(Input())发生变化时被调用。这个钩子可以帮助你检测输入数据的变化,并对数据变化做出反应。 1.监听的对象 ngOnChanges() 监听的是 通过 Input() …

百度智能云千帆大模型平台引领企业创新增长

本文整理自百度世界大会 2024——「智能跃迁 产业加速」论坛的同名演讲。 更多大会演讲内容,请访问: https://baiduworld.baidu.com 首先,跟大家分享一张图,这个是我们目前大模型应用落地的场景分布。可以看到,大模型…

记录java Collections.sort踩的坑

前言 java Collections.sort 排序失效?为什么会排序失效呢? 需求和问题 需求:获取指定文件夹下的所有文件,并且按照修改时间顺序从大到小排序,如果修改时间相同,则按照创建时间从大到小排序 // 输入lis…

【企业级分布式系统】ELK优化

文章目录 Elasticsearch作为日志存储时的优化优化ES索引设置优化线程池配置锁定内存,不让JVM使用Swap减少分片数、副本数 Elasticsearch作为日志存储时的优化 linux内核优化、JVM优化、ES配置优化、架构优化(filebeat/fluentd代替logstash、加入kafka做…

【Flutter 问题系列第 84 篇】如何清除指定网络图片的缓存

这是【Flutter 问题系列第 84 篇】,如果觉得有用的话,欢迎关注专栏。 博文当前所用 Flutter SDK:3.24.3、Dart SDK:3.5.3,网络图片缓存用的插件 cached_network_image: 3.4.1,缓存的网络图像的存储和检索用…

亚马逊商品详情API接口解析,Json数据示例返回

亚马逊的商品详情API接口(如Amazon Product Advertising API)允许开发者获取商品的详细信息,包括价格、描述、图片URL等。以下是一个示例的JSON数据返回结构,以及相应的解析说明。请注意,实际返回的数据结构可能会根据…

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…