网络层ip协议

news/2024/9/17 8:37:31/ 标签: tcp/ip, 网络

一.概念

        ip协议主要是为了在复杂的网络环境中确定一个合适的路径来传输主机间的数据。简单来说就是用来确定主机的位置。

    ip协议中的一些设备如下:

  • 主机: 配有 IP 地址, 但是不进行路由控制的设备;
  • 路由器: 即配有 IP 地址, 又能进行路由控制;
  • 节点: 主机和路由器的统称;

 二.协议头格式

  • 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4.
  • 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 length 4 的字节数. 4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节.
  •  8 位服务类型(Type Of Service): 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和 1 位保留字段(必须置为 0). 4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延 时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要
  • 16 位总长度(total length): IP 数据报整体占多少个字节.
  •  8 位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是 64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了.要是用来防止出现路由循环。(就是数据在主机中传输转圈了)。
  • 8 位协议: 表示上层协议的类型(TCP或UDP)
  • 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏.
  •  32 位源地址和 32 位目标地址: 表示发送端和接收端.
  • 选项字段(不定长, 最多 40 字节):

剩下的这几个和ip分片有关,后面讲。 

 

三.网段划分(重要) 

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

  •  网络号: 保证相互连接的两个网段具有不同的标识;
  •  主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号  

        不同的子网其实就是把网络号相同的主机放到一起.如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复 。就是说子网的网络号相同,只是子网中不同主机的主机号不同。

        那么怎么划分网络号和主机号呢?

        划分网络号和主机号的方案有多种,最常见的是CIDR(Classless Interdomain R)

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
  • 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号,剩下的就是网络

 如下面的子网

        子网范围就代表主机号范围。

        IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为 140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0。

        这种划分方法可以充分利用ip地址。根据子网主机的数目多少来设置子网掩码,从而不浪费ip地址。

特殊的ip

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

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

