【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台客户机进行同时聊天 所以要引入集群,多服务器。 但是客户连哪一台服务器呢?客户并不知道哪一…

django启动项目报错解决办法

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

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

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

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与各行业场…

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

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

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

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

记录java Collections.sort踩的坑

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

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

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

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

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

uniapp实现中英文切换

home.js const data {ZH: {content1: "苹果",},EN: {content1: “Apple”,} } export default dataindex.js import home from "./home.js" export default {home }en.js import part1 from ./data/part1/index.js const en {language: {name: "…

Android Studio 控制台输出的中文显示乱码

1. Android Studio 控制台输出的中文显示乱码 1.1. 问题 安卓在调试阶段,需要查看app运行时的输出信息、出错提示信息。乱码,会极大的阻碍开发者前进的信心,不能及时的根据提示信息定位问题,因此我们需要查看没有乱码的打印信息。…

基于yolov8、yolov5的行人检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要:行人检测在交通管理、智能监控和公共安全中起着至关重要的作用,不仅能帮助相关部门实时监控人群动态,还为自动化监控系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的行人检测模型,该模型使用了…

Java安全—log4j日志FastJson序列化JNDI注入

前言 log4j和fastjson都是这几年比较火的组件,前者是用于日志输出后者则是用于数据转换,今天我们从源码来说一下这两个组件为何会造成漏洞。 实验环境 这里的idea要进行一下配置,因为我们要引用第三方组件,而这些第三方组件都是…

【白话机器学习系列】白话 Softmax

文章目录 什么是 SoftmaxSoftmax 函数详解示例编程实现对矩阵应用 Softmax 函数 什么是 Softmax Softmax 函数,又称归一化指数函数,它使用指数函数将输入向量归一化为概率分布(每一个元素的范围都在 ( 0 , 1 ) (0,1) (0,1) 之间,…

C++系列之继承

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xf…

【微软:多模态基础模型】(5)多模态大模型:通过LLM训练

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微…