网络层协议——ip

news2024/11/15 18:27:34

在这里插入图片描述

文章目录

  • 1. 网络层
  • 2. IP协议
    • 2.1 协议头格式
  • 3. 网段划分
    • 3.1 特殊的IP地址
    • 3.2 IP地址的数量限制
  • 4. 私有IP地址和公网IP地址

1. 网络层

在应用层解决了如何读取完整报文、序列化反序列化、协议处理问题。在传输层解决了可靠性问题。那么网络层IP的作用是在复杂的网络环境中确定一个合适的路径,将数据从A主机送到B主机。

2. IP协议

在这里插入图片描述
主机:配有IP地址,但是不进行路由控制的设备。
路由器:即配有IP地址,又能进行路由控制。
节点:主机和路由器的统称。

2.1 协议头格式

在这里插入图片描述
4位版本号(version):指定IP协议的版本,对于IPv4来说就是4

4位头部长度: IP头部的长度是多少个32bit,也就是 length * 4 的字节数,4bit表示最大的数字是15,因此IP头部最大长度是60字节。这里和TCP报头理解是一样的

8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要。对于ftp这样的程序,最大吞吐量比较重要。不过这个一般不用了。

16位总长度:IP数据报整体占多少个字节

16位头部校验和: 使用CRC进行校验,来鉴别头部是否损坏。

32位源地址和32位目标地址:表示发送端和接收端。

那么IP协议如何给上层进行分用呢?是交付给TCP还是UDP呢
在报头中,有8位协议: 表示上层协议的类型

如果由于网络的BUG或者对端主机不可达等不可控因素的存在,导致IP报文在网络中长时间游离,而不消失。该怎么办呢
8位生存时间:数据报到达目的地的最大报文跳数。一般是64,每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环

我们要知道:数据在网络层后还需要传给数据链路层,但是数据链路层有个规定:为了减小传输时的碰撞,它单次发送的有效载荷是有限制的。所以就有了IP分片的问题

需要对IP进行分片,是由谁来做
是由发送方的网络层来做的。

全部收到之后,是由谁来组装呢
是由对方的网络层进行组装。

如何进行组装呢
16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的
也就是说,一个IP报文它的16位标识是1234,如果被分片成3份,那么每份的报文的报头里的16位标识都是1234。

第一点我们要知道的是:我们要识别某个报文的分片的,还是没有分片的
3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片。这时候如果报文长度超过最大限制,IP模块就会丢弃报文。第三位表示"更多分片", 如果分片了的话,最后一个分片置为0,其它是1。类似于一个结束标记

13位分片偏移:是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其它报文的长度必须是8的整数倍(否则报文就不连续了)

根据这两个标记位,只要更多分片是1或者更多分片为0但是偏移量不为0。只要满足这两点就说明报文被分片过

第二点我们要将序号相同的报文收集到一起
我们如何判断我们收集的报文被收全了呢
根据偏移量,偏移量为0就是开头,然后下一个报文=上一个报文偏移量+上一个报文自身长度,这样就能判断有没有缺失的了。

第三点我们要正确的把分片报文组装起来
这里就根据偏移量进行排序,然后组装就行了。

如何进行分片呢
分片之后,每一个分片也是一个独立的IP报文,也要有报头

举个例子
假设传输层有2980个字节要传给网络层,网络层加上报头就是3000字节,但单次传输的上限是1500,那么网络层就需要分片。

这个例子,我们最少要分片成3份:
第一份:20+1480=1500
第二份:20+1480=1500
注意:分片下来的报文每个都需要添加自己的报头。
两个1480是2960,因为发送的有效载荷的大小是2980,所以还差20字节。那么第三份:20+20=40。这样才是正确的分片。

但是无论是发送方还是接收方,分片和组装行为,双方的传输层是不知道的,它只关系完整的一个报文
假设一个报文传输的丢包概率是1%,但是我们进行了分片,分成了3份,如果有一份丢失,就说明了整个报文丢失,那么丢包的概率就大大增加。其实网络层进行分片,不是主流的。

那么分片对UDP和TCP有影响吗
当然有影响,但是TCP有可靠性,可以重传,但UDP的影响就大大增加了。所以,我们可以进行设置不进行分片

那么如何减少分片呢
其实网络层不能决定分片还是不分片,这是由传输层决定的。网络层只是负责这个工作。一般在三次握手的时候,就会协商单次传输数据的报文大小。

那么传输层单个报文的大小一般设置成为多少合适呢

3. 网段划分

IP的构成:ip=目的网络+目的主机
网络号:保证相互连接的两个网段具有不同的标识。
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

IP在路由的时候,先根据目的网络进行路由,找到目的网络之后,再根据目的主机的主机号,进行数据转发。

所以,子网划分的作用是为了提高查找目标主机的效率

