【网络】网络层协议IP

目录

IP协议报头

报头分离和向上交付

四位版本

8位服务类型

16位总长度

八位生存时间

16位标识一行

网段划分

DHCP

私有IP范围

公网划分之CIDR

特殊的IP地址

缓解IP地址不够用的方法

NAT技术

代理服务器

NAT和代理服务器的区别

内网穿透和内网打洞

路由


IP是用来主机定位和路由选择的,它提供了一种能力,就是将数据从A点跨网络送到B点。

并且这种能力并不是一定能完成,而是有较大概率能完成。

我们在网络世界中追求的就是将数据可靠送达可靠用的策略是TCP,而送达用的就是IP的能力

就是因为TCP和IP只是负责把数据送到,跟什么业务无关,所以可以做进操作系统

我们平时也见过很多IP,IP都是由目标子网+目标主机构成的

我们的网络世界可以看成一片区域为一个子网(局域网),比如一个学校,一个村庄或一个小区等,每个子网中都有一个工业级路由器,这些工业级路由器之间可以互相转发报文

所以IP协议是如何进行主机定位和报文转发的呢?

1.根据目的IP,进行局域网之间的转发(工业级路由器之间)

2.局域网内,进行内网转发

IP协议报头

这个报头总共也是20个字节,和TCP一样

报头分离和向上交付

IP报头分离靠的是4为首部长度,它存的是报头和选项的总长度,基本单位仍然是4字节,最大可表示60个字节

IP报头向上交付靠的是8位协议,这里面存的就是上层协议的类型(udp/tcp)

四位版本

四位版本中存0100就表示IPV4(用32位表示源,目的IP)

存0110就表示IPV6(用128位表示源,目的IP)

并且这两种版本是独立的,不相互兼容

因为32位最多能表示的IP地址个数就是2^32次方,大概是40多亿,在当今社会肯定是不够用的,所以为了发展,能有更多的IP地址,就有了IPV6。但是因为目前大部分设备使用的都是IPV4,IPV6不好推广,所以一般IPV6在内网中容易被替换使用

所以前面说的IPV4地址不够用,但是现在也没说用到竭尽了,用的是一种NAT技术

8位服务类型

8位服务类型是你可以选择数据在网络中走的时候选用什么样的策略,比如延时小,成本低等

8位服务类型(Type Of Service),三位优先权字段(已经弃用),四位TOS字段,和一位保留字段(必须值为零)。

四位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能选择一个

对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要

16位总长度

16位总长度指报头+有效载荷的长度

八位生存时间

八位生存时间,我们可以把它看作一个计数器,每经过一个路由器计数就减一,计数器到0了就丢弃,就是为了防止报文在几个路由器之间循环转发的问题(因为上了规模的软件都是由BUG的,路由器中肯定是有软件的),这样不但不会把消息发到,还会浪费电力、网络资源

我们之前在写套接字的时候要把IP从点分十进制字符串转成网络序列的4字节IP就是因为协议中就是这样规定的(32位源、目的IP地址)

16位标识一行

我们前面说过网络中能够传输的最大数据包大小是mtu,也就是说数据链路层最多传1500个字节,那么如果IP的上层TCP传的字节数大于mtu,此时IP层就要进行分片和组装

其实让网络层进行分片是属于少量情况,因为分片缺点还是很大的,就是会增加TCP层丢包概率

因为同样一份数据,如果TCP一次交给IP,那么IP比如要分十片,这十片中只要丢一片对方的IP层就无法向上交付,就会触发TCP的超时重传十片;如果TCP分十次交给IP,IP丢一个TCP只需要超时重传一个即可

所以站在TCP角度分片传输是增加丢包概率的

那么下面就来解释一下16位标识这一行中三个部分的各自作用,IP就是通过这三个部分进行分片和组装的

16位标识:TCP传下的数据分成几片后唯一的标识,用来确定来自TCP的同样一个报文

3位标志字段:第一位保留(目前还没用到),第二位用于指示数据包是否可以被分片。当设置为1时,表示禁止分片。这意味着如果数据包的大小超过了沿途网络设备(如路由器)的最大传输单元(MTU),则整个数据包将被丢弃,而不是被分片传输。第三位设为1表示后面还有更多分片,为0表示后面没有分片了,类似于一个结束标记

