最后更新:2022-07-18 02:22:29 手机定位技术交流文章
IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP体系中的网络层协议。
网络层解决的问题
TCP作为传输层控制协议,其保证的是数据传输的可靠性和传输效率,但TCP提供的仅仅是数据传输的策略,而真正负责数据在网络中传输的则传输层之下的网络层和链路层。
网络通信的进程就像两个人互相发送数据,两个人在两个建筑物的第四层,如果一个人想向另一个人提供数据,那么这个人必须首先从第四层到第一层,然后在路径中选择到达另一层,最后到达第四层向另一个人提供数据。
其中,送数据的这个人从四楼下来的过程就是数据封装的过程,这个人在路上经过路径选择到达对方楼下的过程就是数据路由的过程,而这个人再上到四楼将数据交给对方的过程就是数据解包的过程。
确保从一个主机到另一个主机可靠的数据传输的先决条件
当双方进行基于TCP的网络通信时,为了确保可靠地从一个主机转移到另一个主机的数据,假设发送者必须有能力向另一个主机发送数据,如果发送者甚至没有能力向另一方发送数据,那么不需要谈论向另一个主机发送可靠的数据。
换句话说,如果网络层能够向另一个主机发送数据,即使网络层不能保证它每次都能成功地向另一个主机发送数据,网络层也会能够根据TCP提供的可靠性策略保证可靠地向另一个主机发送数据。
说明一下:
路径选择
数据的网络传输通常是跨网络,路由器是连接多个网络的硬件设备,因此在进行跨网络传输时,数据必须通过多个路由器。
数据路径,正如我们旅行一样,在确定目的地主机后,需要找到到目的地的最短路径。
确定数据路由的目的地后,数据可以通过网络传送,但是数据不能单独选择路径,当它被引导时,因为数据本身是“未知路径”,因此,在路由过程中需要不断“搜索”数据。这里所谓的“步行者”是网络中的独立路由器。
网络中的路由器是“已知路径”,他们在路由表中记录他们的“既知路径经验”,因此,路由器可以通过查看路由表来找到到特定点的最短路径。因此数据在路由时,路径选择是通过路由器进行的,这是一个更接近目标网络或目标主机的步骤。
主机和路由器
IP协议格式如下:
IP报头在内核当中本质就是一个位段类型,给数据封装IP报头时,实际上就是用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,至此便完成了IP报头的封装。
IP如何将头条与有效负荷分开?
分开IP字节和有效负载的方法类似于TCP,虽然IP在从底部接收IP消息后不知道该字节的具体长度,但IP消息的第一个20个字节是IP的基本字节,这些20个字节覆盖了第一个4个部门。
因此,IP与头条和有效负载有如此的区分:
IP是通过这个“定义标题+自定义字段”将标题与有效负载分开的。但需要注意的是,在IP标题中描述的四个部长级基本单位与TCP标题中描述的四个部长级基本单位相同,它们都描述为四位元单位,这正是报告的宽度。
四位二进制值范围为00~11,所以IP头条的最大长度是 15 × 4 = 60 15times 4=60 1 5 × 4 = 6 0 字节,因为基本头条长20字节,IP头条的选项字段长最大40字节。 如果IP头条没有选项字段,那么IP头条的长度是20字节,而头条的四个第一个 ministerial字段的值是 20 ÷ 4 = 5 20div 4=5 2 0 ÷ 4 = 5 ,即0101。
IP如何决定哪些协议将有效负载传递到上层?
基于IP协议的传输层协议有多个协议,因此当IP从底部接收消息并解封时,IP需要知道哪些协议应该提供分离到顶层后得到的有效载荷。
IP头上有一个字段,叫做8位协议,这个字段代表顶层协议的类型,IP就是根据该字段判定应该将分离出来的有效载荷交付给上层的哪一个协议的。发送者IP层从上层传输层获取数据后,该字段被填入,例如,顶层的TCP将数据转移到IP层,因此,当IP头条被包起来时填入数据的8位协议是相应的TCP代码。
32位源IP地址和32位目的地IP地址
IP报头当中的32位源IP地址和32位目的地IP地址,分别代表的就是该报文的发送端和接收端对应的IP地址。
网络传输过程中的数据会遇到每个路由器,这些路由器将帮助网络中的数据进行路由。使网络中的数据缓慢接近目标主机。当路由器帮助数据被引导向前时,用于从IP头条提取数据的IP地址,这是数据路由传输的重要基础.
当接收器接收发送器发送的数据时,接收者也可以向发送者发送数据,因此,发送者在传输数据时,除需要为数据目的指定IP地址外,还必须指定数据的源IP地址,这是发件人的IP地址。即使接收器接收数据并且没有向发送者发送数据,但至少接收者需要向发送者发送响应消息,表明发送者发送的数据已经被接收者可靠地接收,因此,除了指定发送数据的IP地址外,还必须指定数据的源IP地址。
理解索克编程:
8位生存时间
在网络传输过程中,消息可能由于某种原因无法到达目标主机,例如在路由过程中出现循环路由,或者目标主机异常处于非线性状态,此时消息成为被放弃的非线性消息。
为了 避免 在 网络 中 出现 大量 游击队 报告,因此在IP头条中出现一个行,叫做8位生存时间(Time To Live,TTL)。八进制的存活时间代表最大消息跳到消息的目的地。每当一条消息通过一个路线时,这里的生存时间将减少一倍,当生存时间减少到0时,消息会自动丢弃,此时,消息将被散布在整个网络上。
解决数据链层的问题
IP可以从一个主机到另一个主机通过网络传输数据,当数据通过网络传输时,需要通过单独的路由器进行路由,才能最终到达目标主机。
例如,若要从主机B传输数据到主机C,主机B首先必须将数据转移到路由器F,然后路由器F将数据转移到路由器G,..,最后路由器D将数据转移到主机C。
因此IP进行数据跨网络传送的前提是,需要先将数据从一个节点传送到和自己相连的下一个节点,这个问题实际就是由IP之下的数据链路层解决的,其中数据链路层最典型的代表协议就是MAC帧。
两个节点的直接连接意味着两个节点都在同一的本地网络中,所以讨论两个邻近节点的数据传输时,真正的讨论是本地网络通信的问题。
最大传输单位MTU
MAC框架是数据链层的协议,它将通过IP传输的数据包入数据框架中,然后把它送到网络上。但MAC帧所载的有效载荷的最大长度是有限的,换句话说,IP发送给MA帧的信息不能超过一定值。这个值就叫做最大传输单元(Maximum Transmission Unit,MTU),这个值的大小通常是1500字节。
在Linux下使用ifconfig命令可以查看相应的MTU。
由于MAC帧不能发送超过1500字节的数据,因此向IP层下传送的数据长度不能超过1500字节,包括IP头字和IP的有效负载。
分片与组装
如果在IP层中传输的数据超过1,500字节,则必须先在IP层内芯片数据,然后在芯片之后将数据发送到较低的MAC帧。
如果数据被发送到IP层的芯片上,那么一旦芯片数据到达主机的IP层,它需要先组装,然后组装的数据交付到上层传输层。
注意:
数据由IP层分割和组装
数据分割和组装在IP层完成,而上层传输层和下层链层则无关。
传输层仅负责为数据传输提供可靠性保证,例如,当数据传输失败时,传输层的TCP协议可以组织数据重传输。
链层的MAC框架负责将数据从一个节点传输到另一个与它相连的节点。
因此,数据分割和组装完全由IP协议本身完成,并且传输层和链层不需要关心或照顾。
分片的过程
假设IP层发送4,500位元数据,并且由于数据超过MAC帧所指定的MTU,IP需要首先分离数据,然后向MAC帧发送每个单独的位数。
如果IP头条没有选项字段,那么它的大小为20字节,假设IP头条添加到IP层的长度为20字节,并使用下列方法将数据分成四个单独声明:
| 分片报文 | 总字节数 | IP报头字节数 | 数据字节数 |
|---|---|---|---|
| 1 | 1500 | 20 | 1480 |
| 2 | 1500 | 20 | 1480 |
| 3 | 1500 | 20 | 1480 |
| 4 | 80 | 20 | 60 |
应该指出,每个数据位之后的每个位需要附上相应的IP头条,因此至少4,500个数据位需要发送至少4个消息位。
在到达另一个IP层后,该包消息需要重新组装,因此IP层需要记录数据包装时的包信息,而IP标题中的16位标识符、3位符号和13位包转移实际上是与数据包有关的字段。
因此,对上述四个块消息的16位标识符是相同的。假设四个块消息的16位标识符为123,对“更多块”中的四个块消息的16位标识符和3位标识符中的13位标识符分别偏离如下:
| 分片报文 | 总字节数 | IP报头字节数 | 数据字节数 | 16位标识 | “更多分片” | 13位片偏移 |
|---|---|---|---|---|---|---|
| 1 | 1500 | 20 | 1480 | 123 | 1 | 0 |
| 2 | 1500 | 20 | 1480 | 123 | 1 | 185 |
| 3 | 1500 | 20 | 1480 | 123 | 1 | 370 |
| 4 | 80 | 20 | 60 | 123 | 0 | 555 |
应该指出,在13位分区期间记录的字节数是最初数据开始时分区字节的值
÷
8
div 8
÷
8
因此,例如,分区消息2在原始数据开始时具有移行节点数1480,相应的13位分区移行值为
1480
÷
8
=
185
1480div 8=185
1
4
8
0
÷
8
=
1
8
5
。
组装的过程
MAC帧交给IP层的数据可能来自世界各地,这些数据可能是经过分片后发送的,也可能是没有经过分片直接发送的,因此IP必须要通过某种方式来区分收到的各个数据。
因此IP可以通过IP报头当中的32位源IP地址和16位标识,将经过分片的数据各自聚合在一起,聚合在一起后就可以开始进行组装了。
每张纸:
基于这些三个特点, 可以合理地汇编批量报告.
分片报文丢包的问题
在网络传输中,一个后包消息也可以丢失,但接收机有能力确定它是否收到部分包消息,例如假设一个包消息组的16位标识符值为x:
需要注意的是,非分割消息的“更多件”标记为0,最后一份报告的“更多部分”标记也是0,但当接收器只接收最后一个块消息时,接收者将不能识别它为分离的讯息,因为分离消息的相应的13位分离偏差也应为0,与最后的分区声明相符的13位移值不是0。
因此只有当一个报文的13位片偏移为0,并且该报文的“更多分片”标志位也为0时,该报文才会被识别成一个没有被分片的独立报文,否则该报文就会被识别成一个分片报文。
你为什么不推荐分页?
虽然传输层并不关心IP层的芯片问题,但芯片也影响到传输层。
需要注意的是,只要报告中的一个部分似乎已经丢失了这个包,此时,传输层需要重新传输整个数据,因为传输层不知道数据分配的基础IP,当传输层没有响应发送数据时,传输层只能将整个数据传递。因此,不建议在发送数据时分开数据。
你如何尽量避免分裂?
实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,如果传输层控制好一次交给IP的数据量不要太大,那么数据在IP层自然也就不需要进行分片。
MAC帧的最大有效负载是MTU,TCP的最大有效载荷是MSS,由于TCP和IP协议,头条长度为20字节,因此, 一般来说, MSS = MTU-20-20,MTU值通常是1500字节,因此,MSS值通常为1460字节。
因此,一般建议TCP在1460字节内发送数据控制,这降低了数据碎片的可能性。原因在于减少数据碎片的可能性,因为每个网络层的相应的MTU可能不同,如果数据被传输到较小的MTU网络,然后,数据可能仍需要在路由器中分开。
IP地址的构成
IP地址由两个部分组成,网络号码和主机号码:
你可以添加/后面的IP地址和/后面的号码,这表明它属于网络标识器,从第一个号码到第二个。
例如,下图中的路由器连接了网络的两个部分。对于网络标识来讲,同一网络段中的主机的网络识别是相同的,不同网络分段的主机的网络识别是不同的。至于主机标识符,同一网络段的宿主的宿主识别是不同的,网络段的不同主机的主机标识符可以是相同的。
DHCP协议
实际的IP地址手动管理是一个非常棘手的事情。当一个新主机被添加到子网时,必须给它分配一个IP地址。当一个主机被从子网中切断时,也必须检索其IP地址,这更容易分配给随后添加的主机使用。
当我们连接到Wi-Fi时,我们需要输入密码,主要是因为路由器需要验证您的帐户和密码,如果它通过,路由器将动态分配给您IP地址,然后您可以根据该IP地址进行各种在线行动。
首先找到目标网络,然后找到目标主机
当IP要将数据跨网络从一台主机发送到另一台主机时,其实不是直接将数据发送到了目标主机,而是先将数据发送到目标主机所在的网络,然后再将数据发送到目标主机。
因此路由数据的第一个目的不是找到目标主机,而是找到目标网络所在的网络,然后在目标网络中找到目标主机。
为什么数据路由从一开始就不能找到目标主机是因为效率太低。
因此,为了提高数据路由效率,我们将网络分为网络分段。
网段划分
过去曾经提出一种划分网络号和主机号的方案,就是把所有IP地址分为五类,如下图所示:
因此,IP地址的范围如下:
当确定一个IP地址属于哪个类时,只需要通过IP地址的前五位,而IP地址的前几位具有第一个0值,以使IP地址与A、B、C、D和E类地址相符。
子网划分
但随着网络的迅速发展,这一分类方案的局限性很快就出现了。
为了避免这种情况,提出了一种名为CIR(Classless Interdomain Routing)的新分类方案:
在這種情況下,網路被分為較小的細粒度的子網,並通過連續的子網分佈,該子網中的IP地址的 host number 會越短越短,因此在子網中可用的IP地址的數量會越少,從而避免浪费IP地址。
需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的基础上继续进行子网划分。
因此,当数据被调拨时,随着数据继续被调入较小的子网,其网络号码的数目不断变化,其网络的数量正不断增加,这也意味着IP地址中的主机号码的数量正在减少。最后,当数据路径到达目标主机所在的网络时,您可以在网络中找到相应的目标主机,并将数据转移到该主机,此时,数据的路径已经结束。
并非所有IP地址都可以作为主机IP地址服务,但有些IP地址有特殊目的。
也就是说,IP地址中主机号为全0的代表的是当前局域网的网络号,IP地址中主机号为全1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。因此在某个局域网中最多能存在的主机个数是 2 天主 机器 不。 排名 数目 − 2 2^{Mainframe No.位}-2 2 主 机 号 位 数 − 2 。
本机环回基本原理
机器周期通过网络协议堆栈返回数据,但最终不会向网络发送数据,这相当于机器周期返回时在网络卡上不写数据。
机器路由返回的目的是通过协议堆栈从顶端传送数据,执行数据包装的过程,然后从下层传送数据,执行数据卸载和分离的过程,以测试本地网络功能是否正常。
这个机器的基本原理是:
回路设备:
缺少IP地址
我们知道IP地址(IPv4)是4位和32位的正整数,所以它是共享的 2 32 2^{32} 2 3 2 一个IP地址,即近43亿IP地址。 然而,TCP/IP协议要求每个主机有一个IP地址。
所以43亿个IP地址其实早就不够用了,因此才提出了CIDR的方案对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费,根本原因就是IP地址本来就不够了,所以不能够再浪费了。
CIDR虽然在一定程度上缓解了IP地址不够用的问题,因为CIDR提高了IP地址的利用率,减少了浪费,但IP地址的绝对上限并没有增加。
如何解决IP地址短缺问题
解决IP地址短缺有几种方法:
私网IP地址的种类
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
包含在这个范围中的,都称为私网IP,其余的则称为公网IP(或全局IP)。
当我们连接到云服务器时,这个IP地址是云服务器的公共IP地址。
我们可以通过ifconfig命令来查看我们这台机器的私网IP,其中网络接口lo(loop)代表的是本地环回,而eth0代表的就是我这台机器的网络接口,可以看到我的私网IP地址是172.21.0.15。
需要注意的是,这里连接云服务器时的IP地址49.232.66.206,是云服务器的公共网络IP,因为我使用Tencent Cloud,因此这里的172.21.0.15是我这个云服务器在腾讯内部的私网IP,你可以看到IP只是在第二个私人IP的范围之内。
此外,在Windows中打开cmd窗口ipconfig命令可以看到大量的私人IP,从192开始。
为什么我们应该付给经营者呢?
我们享受互联网公司提供的服务,但为什么我们需要支付运营商的费用?
换句话说,用户在互联网上的数据必须首先通过运营商的相应网络设备,然后发送到互联网公司的相应服务器。 因此,所谓的网络分割、子网分割等工作实际上是由运营商完成。
如何发送数据到服务器
路由器是连接两个或多个网络的硬件设备,路由器有两个网络接口: LAN接口和WAN接口:
LAN端口的IP地址称为LAN端口IP,也称为子网IP,而WAN端口的IP地址称为WAN端口IPO,也称为外部网络IP。
我们使用的计算机、家庭路由器、运营商路由器、宽带网络和我们想要访问的服务器之间的关系大致如下:
由于私有IP不能出现在公共网络中,因此,当子网络中的主机与外部网络通信时,路由器将不断将源IP地址在包IP的第一个部分中替换为路由器的WAN端口IP,这样逐级替换,最后的包中的源IP地址成为公开IP,这种技术成为NAT(Network Address Translation,网络地址转换)。
为什么私有IP不能出现在公共网络中?
主机不能在两个宽带网络之间通过公共网络进行通信
所以数据是从一个网路发送到另一个网路,没有公共网络几乎是不可能的。当我们和别人聊天时,它也不是直接从一个网路发送数据到另一个网路,而不是通过公共网络向服务器发送数据,然后服务器通过公共网络将数据转移到另一个本地网络。
但实际上有一些技术允许数据包在传输过程中不被公共IP取代,而是被正确地发送到目标主机,这些技术被称为内部网络渗透或NAT渗透。
数据“问路”的过程
在路由过程中的数据实际上是一个 hop by hop "question"过程。 所谓的"一个跳跃"是数据链层的间隔,具体指的是Ethernet中源 MAC地址和目标 MAC地址之间的帧传输间隔。
IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。
有三个类型的路由器搜索结果:
路由表查询的具体过程
每个路由器内部维护一个路由表。我们可以通过route在云服务器上查看相应的路由表的命令。
Destination代表目标网络地址。Gateway代表下一个跳跃地址。Genmask代表的是子网掩码。FlagsU符号表示该条有效(某些条目可能被禁用)G符号表示该条目的下一个跳地址是路由器的地址,而非G符号表示该条目的的网络地址是直接与主机接口连接的网络,不需要通过路由器传输。Iface代表的是发送接口。当一个IP包到达路由器时,路由器用于数据的目的使用IP地址,并与路由器表中的子网进行相应的解码Genmask执行Bitwise和操作,然后将结果掩盖到与子网相对应的目标网络地址Destination如果匹配,则表示该包的下一个跳跃应该是到这个子网,然后该包将通过相应的发送接口Iface发出。
如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default你可以看到相应的默认路径Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。
数据包连续通过路由器后,最后,它可以到达目标主机的目标网络,该包的IP地址中的网络号码不再相应地调用.而不是在目标IP地址中调用主机号码,最后,根据数据包的 host number 发送数据到目标主机。
路线可以分为静态和动态路线:
路由表相关生成算法: 距离向量算法 、 LS算法 、 ijkstra算法等.
本文由 在线网速测试 整理编辑,转载请注明出处。