过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类
在这里插入图片描述
随着Internet的飞速发展,这种划分方案的局限性很快显现出来:例如申请了一个B类地址,理论上一个子网内能允许6万5千多个主机,A类地址的子网内的主机数更多。然而实际网络架设中不会存在一个子网内有这么多的情况,因此大量的IP地址都被浪费掉了。

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

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
子网掩码也是一个32位的正整数,通常用一串 “0” 来结尾。
将IP地址和子网掩码进行 “按位与” 操作,得到的结果就是网络号。
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关

下面举两个例子
在这里插入图片描述
IP地址与子网掩码做按位与运算可以得到网络号,主机号从全0到全1就是子网的地址范围
IP地址和子网掩码还有一种更简洁的表示方法。例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0

3.1 特殊的IP地址

1. 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
2. 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
3. 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。

3.2 IP地址的数量限制

我们知道: IP地址(IPv4)是一个4字节32位的正整数,那么一共只有2的32次方个IP地址,大概是43亿左右。而TCP/IP协议规定:每个主机都需要有一个IP地址。

难道一共只有43亿台主机能接入网络吗?
并且由于一些特殊的IP地址的存在,数量远不足43亿,另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加),仍然不是很够用。这时候有三种方式:
1.动态分配IP地址: 只给接入网络的设备分配IP地址。因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。
2.IPv6: IPv6并不是IPv4的简单升级版,这是互不相干的两个协议,彼此并不兼容,IPv6用16字节128位来表示一个IP地址。但是目前IPv6还没有普及

前面两种方法都不能很好的解决问题,但还有个NAT技术能解决这个问题。

4. 私有IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址:
10.,前8位是网络号,共16,777,216个地址。
172.16.到172.31.,前12位是网络号,共1,048,576个地址。
192.168.,前16位是网络号,共65,536个地址

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

在这里插入图片描述
一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP)。路由器LAN口连接的主机,都从属于当前这个路由器的子网中
所以,家用路由器和运营商路由器除了可以进行IP报文转发之外,还可以构建子网
那么当我们家里用的主机发送消息通过运营商路由器发送到公网,然后它需要给我们响应,那么响应的是我们家里的私有IP吗?前面我们说过,私网IP是不能出现在公网上的。因为家用路由器的子网IP是可以一样的

那么发送到公网的消息流程如下
我们要从家里主机发送到公网,那么假设开始IP是:192.168.1.201,目的IP是:122.77.241.3。首先会发送到家用路由器,它会发现我们发送的数据不在家用路由器的子网内,就会把开始IP是:192.168.1.201,替换成家用路由器的WAN口IP:10.1.1.2,然后发送到运营商路由器,它也能发现我们发送的数据不在运营商路由器的子网内,会被开始IP:10.1.1.2替换成运营商路由器的WAN口IP:122.77.241.4,由此就可以访问公网IP了。

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

那么公网怎么把响应发给我们呢
这个后面再说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931672.html

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

相关文章

自动化备份方案

背景说明 网上有很多教程,写的都是从零搭建一个什么什么,基本上都是从无到有的教程,但是,很少有文章提及搭建好之后如何备份,这次通过请教GitHub Copilot Chat,生成几个备份脚本,以备后用。 注…

【Java笔记】分布式id生成-雪花算法

随着业务的增长,有些表可能要占用很大的物理存储空间,为了解决该问题,后期使用数据库分片技术。将一个数据库进行拆分,通过数据库中间件连接。如果数据库中该表选用ID自增策略,则可能产生重复的ID,此时应该…

【Hadoop】Hadoop入门概念简介

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁 🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的…

阻止 form 表单的默认提交

目录 表单提交的3种形式1,默认提交2,submit 提交3,button 提交 阻止提交方法1—— return false方法2 —— 阻止 submit 的默认行为方法3 —— 针对 button 的处理 表单提交的3种形式 MDN - form 提交表单时,未指定 form.action …

Linux通过libudev获取挂载路径、监控U盘热拔插事件

文章目录 获取挂载路径监控U盘热拔插事件添libudev加库 获取挂载路径 #include <stdio.h> #include <libudev.h> #include <string.h>int main() {struct udev *udev;struct udev_enumerate *enumerate;struct udev_list_entry *devices, *entry;// 创建ude…

ANSYS软件安装包分享

目录 一、软件简介 二、软件下载 一、软件简介 ANSYS是一款全球领先的工程仿真软件&#xff0c;广泛应用于机械、电气、流体、热力学等领域。它提供了强大的建模、网格划分、材料库、边界条件和载荷、求解器、结果后处理、批处理和脚本编程、多物理场仿真、协同设计和教育版等…

史上最全 App功能测试点分析

1.2测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即 15个工作日&#xff09;&#xff0c; 根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.3测试资源 测试任务开始前&#xff…

STM32F103 USB OTA升级BootLoader (一)