13为分片偏移:是分片相对于原始IP报文开始处的偏移。因为这个只有13位,而报文总长度用16位表示,所以实际偏移的字节数是这个值*8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍。

网段划分

IP地址可以分为两部分,网络号和主机号

网络号:保证相互连接的两个网段具有不同的表示

主机号:同一网段内,主机之间具有相同的网络号,但必须有不同的主机号

下面说的私有IP地址指的是内网、子网、局域网

公网IP地址就是公网,只有入了公网才能入互联网

DHCP

我们连上路由器,那么路由器就会给我们一个IP地址,这种技术就叫做

DHCP(Dynamic Host Configuration Protocol 动态主机配置协议):能够自动的给子网内新增的主机节点分配IP地址,避免了手动管理IP的不便

一般的路由器都带有DHCP功能,因此一个路由器也可以看作一个DHCP服务器

私有IP范围

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上可以用任意的IP地址,但是RFC 1918规定了组建局域网的私有IP地址

10.*,前八位是网络号,共2^24,16,777,216个地址

172.16.*到172.31.*,前12位是网络号,共16*2^16,1,048,576个地址

192.168.*,前16位是网络号,共2^16,65,536个地址

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

公网划分之CIDR

把所有的IP看作一块大蛋糕,上面的私有IP已经占据了一部分,剩下的都叫做公网IP,那么对于这一大堆公网IP应如何划分呢?下面的划分方案叫做CIDR:

引入一个额外的子网掩码来区分网络号和主机号

子网掩码也是一个32位的正整数,通常前面一串1,后面一串0

将IP地址和子网掩码进行按位与操作,得到的结果就是网络号

下面我们来举一个简单的例子

比如IP地址是130.252.20.64,子网掩码是255.255.255.0(比特位是前面24个1,后面8个0)

那么它们进行按位与操作就得到了网络号,即为130.252.20.0

这个网络号的子网地址范围是130.252.20.0~130.252.20.255

特殊的IP地址

将IP地址中的主机地址全部设为0,就成了网络号,代表这个局域网(比如上面的130.252.20.0)

将IP地址中的主机地址全部设为1,就成了广播地址,用于给同一个链路中相互连接的所有主机发送数据包(比如上面的130.252.20.255,所以主机可用的IP范围是130.252.20.1~130.252.20.254)

127.*的IP地址用于本地环回测试,通常是127.0.0.1

就是说这个地址到了IP层会进行判断,发现是本地环回又会交给上层

缓解IP地址不够用的方法

上面说的CIDR只是提高了IP地址的利用率,减少了浪费,但是IP地址的绝对上线并没有增加,仍然不是很够用,这时候有三种方法来解决:

动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP不一定是相同的

IPV6,它用128位来表示一个IP地址,IP地址的绝对数量增加,但是还没有普及

NAT技术

NAT(Network Address Translation,网络地址转换)技术是一种将私有网络地址(如局域网内部地址)转换成公共网络地址(如互联网地址)的技术。这种技术通常应用于连接私有网络与公共网络之间的路由器上,实现多台计算机共用一个公网IP地址上网

也就是说其实公网IP是有限的,不可能每台计算机一个,但是至少可以保证比如一个城市一个公网IP(实际中会更复杂),运营商比如在一个城市内组建局域网,当然局域网内还有一个个的局域网,那么从这个城市中发出的所有信息在经过城市路由器后就会转化成城市的公网IP(公网中不会出现私有IP),这样消息就可以转发到各处了

上面的局域网的组建工作都是运营商做的,所以我们将来的所有的报文都必须走运营商,如果我们想访问外网IP,运营商就会给我们拦截

路由器要横跨两个网络,一个是LAN(Local Area Network局域网)口IP,一个是相对于局域网的更广阔的WAN(Wide Area Network广域网)口IP

所以私有IP在自己所在的局域网中不会重复,但是如果是不同的局域网,IP可能会重复,由于这种重复性,一个局域网中的主机和另一个局域网中的主机不通过公网是不能进行通信的(这就用到了后面说的内网穿透的技术);但是一个局域网中的不同主机是可以通信的

上面我们说了一个处于内网中的主机如何访问公网IP,其实就是通过一级一级的路由器,那么公网主机如何访问内网中的主机呢?

