网络层协议——ip

在这里插入图片描述

文章目录

  • 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 网络地址转换)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM+vue框架的个人博客网站源码和论文

基于SSMvue框架的个人博客网站源码和论文061 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm (设计)研究背景与意义 关于博客的未来:在创办了博客中国(blogchina)、被誉为“…

华为云开发工具CodeArts IDE for C/C++ 开发使用指南

简介 CodeArts IDE是一个集成开发环境(IDE),它提供了开发语言和调试服务。本文主要介绍CodeArts IDE for C/C的基本功能。 1.下载安装 CodeArts IDE for C/C 已开放公测,下载获取免费体验 2.新建C/C工程 CodeArts IDE for C/…

基于Jenkins自动打包并部署docker环境

基于上一章 基于Jenkins自动打包并部署Tomcat环境_学习新鲜事物的博客-CSDN博客 1、安装docker-ce 在tomcat上创建远程命令 [roottomcat ~]# mkdir /data 在tomcat上构建 tomcat基础镜像。在构建基础镜像之前需要先安装 Docker 与 JDK。 [roottomcat ~]# wget -O /etc/yum.…

程序填空技巧1.0

程序填空要先知道这个程序要干什么,然后找到标准模板后对照模板填写,但当然不是让你做题的时候对照模板写,而是要把每种算法的标准模板背下来,但你肯定要问:邹邹,我哪里来的模板呢??…

unity 模型显示在UI上 并交互(点击、旋转、缩放)

项目工程:unity模型显示在UI上并交互(点击、旋转、缩放)资源-CSDN文库 1.在Assets创建 Render Texture(下面会用到),根据需要设置Size 2.创建UIRawImage,并把Render Texture赋上 3.创建相机&am…

【微服务】05-网关与BFF(Backend For Frontend)

文章目录 1.打造网关1.1 简介1.2 连接模式1.3 打造网关 2.身份认证与授权2.1 身份认证方案2.1.1 JWT是什么2.1.2 启用JwtBearer身份认证2.1.3 配置身份认证2.1.4 JWT注意事项 1.打造网关 1.1 简介 BFF(Backend For Frontend)负责认证授权,服务聚合,目标…

CMake3.27+OpenCV4.8+VS2019+CUDA配置

1、准备工作 CMake3.27+OpenCV4.8+opencv_contrib-4.8.0+CUDA+CUDNN+TensorRT下载好并安装cuda 2、正式开始安装 启动CMake开始配置 打开刚解压的cmake文件夹中找到bin目录下的cmake-gui.exe 点击cmake中左下角的 Configure进行第一次配置,会弹出选择环境对话框 …

Jmeter压测测试

Jmeter安装启动 1、Jmeter下载安装 模拟真正的大量并发请求 下载Jmeter:Apache JMeter - Download Apache JMeter 解压apache-jmeter-5.4.1.zip文件至目录下(不要有空格和中文) 2、配置JMETER_HOME 在系统中搜索设置 打开设置&#xff0…

【LeetCode-中等题】189. 轮转数组

题目 题解一&#xff1a;开辟数组 取模运算寻找位置(ik)mod n 新位置 思路&#xff1a;通过&#xff0c;开辟数组 取模运算寻找新位置------位置(ik)mod n 新位置 int[] newNums new int[nums.length];for(int i 0;i<nums.length;i){newNums[(ik)%nums.length] nums[i…

MBR400100CT-ASEMI肖特基模块400A 100V

编辑&#xff1a;ll MBR400100CT-ASEMI肖特基模块400A 100V 型号&#xff1a;MBR400100CT 品牌&#xff1a;ASEMI 封装&#xff1a;M2 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;400A 反向耐压&#xff1a;100V 芯片个数&#xff1a;2 引脚数量&…

算法通关村第十关——快速排序算法

1 快速排序基本过程 快速排序的是将分治法运用到排序问题的典型例子。力扣912题&#xff0c;给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 基本思想&#xff1a;是通过随机标记一个pivot元素将含有n个元素的序列划分为左右两个子序列left和right&#xff0c;其中…

el-table动态合并单元格

el-table使用这个方法合并单元格&#xff0c;:span-method“hbcell” <el-table size"small" :data"table.data" border empty-text"暂无数据" :cell-style"cellStyle" :header-cell-style"tableHeaderColor":span-meth…

Linux 终端命令之文件目录操作,对比Dos相关命令

目录 前言 基础命令&#xff08;文件目录相关的&#xff09; cd命令 【英文帮助】 【对应Dos命令】 pwd命令 【英文帮助】 【对应Dos命令】 ls命令 【英文帮助】 【对应Dos命令】 tree命令 【英文帮助】 【对应Dos命令】 mkdir命令 【英文帮助】 【对应Dos命令…

vscode的远程代码调试

目录 ssh连接 xdebug调试 ssh连接 在vscode中下载该插件 这里用虚拟机测试&#xff0c;这里用虚拟机测试&#xff0c;注意ssh是可以连接的 然后安装好remote后&#xff0c;点击左下角的>< 在弹出的这个上选择connect to host连接一台主机 配置完用户名和IP后再点一次发…

xsschallenge通关(11-15)

level 11 老规矩&#xff0c;先查看源码&#xff0c;做代码审计&#xff1a; <?php ini_set("display_errors", 0); $str $_GET["keyword"]; $str00 $_GET["t_sort"]; $str11$_SERVER[HTTP_REFERER]; $str22str_replace(">&quo…

微软宣布在 Excel 中使用 Python:结合了 Python 的强大功能和 Excel 的灵活性。

文章目录 Excel 中的 Python 有何独特之处&#xff1f;1. Excel 中的 Python 是为分析师构建的。高级可视化机器学习、预测分析和预测数据清理 2. Excel 中的 Python 通过 Anaconda 展示了最好的 Python 分析功能。3. Excel 中的 Python 在 Microsoft 云上安全运行&#xff0c;…

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

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

手把手教你搭建一个盲盒小程序,轻松掌握开发技巧

在当今社交媒体时代&#xff0c;微信公众号已成为企业、个人传播和推广的重要工具。而微信公众号盲盒小程序则是一个更为创新和互动的方式&#xff0c;能够吸引更多用户的关注和参与。下面&#xff0c;我们将为大家介绍一下微信公众号盲盒小程序的制作完全攻略。 1. 注册登录【…

MySQL数据库基本操作

目录 一、数据库中常用的数据类型 二、常用命令与操作 1.DDL数据库定义语言 1、登录用户的数据库 2、查看当前服务器中的数据库 3、切换/进入数据库 并 查看数据库中包含的表 4、查看数据库中表的结构 5、创建数据库 7、展示创建数据表时的结构 8、创建表&#xff0c…

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

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