IP协议
1.基本概念
IP协议全称为“网际互连协议(Internet Protocol)” ,IP协议是TCP/IP体系中的网络层协议。
总的来说,IP协议的最重要功能是提供了一种标准化的方式来路由和传输数据包,以实现全球互联网上的通信。
( 网络层要解决的问题就是 :将数据从一台主机送到另一台主机 ,也就是数据的路由)
下面举个例子来帮助大家梳理一下:
我们的淘宝卖家在卖货物的时候,需要选择发货地址,而我们的网络层处理的货物应用往哪边发的问题,我们的传输层保证的是货物在发送路上的安全,而我们的应用层决定了货物本身的种类。
实际上,在网络层中,数据的传递并不能保证百分百发送成功,在这里面会存在很多问题,当然我们也有相应的机制对其进行管理,后文将为大家一一道来。
IP层是怎么做的 – 路径选择 |
---|
这是个谈论ip层时避不开的话题。
数据在进行网络传输的时候一般都是跨网络的 ,而我们的路由器就是连接各个网络的硬件设备,因此在数据传输的时候要经过多个路由器。
这里的路由器起到一个问路人作用,为了找到最短的传输路径以保证传输效率,在确立了起始地址和目标地址以后,数据会由一个个主机跳向不同路由器,通过路由器的一些机制(数据链路层我们会讲)来进行数据的从传递,当然具体细节在后面我们会详细讲解,这里只是给大家粗略设立一个基本概念。
2.IP协议格式
2.1基本概念
-
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数据报整体占多少个字节.
-
16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个
id都是相同的.
-
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁
止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,
最后一个分片置为1, 其他是0. 类似于一个结束标记.
-
13位分片偏移(framegament offffset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片
在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报
文的长度必须是8的整数倍(否则报文就不连续了).
-
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL
-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
-
8位协议: 表示上层协议的类型
-
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否被修改.
-
32位源地址和32位目标地址: 表示发送端和接收端.
-
选项字段(不定长, 最多40字节): 由4位首部长度可计算
2.2经典问题----报头和有效载荷分离
IP的报文中给我们提供了两个字段 :16位总长度和4位首部长度.
其中16位总长度是报文的总大小 .
4位置首部长度*4 = 基本报头长度(固定占20字节)+选项的大小
这里我们的报头 = 基本报头长度 + 选项大小(有的话)
2.3IP如何决定将有效载荷交给上层的哪个协议
当然在我们回答这个问题前我们先来总结一个概念:
在网络传输中向上交付的是有效载荷,向下交付的是报文。
这是主流的一种说法,怎么理解呢?
当我的报文不断向下交付的时候,此时前面不同的首部长度我们会将其归类为有效载荷那一部分(当然这么讲不是很恰当)
好了回到我们的正题:
我们上面提到的8位协议就是处理这个事情的,该字段是发送方的IP层从传输层获取到字段后填充的, 比如说上层是TCP协议传输过来的数据 ,那么该字段就会填写TCP协议对应的协议号。
2.4 8位生存时间
8位生存时间(TTL)代表的是数据到达目的地的最大报文跳数 ,一般设置为64 每经过一个路由 TTL-1。 如果一直减到0还没有到达目的主机该报文则会被丢弃, 该字段解决的就是上面大量报文在网络中游离的问题。
什么是数据游离状态?在网络传输的过程中,可能由于某些原因导致报文几乎永远无法到达目标主机,如果不去处理这些报文可能会在网络中不停的游离,这显然是很糟糕的,因此我们利用8位生存时间这一机制来处理这些问题。
3.分片和组装
3.1前置知识
当然在我们开启正式讲解之前,我们先补充一些前置知识。
在我们的数据链路层中有个常见的协议-----MAC帧,它主要解决的问题是将数据从一个节点(主机和路由器的统称)传递到另一个与自己相邻的节点。并且MAC帧作为数据链路层的协议会将IP层传下来的数据封装成数据帧(它是数据链路层中的一个单位,是一个数据包的格式)后再在网络中传输。
上面我们也说过数据实际在传输过程中是“一跳一跳”传输的(需要跨越多个路由器),而ip的工作就是寻找一个最短的路径出来。
最大传输单元MTU
我们上面介绍的MAC帧携带的数据总量是有限制的,这个机制叫做最大的传输单元MTU。------- 一般是1500字节
我们再Linux下可以使用对应的ifconfig命令来查看MTU:
3.2分片与组装的具体过程
在MTU为1500字节的情况下,如果说要传输的数据大于1500字节,就需要在IP层进行分片,然后将分片后的数据交给下层的MAC帧。
如果说IP数据在发送端进行了分片,那么在到达接收端网络层之后就要进行组装,组装完毕之后再将数据打包传递给下一层。
tips:
-
在网络通信中数据的分片不是常态 大部分数据是不分片的 因为数据分片会增加数据在网络中传输时丢包的概率
-
数据在经过路由器的时候也有可能会进行分片 我们在上面讲过数据是在网络层进行分片和封装的 实际上不光我们的发送端和接收端有网络层 我们的路由器也是网络层设备 而在网络传输的过程中每个局域网之间的MTU可能不同 所以会在路由器发生切分
-
分片数据的组装只会发生在目的端的IP层(这实际就是ip层的工作,它得保证数据传输的可靠性)
-
在网络传输的过程中 可能有些报文没有传输层的报头 因为我们是在网络层将数据进行切分的 在将数据进行切分之后我们只能够加上IP的报头 传输层的报头只会出现在第一个分片中
当然这里只是粗略的给大家介绍这一过程,下面用一个具体例子带大家体验一下具体是如何分片的:
假设现在IP层要发送4500个字节的数据,它应该如何分片呢?
我们假设所有分片的IP报头都不携带选项字段,即所有报头的大小都是20字节。
那么我们每个IP报文所能携带的有效数据是1480个字节 ,我们可以按照下列方式将IP报文进行分片:
分片报文 | 总字节数 | IP报头字节数 | 数据字节数 |
---|---|---|---|
1 | 1500 | 20 | 1480 |
2 | 1500 | 20 | 1480 |
3 | 1500 | 20 | 1480 |
4 | 80 | 20 | 60 |
需要注意的是,我们不能简单的使用4500 / 1500 = 3 来计算出分片的报文数 ,还要考虑IP报头的影响。
分片分完传输到对端之后是要被重新组装起来的,所以说我们需要一些数据来支持对端进行组装操作,在报文中 我们之前介绍的16位标识 3位标志 13位片偏移都是用来做这个工作的:
- 16位标识:唯一标识主机发送的报文,如果报文进行了分片则每个分片的16位标识都是相同的。
- 3位标识字段: 第一位字段表示保留 暂时没有规定该字段的意义 ;第二位字段表示禁止分片 如果该报文长度超过MTU则直接丢弃 ;第三位表示更多分片 如果该位为0 则表示后面没有分片了 如果该位为1 则表示后面还有分片
- 13位片偏移:分片相对于原数据的初始位置的偏移, 表示该分片在原数据中的偏移位置 。实际偏移的字节数=该值*8 (所以说除了最后一个报文之外, 其他所有报文的长度都要是8的整数倍)
我们通过这三个字段就能够将所有分片的报文重新排序并组装起来大概过程如下:
- 首先通过16位标识找到所有的同属于P报文分片。
- 接着我们通过确认13位片偏移最大的分片的三位标识字段是否为 000 来确认这是否为最后的报文。
- 然后我们将这些报文去掉报头 ,使用13位片偏移的大小进行排序。
- 最后我们就得到一个组装好的IP报文了。
3.3分片丢包问题
首先我们的接收端能够分辨一个报文是完整的报文还是被分片的报文,如果说一个报文的3位标识字段是000并且 13位偏移量是0那么这个报文就是完整未被分片的, 其余情况都证明该报文被分片了。
那么如何分辨它是否丢包呢?首先确定第一位(偏移量为0)和最后一位(3为标识字段为0)是否被丢包。
如果没有我们就开始按照13位片偏移量进行排序,如果中间某个位置缺失了一段数据那就是丢包了,如果没有那就没有丢包。
3.4如何尽可能避免分片
我们不建议让报文分片,如果有大量的报文进行分片十分影响传输的效率。
那么如何尽量避免呢?
实际上我们TCP/IP协议也给出了控制传输数据的机制
-
TCP作为传输协议,它需要控制每次向下交付的数据不能超过某一阈值 ,这个阈值叫做MSS(Maximum Segment Size,最大报文段长度)
-
双方在建立TCP连接的时候 ,除了协商窗口大小之外, 还会协商出一个后序通信时每个报文段所能承担的最大报文长度MSS
MAC帧的有效载荷最大为MTU, TCP的有效载荷最大为MSS ,由于TCP和IP常规情况下报头的长度都是20字节 因此一般情况下 MSS = MTU - 20 - 20 ,而MTU的值一般是1500字节, 因此MSS的值一般就是1460字节。
但是这也只是理想状况,有的时候在一个局域网中MTU会特别小,这个时候不得不进行分片。
4.网段划分
网络中的"网段"(Subnet)是指将一个大的IP地址范围分割成更小的子网或子网络,以便更有效地管理和组织IP地址。
当然如果需要更近一步了解其细节,我们需要一些前置知识。
4.1现代ip地址的构成
这里我们正式给大家来讲解一下ip地址。
ip地址由网络号和主机号两部分构成
-
网络号:保证相互连接的两个网段具有不同的标识
-
主机号:同一网段内主机具有相同的网络号,但是必须有不同的主机号来区分不同主机
我们可以在ip地址的后面加上一个
/
并且其后面加上一个数字,这就表示从头数到第几位为止属于网络标识
我们平常说的子网实际上就是将网络号相同的主机放在一起。
4.2DHCP协议
我们自己手动调ip是很烦的,DHCP协议很贴心的帮助了我们解决这一问题。
动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是一种用于在计算机网络中分配IP地址和其他网络配置参数的协议。DHCP的主要目标是简化和自动化网络设备的IP地址分配过程,以确保网络上的每个设备都能获得唯一的IP地址并获得必要的网络配置信息。
我们正常使用的路由器也都配有此协议,所以说路由器也可以看作是一个DHCP服务器。
4.3五类划分发
IP的查找步骤是先找网络再找主机,为了让查找速率在快一步,我们将网段进行划分
在过去我们提出过一种划分网络号和主机的方案 ------就是把所有的IP地址分为五类如下图:
各类IP地址的取值范围如下:
- A类:0.0.0.0到127.255.255.255
- B类:128.0.0.0到191.255.255.255
- C类:192.0.0.0到223.255.255.255
- D类:224.0.0.0到239.255.255.255
- E类:240.0.0.0到247.255.255.255
当我们要寻找ip地址的时候先找前5位,在进行判断。
但是由于这种划分法划分的网络字段太过固定,管理不方便而且容易造成浪费(大家都只去申请一类,其他类空着
),所以被淘汰了。
4.4CIDR协议
CIDR引入了一种新的灵活的IP地址分配方案,允许网络管理员更有效地利用IP地址空间,并且不再受传统IP地址分类的限制。
CIDR协议的做法是:
-
在原有的五类网络的基础上继续进行子网划分 ,这也就意味着需要借用主机号当中的若干位来充当网络号 。此时为了区分IP地址中的网络号和主机号,于是引入了子网掩码(subnet mask)的概念
-
每一个子网都有自己的子网掩码,子网掩码实际就是一个32位的正整数, 通常用一串“0”来结尾。
-
将IP地址与当前网络的子网掩码进行“按位与”操作,就能够得到当前所在网络的网络号。
此时一个网络就被更细粒度的划分成了一个个更小的子网,通过不断的子网划分,子网中IP地址对应的主机号就越来越短,因此子网当中可用IP地址的个数也就越来越少,这也就避免了IP地址被大量浪费的情况
(实际在用子网掩码与子网当中主机的IP地址进行“按位与”操作时本质就是保留了主机IP地址中前24个比特位的原貌,将剩下的8个比特位的值清0了而已 ,也就是将主机号清0了 。所以“按位与”后的结果就是该网络对应的网络号)
需要注意的是子网划分不是只能进行一次 ,我们可以在划分出来的子网的基础上继续进行子网划分。
因此一个数据在路由的时候随着数据不断路由进入更小的子网, 其网络号的位数是在不断变化的。
4.5特殊的ip地址
有些ip地址本身具有特殊的用途:
-
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
-
将IP地址中的主机地址全部设为1 ,就成为了广播地址 ,用于给同一个局域网中相互连接的所有主机发送数据包
(tips:这两个IP地址都是不能作为主机的IP地址的)
-
127.*的IP地址用于本地回环(loop back)测试 通常是127.0.0.1
既然这里提到了本地回环,那么我们就来谈谈它的原理:
本地环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络当中,相当于本机环回时不会将数据写到网卡上面。
4.6ip地址的数量限制
起始实际上按照我们的ipv4规则划分的ip地址早就已经不够用了,我们必须使用新的技术来避免这种情况,
解决IP地址不足有以下几个方式:
- 动态分配IP地址:只给接入网络的设备分配IP地址。因此同一个MAC地址的设备每次接入互联网中,得到的IP地址不一定是相同的,避免了IP地址强绑定于某一台设备。
- NAT技术:能够让不同局域网当中同时存在两个相同的IP地址 。NAT技术不仅能解决IP地址不足的问题, 而且还能够有效地避免来自网络外部的攻击 ,隐藏并保护网络内部的计算机。
- IPv6:IPv6用16字节128位来表示一个IP地址 能够大大缓解IP地址不足的问题 但IPv6并不是IPv4的简单升级版 它们是互不相干的两个协议 彼此并不兼容 因此目前IPv6还没有普及
4.7私有ip和共有ip
私有IP地址:
- 定义:私有IP地址是一种用于内部网络中的IP地址,它们不可被直接路由到公共互联网。这些地址是为内部网络通信而保留的,通常在家庭、企业或组织内部使用。
- IP地址范围:私有IP地址通常落在以下三个IP地址范围内,按IPv4的标准定义:
- 10.0.0.0 到 10.255.255.255(CIDR表示为10.0.0.0/8)
- 172.16.0.0 到 172.31.255.255(CIDR表示为172.16.0.0/12)
- 192.168.0.0 到 192.168.255.255(CIDR表示为192.168.0.0/16)
- 用途:私有IP地址通常用于组织内部的局域网(LAN)中,以便设备在本地网络中相互通信。它们允许多个设备在一个局域网中使用相同的IP地址,因为这些地址只在局域网内部唯一。
公有IP地址:
- 定义:公有IP地址是可以直接访问和路由到互联网的IP地址。它们是全球唯一的,因为它们需要全球路由器来将数据包传递到正确的目标。
- IP地址范围:公有IP地址没有特定的地址范围,它们由互联网注册机构(如IANA、ARIN、RIPE等)分配和管理。这些地址不受限于特定的范围,但它们是有限的资源,因此在全球范围内分配。
- 用途:公有IP地址用于标识互联网上的各种设备和服务器。它们允许设备通过互联网相互通信,例如,当您访问网站或发送电子邮件时,您的设备需要一个公有IP地址,以便其他设备能够找到您并与您通信。
-
LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
-
WAN口(Wide Area Network):表示连接广域网的端口 一般指互联网。
由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时 ,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP。 这样逐级替换,最终数据包中的源IP地址成为一个公网IP, 这种技术称为NAT。(Network Address Translation,网络地址转换)
Tips:所谓的私网ip(子网)IP是为了解决公网ip不足而存在的一种机制(因为私网ip在不同子网中可以重复使用),它是一种经过特殊划分的ip机制。
5.路由机制
IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发。每当数据包遇到一个路由器后 ,对应路由器都会查看该数据的目的IP地址, 并告知该数据下一跳应该往哪跳。
路由器的查找结果可能有以下三种:
- 路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网
- 路由器经过路由表查询后,没有发现匹配的子网此时路由器会将该数据转发给默认路由
- 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络 此时路由器就会将该数据转给当前网络中对应的主机。
每个路由器内部会维护一个路由表,我们可以通过route命令查看云服务器上对应的路由表:
-
Destination代表的是目的网络地址
-
Gateway代表的是下一跳地址
-
Genmask代表的是子网掩码
-
Flags中 U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址 没有G标志的条目表示目的网络地址是与本机接口直接相连的网络 不必经路由器转发
-
Iface代表的是发送接口
(路由表大多是根据相关算法来实现的,比如:距离向量算法、LS算法、Dijkstra算法等。)
路由可分为静态路由和动态路由:
- 静态路由:是指由网络管理员手工配置路由信息.
- 动态路由:是指路由器能够通过算法自动建立自己的路由表并且能够根据实际情况进行调整.
中…(img-dg5kO4Cl-1699083823921)]
-
Destination代表的是目的网络地址
-
Gateway代表的是下一跳地址
-
Genmask代表的是子网掩码
-
Flags中 U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址 没有G标志的条目表示目的网络地址是与本机接口直接相连的网络 不必经路由器转发
-
Iface代表的是发送接口
(路由表大多是根据相关算法来实现的,比如:距离向量算法、LS算法、Dijkstra算法等。)
路由可分为静态路由和动态路由:
- 静态路由:是指由网络管理员手工配置路由信息.
- 动态路由:是指路由器能够通过算法自动建立自己的路由表并且能够根据实际情况进行调整.