IP 地址的数量限制:

        我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP 地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址. 这意味着, 一共只有 43 亿台主机能接入网络么? 实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址. CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP 地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决

  • 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的 设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
  • NAT 技术(后面会重点介绍);
  • IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼 容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;

        如果一个组织内部组建局域网,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,不参与公网的组建。

      在网络世界中,主机间的关系如下:

         

        我们的主机一般都在子网中,当我们访问公网的服务器时,由于私有ip不在公网中,不能直接访问,会将数据传输给自己子网中路由器,路由器至少有俩个ip(子网ip,WAN口ip),横跨俩个网络(相当于桥梁,沟通俩个网络),数据在路由器中层层传递, 最终传输给到横跨公网和私网的路由器最终传输给公网。

        这里有几个重点:

  •         一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网 IP).
  •         路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中
  •         子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换 (替换成 WAN口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP. 这种技术称为 NAT(Network Address Translation,网络地址转换).

        详细过程如下图:

         

        如果我们要从ip端口为192.168.1201:12345的主机访问ip和端口为127.77.241.3:80的抖音服务器,过程如下:首先用目的ip与主机IP跟ip掩码运算,计算出不在同一个网段,于是发送给路由器,路由器将收到数据的源IP端口替换成自己的WAN口ip端口,从新进行p掩码运算,计算出不在同一个网段,传给上级路由器,上级路由器重复操作,替换源ip端口,最终通过横跨公网和私网的服务器将数据传输到公网,最终访问到服务器。

        这样我们就实现了将数据传输给公网服务器。通过上述讲解,我们也能明白一个问题,为什么我们不能访问推特等外国服务器,因为我们在私网中,访问外国服务器,需要经路由器传递,路由器是国家做的,可以限制你对一些服务的访问,不将你的数据传输出去。

        这里我们有一个问题,数据是怎么回来的?其实在传输的过程中路由器会维护一张表,记录路由转换。

如客户端A和B同时向服务器发送请求,如果他们的端口号碰巧相同,都为1025,路由器会将源IP的替换为自己的,同时为A和B分配建立不同的端口,避免重复。如:

        当服务器返回消息时,对于A 的消息 源:163.221.12.9:80 目的:202.244.174.1025,对于B 源:163.221.12.9:80 目的:202.244.174.1026。这样由于端口号不同,通过分别就能找到A和B的ip和端口。从而实现消息的返回。

        在主机中为了方便进行转发,会维护一张路由表。记录下对应ip的发送ip。

        

  •  这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络 接口连到 192.168.56.0/24 网络;
  •  路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一 跳地址,Iface 是发送接口,Flags 中的 U 标志表示此条目有效(可以禁用某些 条目),G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发; 

他会将将要发送的目的ip和路由表中的ip进行对比,从而确认下一跳(Gateway)的ip,如果没有找到对应的IP,则选择默认ip(一般是路由器)进行发送。 

五.ip的分片和组装 

        数据链路层会规定一次传输的数据最大字节数,但是ip接收到要传输的数据可能超过这个规定,因此需要进行ip的分片和组装。

        在Linux下使用ifconfig命令可以查看对应的MTU(最大传输单元(Maximum Transmission Unit,MTU))。

        那么如何进行ip 分片和组装呢?主要依赖于报头中的下列字段:

  • 16 位标识(id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片 了, 那么每一个片里面的这个 id 都是相同的.
  • 3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要 用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类 似于一个字符串的结束标记.
  • 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 *8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).

        分片就一定要确保顺利组装。 16 位标识(id)可以表示特定报文的分片,3位标志位可以确定报文是不是到结尾,13位分片偏移,可以将分片按顺序组装,同时通过读取每一段的报文中的16位总长度,可以确定有没有片段丢失。需要注意的是即使一个片段丢失,所有分片都要重发。

 


http://www.ppmy.cn/news/1522843.html

相关文章

vue多环境配置和打包

件名的后缀来指定它们仅在特定模式下被加载。 .env:所有环境下都会加载的通用配置。 .env.local:本地覆盖配置,不加入版本控制。 .env.[mode]:仅为指定的模式加载的配置文件,例如.env.development、.env.production、…

Claude Enterprise推出计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

探究零工市场小程序如何改变传统兼职模式

近年来,零工市场小程序正逐渐改变传统的兼职模式,为求职者和雇主提供了一个更为高效、便捷的平台。本文将深入探讨零工市场小程序如何影响传统兼职模式,以及它带来的优势和挑战。 一、背景与挑战 传统的兼职市场往往存在信息不对称的问题&am…

本地Gitblit使用

首先创建一个本地的gitblit的服务,创建流程如下: 【GitBlit】Windows搭建Git服务器详细教程_搭建gitblit服务-CSDN博客 GitBlit的使用教程-CSDN博客 创建好一个仓库后,分配好用户权限,再将项目拉下来,这里是再visua…

C++如何创建一个单例模式的类

单例模式(Singleton Pattern)是一种创建型设计模式,其核心目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式通常用于管理共享资源,如配置文件、线程池、缓存等。在C中,创建一个…

页面小组件-表格封装(基础版)

说明 这一版封装的主要原因是当时有很多报表&#xff0c;数据列很多很多&#xff0c;基本在二十个左右。相应领导安排简洁代码&#xff0c;也为了偷懒&#xff0c;直接插槽循环搞起。其余是为了统一样式修改。 组件源码 <template><el-tablev-loading"loading…

DML、DQL、DCL的基础介绍

1.DML、DQL、DCL 1.1DML-介绍 DML英文全称Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改操作 添加数据&#xff08;INSERT&#xff09;修改数据&#xff08;UPDATE&#xff09;删除数据&#xff08;DEL…

docker 启动容器报错 Error response from daemon: network XXX not found

华为的云服务器,重启后启动容器报上述错误 可能是容器依赖的网络被删除了 查看现有网络 docker network ls docker run -it \-p 80:80 \-p 443:443 \--name nginx \--network app --hostname nginx \-e TZAsia/Shanghai \--add-host adminJar:192.168.0.169 \-v /guazai/do…

比特币客户端和API

1. 比特比客户端的安装 Bitcoin Core 客户端适用于从 x86 Windows 到 ARM Linux 的不同架构和平台&#xff0c;如下图所示&#xff1a; 2. Bitcoin Core客户端的类型 2.1 Bitcoind Bitcoind 末尾的字母 d 表示 daemon (守护程序&#xff09;。所谓守护程序&#xff0c;就是指常…

线程相关内容

线程 一、介绍二、thread库1、构造函数&#xff08;1&#xff09;函数&#xff08;2&#xff09;说明&#xff08;3&#xff09;注意 2、join函数3、detach4、joinable函数5、get_id函数 三、mutex的种类1、mutex&#xff08;1&#xff09;介绍&#xff08;2&#xff09;lock&a…

从JavaScript入门Go三

前情提要 上一章中我们讲了Go中的变量与函数&#xff0c;这一节我们说说Go中的逻辑语法for、if、switch。最近正好有空&#xff0c;正好给大家更新一下入门的第三章。 PS&#xff1a;没看过的第一章、第二章的小伙伴&#xff0c;可以进入下面的链接查看 从JavaScript入门Go一 从…

损坏SD数据恢复的8种有效方法

SD卡被用于许多不同的产品来存储重要数据&#xff0c;如图片和重要的商业文件。如果您的SD卡坏了&#xff0c;您需要SD数据恢复来获取您的信息。通过从损坏的SD卡中取回数据&#xff0c;您可以确保重要文件不会永远丢失&#xff0c;这对于工作或个人原因是非常重要的。 有许多…

比特币网络和支付

1. 比特币网络 比特币网络是一个去中心化的点对点网络&#xff0c;节点之间可以直接进行交易。网络上有不同类型的节点。 1.1 比特币网络的节点 比特币网络的节点有两种主要类型&#xff1a;全节点也称为完整节点和简单支付验证&#xff08;Simple Payment Verification,SPV)节…

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个…

python画图|水平直方图绘制

前序学习过程中&#xff0c;我们一起研究了&#xff1a; 【a】直方图绘制基础教程&#xff1a;python画图|直方图绘制教程-CSDN博客 【b】 直方图绘制进阶教程&#xff1a;python画图|直方图绘制教程进阶-CSDN博客 【c】 堆叠直方图绘制教程&#xff1a;python画图|堆叠直方…

【JavaEE初阶】多线程(3)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程状态 线程安全 代码示例 解释 总结原因 解决方案-->加锁 t1和t2都加锁 且 同一个锁对象 t1和t2中只有一个加锁了 t1和t2都加锁,但锁对象不同 加锁 与线程等待…

35天学习小结

距离上次纪念日&#xff0c;已经过去了35天咯 算算也有5周了&#xff0c;在这一个月里&#xff0c;收获的也挺多&#xff0c;在这个过程中认识的大佬也是越来越多了hh 学到的东西&#xff0c;其实也没有很多&#xff0c;这个暑假多多少少还是有遗憾的~ 第一周 学习了一些有…

图像处理与编辑软件Adobe Photoshop(PS)2024WIN/MAC下载及安装教程

目录 一、软件概述 1.1 Photoshop 简介 1.2 主要功能 二、下载与安装 2.1 下载 2.2 安装步骤 2.3 注意事项 三、系统要求 3.1 硬件要求 3.2 操作系统 四、操作指南 4.1 基础操作 4.2 进阶技巧 4.3 高效工作 一、软件概述 1.1 Photoshop 简介 Adobe Photoshop&a…

Android13 Hotseat客制化--去掉hotseat(热座)

需求&#xff1a;有些项目不要热座&#xff0c;要求去掉热座 以前的做法是把DeviceProfile里与hotseat有关的变量改为0之类的&#xff0c;改动比较大。为什么不通过简单的把mHotseat设置为GONE呢 因为在各种视图变化的时候&#xff0c;会把hotseat再次显示出来&#xff0c;因…

Spark的一些高级用法

Java 中实现 Spark 的一些高级用法。 1. 使用 DataFrame 和 Spark SQL 在 Spark 中&#xff0c;使用 DataFrame 来处理结构化数据并执行 SQL 查询是非常常见的。 import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.Spark…