1.配置外部高速晶振 2.勾选USB功能 3.将USB模式配置Virtual Port Com 4.将系统主频配置为72M,USB频率配置为48M. 5.配置好项目名称&#xff0c;开发环境&#xff0c;最后获取代码。 6.修改Flash大小和勾选Use Micro LIB 7.修改main.c代码 #include "main.h" #includ…

跨境新手看过来!各国营销禁忌盘点!别再盲目踩雷了!

本土化是跨境卖家出海制胜的关键因素之一&#xff0c;不管是卖家的产品&#xff0c;还是营销推广策略&#xff0c;都要符合目标市场的习惯&#xff0c;才会有较好的效果。而与此相反的&#xff0c;如果卖家在营销过程中&#xff0c;踩到了营销雷区&#xff0c;那结果也可想而知…

LeetCode 43题:字符串相乘

题目 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 "3&…

核污水会造成什么影响

目录 1.什么是核污水 2.什么是氚元素 3.氚元素的半衰期 4.核污水对人类健康的影响 5.我们应该采取什么措施保护自己 1.什么是核污水 核污水是指核设施&#xff08;如核电站、核燃料回收厂等&#xff09;产生的含有放射性物质的废水。核污水中可能含有放射性同位素、放射性…

国产化-银河麒麟V10系统及docker的安装

一、最近在研究国产化操作系统&#xff0c;“银河麒麟V10”&#xff0c; 在我电脑本机vmware 15的虚拟机中进行安装测试&#xff1b; 1.点击这里提交产品试用申请&#xff0c;不过只需要随便输入&#xff0c;手机号验证码验证后方可跳转至下载地址产品试用申请国产操作系统、银…

机器学习实战之用 Scikit-Learn 正则化方法解决过拟合详解

你是不是在模型训练中遇到过这样的问题&#xff1a;在训练集上表现得极好&#xff0c;但在测试集上效果不佳&#xff1f;这就是过拟合的问题。 过拟合是模型在训练过程中学到了数据的“噪声”而非规律&#xff0c;导致在未知数据上表现不佳。那么怎么解决这个问题呢&#xff1…

vue3将通用组件注册成全局组件

一、问题重现 我们用过vue的人都知道会有一个components文件夹用来存放我们的通用组件&#xff1a; 这里我的通用组件就有四个&#xff0c;但是有一些是使用评率比较高的&#xff0c;如果很多地方要使用我还得导入相同的组件&#xff0c;写的都是一样的代码&#xff1a; impo…

动态表情包怎么制作?分享一个一键生成gif动图的方法

跟朋友聊天时&#xff0c;经常会用很多有趣的表情包给朋友回复&#xff0c;那么除了利用系统提供的gif动画包&#xff0c;怎么才能完成gif图片制作&#xff08;https://www.gif.cn&#xff09;呢&#xff1f;下面就为大家分享一个一键生成gif动图的方法&#xff0c;通过简单的操…

msvcp110.dll丢失的解决方法,大家最常用的三个解决方法【教程】

win10是一款非常优秀的电脑系统&#xff0c;但有时候也会出现文件错误&#xff0c;比如msvcp110.dll丢失。这个问题可能会导致一些应用程序无法正常运行&#xff0c;甚至可能影响到系统的稳定性。那么&#xff0c;面对这样一个问题&#xff0c;我们应该如何解决呢&#xff1f;今…

C语言_分支和循环语句(1)

文章目录 前言分支语句循环语句一、什么是语句1.C语句可分为以下五类&#xff1a;2. 控制语句3.以下三类&#xff1a; 二、分支语句&#xff08;选择结构&#xff09;2.1 .1 if语句语法结构2.1.2 if书写形式的对比2.1.3 练习2.2 switch 语句 2.2.1 在switch语句中的break2.2.2 …

美团2面:5个9高可用99.999%,如何实现?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如网易、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; 问题1&#xff1a;你们系统&#xff0c;高可用怎么实现&#xff1f; 问题2&am…

根据案例写PLC程序-红绿灯控制

案例&#xff1a; 1、南北方向红灯点亮30s后熄灭&#xff1b; 2、在点亮南北方向红灯的同时点亮东西方向绿灯&#xff0c;并在点亮25s后&#xff0c;以0.5s熄灭0.5s点亮的时间闪烁3次后熄灭&#xff1b; 3、在东西方向绿灯熄灭后&#xff0c;东西方向黄灯点亮2s后熄灭&#xff…

手把手教你训练自己的Lora

本文教你手把手训练自己的Lora模型&#xff0c; 炼制的是Stable Diffusion的Lora模型。 1 准备工作 1.1 训练工具 当然&#xff0c; 我们可以使用Stable Diffusion的源码进行修改&#xff0c; 然后训练Lora模型。 但对于非专业用户来说&#xff0c; 这个门槛太高了。 推荐使…