其实如果公网主机主动连接内网主机是不现实的,因为不同的内网主机的IP地址都会是相同的。所以只能是内网主机先连接公网主机,那么公网主机才能找到内网主机,其实就是通过路由器内部维护的NAT地址转换表叫做NAPT(Network Address Port Translation 网络地址端口转换)。

内网主机访问公网主机要经过路由器,每一级路由器不仅更换报文的源IP成自己的WAN口IP,还会建立源主机IP和自己WAN口IP的映射(为了保证唯一性,IP和port为一组建立映射),这样报文从公网中发回来到路由器,路由器根据这个映射关系就能查到要发给哪个主机的哪个端口,这种从内网主机到路由器,从路由器到内网主机都具有唯一性,叫做互为键值

如果两台内网主机的port相同,路由器建立映射的时候就要修改路由器端的port,就是为了让它们之间具有唯一性

NAT技术的缺陷:

1.无法从NAT外部向内部服务器建立连接(这其实也是保护了内网环境)

2.转换表的生成和销毁都需要额外开销

3.通信过程中一旦NAT设备异常,即使存在备用设备也用不上,所有的TCP连接都会断开(服务器以为和路由器建立了连接,设备异常备用路由器用不上)

代理服务器

代理服务器分为正向代理和反向代理

正向代理比如校园网,我们的设备只要连接上了校园网,我们所发的请求都要经过校园网,学校可以对我们的请求进行拦截;并且呢对于一些经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟;正向代理还可以实现突破网络限制,实现“翻墙”,访问海外资源和网站(比如我们在一台香港的服务器上部署正向代理,把我们的请求推送到海外网站,之后再把响应推送到我们的主机上,当然其中要进行加密处理)

反向代理一般是企业内部由反向代理服务器收到请求后负载均衡式的把请求分发给各个服务器

NAT和代理服务器的区别

1.从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题;代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像一些游戏加速器,也是使用的代理服务器

2.从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换;代理服务器是工作在应用层

3.从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网中做,也可以在广域网中做,也可以跨网

4.从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器

内网穿透和内网打洞

假如我们在一个局域网中的主机B中部署了一个服务,那么处于另一个局域网中的主机A应如何访问B的服务呢?这就用到了内网穿透

我们就需要一个公网上的云服务器作为代理服务器,B和云服务器建立好连接,A去访问云服务器,云服务器把请求发给B,这时A访问云服务器就相当于访问B

还是A要访问B上的服务,它们还是要先访问云服务器,这时沿途上的路由器的NAT转化表就全部建立好了。这时A直接访问B的出入口路由器即可,不用再访问云服务器了

路由

路由指的就是网络中的消息是如何转发的,主机和路由器都有路由表,下面是一个主机的路由表

其中Destination是目的网络地址,Genmask是子网掩码,Getway是下一跳地址,Iface是发送接口,Flags中U标志位表示此条目有效(可以禁用某些条目),G标志位表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经过路由器转发

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

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

相关文章

Qt菜单功能实现

本文介绍Qt菜单功能实现。 Qt开发过程中,菜单功能用的还是比较多的,本文针对菜单栏和右键菜单功能实现作简要描述。 1.菜单栏 1)界面设计 在界面中添加菜单栏(本例中名为“menubar”),并依次添加需要的菜单&#x…

2024 网鼎杯 - 青龙组 Web WP

2024 网鼎杯 - 青龙组 WEB - 02 打开容器一个登录界面,随便输入账号密码可以进到漏洞界面 这里有一个发送给boss的功能,一眼xss 有三个接口:/flag 、/update 、/submit /flag :要求boss才能访问,/update &#xf…

MySQL核心业务大表归档过程

记录一下2年前的MySQL大表的归档,当时刚到公司,发现MySQL的业务核心库,超过亿条的有7张表,最大的表有9亿多条,有37张表超过5百万条,部分表行数如下: 在测试的MySQL环境 : pt-archiv…

stm32使用串口DMA实现数据的收发

前言 DMA的作用就是帮助CPU来传输数据,从而使CPU去完成更重要的任务,不浪费CPU的时间。 一、配置stm32cubeMX 这两个全添加上。参数配置一般默认即可 代码部分 只需要把上期文章里的HAL_UART_Transmit_IT(&huart2,DATE,2); 全都改为HAL_UART_Tra…

大数据分库分表方案

分库分表介绍 分库分表应用场景 分库分表介绍 大数据分库分表是一种数据库架构技术,旨在应对大数据量场景下的数据库性能瓶颈。以下是对大数据分库分表的详细解释: 一、定义与背景 定义: 分库:将一个大型数据库按照一定的规则…

基础算法练习--滑动窗口(已完结)

算法介绍 滑动窗口算法来自tcp协议的一种特性,它的高效使得其也变成了算法题的一种重要考点.滑动窗口的实现实际上也是通过两个指针前后遍历集合实现,但是因为它有固定的解题格式,我将其单独做成一个篇章. 滑动窗口的解题格式: 首先,定义两个指针left和right,与双指针不同的…

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs,创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件(可选&…

Unity中IK动画与布偶死亡动画切换的实现

在Unity游戏开发中,Inverse Kinematics(IK)是创建逼真角色动画的强大工具。同时,能够在适当的时候切换到布偶物理状态来实现死亡动画等效果,可以极大地增强游戏的视觉体验。本文将详细介绍如何在Unity中利用IK实现常规…

2024阿里云CTF Web writeup

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 前言 又是周末…

云端到本地:深度学习日志与模型文件一键传输【详解 SCP 命令】

在深度学习项目中,模型的训练通常会在远程云服务器上进行。此过程会生成大量日志文件和模型文件(如检查点文件、模型权重等),这些文件对于后续的分析、调试和备份至关重要。本文将介绍如何使用 scp 命令,将云服务器上的…

第10章 多表查询

一、什么是多表查询 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立…

如何让ffmpeg运行时从当前目录加载库,而不是从/lib64

程序在linux下运行时,一般从 /lib64 目录下加载依赖的库文件,如xxx.so. 有时候,系统里没有这些库,也不想从系统目录下加载,怎么办呢? 看下面的调整过程。 使用的源代码是 ffmpeg-6.1.tar.xz 解压后&…

智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3

本系列文章记录“智能提醒助理”产品建设历程,记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍技术栈升级的过程,遇到的问题和解决方案。 一、需求出发点 智能提醒小程序 当前使用的是jdk8,springboot2.3,升级到jdk21和springboot3.3 学…

Redis-07 Redis哨兵

操作实现 此处应该6台虚拟机,其中3台是哨兵,但因为内存限制没有那么多 1.将sentinel文件拷贝到/myredis目录下 2.sentinel.conf文件重要参数 新建配置文件sentinel26379.conf sentinel26380.conf sentinel26381.conf bind 0.0.0.0 daemonize yes pr…

云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO

知孤云出岫-CSDN博客 目录 腾讯云双11活动介绍 一.双十一活动入口 二.活动亮点 (一)双十一上云拼团Go (二)省钱攻略 (三)上云,多类型服务器供您选择 三.会员双十一冲榜活动 (一)活动内容 &#x…

使用Python进行健康监测和分析的案例研究

健康监测和分析是指系统地使用健康数据来跟踪和评估个人或人群在一段时间内的健康状况。它包含一系列活动,从实时生理数据收集(如心率,血压和体温)到分析更复杂的健康记录(包括患者病史,生活方式选择和遗传…

归并排序算法

1、基本思想 归并排序是建立在归并操作上的一种有效的排序算法,它采用分治法的策略。其基本思想是将一个待排序的数组分成两个或多个子数组,先对每个子数组进行排序,然后再将已排序的子数组合并成一个最终的排序数组。 对于两个有序的数组&am…

Mysql、Dm8达梦数据库通过脚本导出指定库所有表的结构详情信息到

目录 前言二、Mysql三、达梦8 前言 在当今复杂多变的数据环境中,数据库作为信息存储与管理的核心,其重要性不言而喻。随着业务的不断拓展和深化,对于数据库表结构的理解与管理成为了确保数据一致性和准确性的关键。特别是在跨数据库系统的场…

Android OpenGL ES详解——纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素(Texture Pixel,也…

在vscode中开发运行uni-app项目

确保电脑已经安装配置好了node、vue等相关环境依赖 进行项目的创建 vue create -p dcloudio/uni-preset-vue 项目名 vue create -p dcloudio/uni-preset-vue uni-app 选择模版 这里选择【默认模版】 项目创建成功后在vscode中打开 第一次打开项目 pages.json 文件会报错&a…