文章目录
- 一、引言
- [二、IP 基础知识](#二、IP 基础知识)
-
- [1、IP 地址](#1、IP 地址)
- 2、路由
- 3、IP报文
- 4、IP报文的分片与重组
- [三、IP 属于面向无连接型](#三、IP 属于面向无连接型)
- 四、IP协议相关技术
一、引言
TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是"实现终端节点之间的通信 "。这种终端节点之间的通信也叫做点对点通信(end-to-end)。IP 的作用是在复杂的网络环境中将数据包发送给最终的目的主机。ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
数据链路层提供直连的两个设备的通信功能。与之相比,作为网络层的IP则负责在没有直连的两个网络之间进行通信传输。
比如计划去一个遥远的地方旅行,并为此制定了一个详细的行程计划。在他的行程中,他需要依次乘坐飞机、地铁和公交车才能到达目的地。为了完成这段旅程,需要购买不同交通工具的票务,比如飞机票和地铁票。
这些票务都有一个特定的使用范围,比如飞机票是从一个机场飞往另一个机场,地铁票则是在地铁网络内的某一段线路中使用。这个"使用范围"就好比计算机网络中的数据链路层,它负责在特定的网络段内传输数据。
在旅途中,每一段行程的移动就相当于数据链路层的工作,它确保了能够在那个特定的区间内,比如从机场到地铁站,从一个节点移动到另一个节点。这里的出发地点可以类比为数据链路层的源MAC地址,而目的地则相当于目的MAC地址。
至于整个旅行行程表,它则类似于网络层的作用。网络层负责确定数据如何从一个远程网络传输到另一个远程网络。在这个例子中,行程表的起始点就好比源IP地址,而行程的最终目的地则相当于目的IP地址。网络层(行程表)规划了整个旅程的路径,确保能够从起点顺利到达终点。
在网络中数据包传输中也是如此,源IP地址和目标IP地址在传输过程中是不会变化的(前提:没有使用 NAT 网络),只有源 MAC 地址和目标 MAC 一直在变化。
二、IP 基础知识
IP大致分为三大作用模块,它们是IP寻址、路由以及IP分包与组包。
1、IP 地址
为了识别通信对端,必须要有一个类似于地址的识别码进行标识。比如数据链路的MAC地址。MAC地址正是用来标识同一个链路中不同计算机的一种识别码。作为网络层的IP,也有这种地址信息。一般叫做IP地址。IP地址用于在"连接到网络中的所有主机中识别出进行通信的目标地址"。
因此,在进行TCP/IP通信时,用IP地址识别主机和路由器。为了保证正常通信,有必要为每个设备配置正确的IP地址(也就是说,要针对每块网卡至少配置一个或一个以上的IP地址) 。在互联网通信中,全世界都必须有正确的IP地址。否则,无法进行正常的通信。
不论一台主机与哪种数据链路连接,其IP地址的形式都保持不变。以太网、无线局域网等,都不会改变IP地址的形式,而数据链路的MAC地址的形式不一定必须一致。
而且,在网桥或交换集线器等物理层或数据链路层数据包转发设备中,不需要设置IP地址。因为这些设备只负责将IP包转化为0、1比特流转发或对数据链路帧的数据部分进行转发,而不需要应对IP协议。
IP(IPv4) 地址由32位整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部以二进制方式被处理。32位整数,表示最多可以允许43亿台计算机连接到网络。但实际上,IP地址并非根据主机台数来分配的,而是每一台主机上的每一块网卡都得配有IP地址。
通常一块网卡只设置一个IP地址,其实一块网卡也可以配置多个IP地址。此外,一台路由器通常都会配置两个以上的网卡,因此可以设置两个以上的IP地址。
根据一种可以更换IP地址的NAT技术,可连接计算机数超过43亿台。
IP地址由网络号 和主机号 两部分标识组成。如 192.168.128.11/24
中的/24
表示从第一位开始到第24位属于网络号。在这个例子中 192.168.128
是该IP的网络号。
网络号在数据链路的每个段配置不同的值。网络号必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络号。IP地址的主机号则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠。即IP地址具有了唯一性。
上图中当IP包被转发到途中某个路由器时,正是利用目标IP地址的网络号进行路由。因为即使不看主机号,只要一见到网络号就能判断出是否为该网段内的主机。
IP地址分为四个级别,A类、B类、C类、D类、E类(未被使用)。它是根据IP地址中从第一位到第四位的比特列对齐网络号和主机号进行区分。
A类地址 :A类地址的第一个字节(最高位)为网络地址,其余三个字节为主机地址。第一个字节的范围是1到126(二进制表示为0xxxxxxx)。A类地址适用于大型网络,因为它们可以包含大量的主机(约1600万台)。用十进制表示的话,0.0.0.0~127.0.0.0
是A类的网络地址。示例:10.0.0.1
B类地址 :B类地址的前两个字节为网络地址,后两个字节为主机地址。第一个字节范围是128到191(二进制表示为10xxxxxx)。用十进制表示的话,128.0.0.0~191.255.0.0
是B类的网络地址。B类地址适用于中等规模的网络。示例:172.16.0.1
C类地址 :C类地址的前三个字节为网络地址,最后一个字节为主机地址。第一个字节范围是192到223(二进制表示为110xxxxx)。用十进制表示的话,192.168.0.0~239.255.255.0
是C类的网络地址。C类地址适用于小型网络,每个网络最多可以有254个主机。示例:192.168.1.1
D类地址 :D类地址用于组播,即数据同时发送给一组主机。第一个字节范围是224到239(二进制表示为1110xxxx)。用十进制表示的话,224.0.0.0~239.255.255.255
是D类的网络地址。D类地址不分配给单个主机,而是用于组播通信。示例:224.0.0.1
E类地址:E类地址是保留地址,用于科学研究或将来可能的用途。第一个字节范围是240到255(二进制表示为1111xxxx)。目前没有具体的E类地址分配给任何组织。
注意:除了以上五类地址,还有一个特殊地址范围是127.0.0.1到127.255.255.255,这是环回地址,通常用于本地机器上的软件测试。
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。
在分配IP地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为0或全部为1。因为全部为只有0在表示对应的网络号或IP地址不可获知的情况下才使用。而全部为1的主机地址通常作为广播地址。因此,在分配过程中,应该去掉这两种情况。这也是为什么C类地址每个网段最多只能有254(2^8^-2=254)个主机地址的原因。
广播地址 :广播地址用于在同一个链路中相互连接的主机之间发送数据包。将IP地址中的主机号部分全部设置为1,就成为了广播地址。
一个IP地址只要确定了其分类,也就确定了它的网络标识和主机标识。例如A类地址前8位(除首位"0"还有7位)、B类地址前16位(除首位"10"还有14位)、C类地址前24位(除首位"110"还有21位)分别是它们各自的网络标识部分。网络标识相同的计算机必须同属于同一个链路。
子网与子网掩码
网络标识相同的计算机必须同属于同一个链路。例如,架构B类IP网络时,理论上一个链路内允许6万5千多台计算机连接。然而,在实际网络架构当中,一般不会有在同一个链路上连接6万5千多台计算机的情况。因此,这种网络结构实际上是不存在的。这就引出了子网掩码。
子网划分是在一个较大的网络中创建多个较小网络的过程。它是通过将IP地址的网络部分进一步划分为子网来实现的,这样做可以更有效地管理网络,提高网络性能,并且有助于更好地利用IP地址空间。
子网掩码是一个32位的二进制数字,主要用于将一个大的IP网络划分为若干较小的子网络(子网)。它和IP地址结合使用,以确定一个IP地址中的网络部分和主机部分。
子网掩码由一系列的1和一系列的0组成,其中1代表网络位,0代表主机位。以下是常见的子网掩码及其对应的二进制表示:
- A类地址的默认子网掩码是255.0.0.0。255.0.0.0 对应于 11111111.00000000.00000000.00000000(A类地址默认子网掩码)。
- B类地址的默认子网掩码是255.255.0.0。255.255.0.0 对应于 11111111.11111111.00000000.00000000(B类地址默认子网掩码)。
- C类地址的默认子网掩码是255.255.255.0。255.255.255.0 对应于 11111111.11111111.11111111.00000000(C类地址默认子网掩码)
通过子网掩码,我们可以将A类、B类、C类的网络地址细分出更小粒度的网络。也就是将原来A类、B类、C类等分类中的主机地址部分用作子网地址,可以将原网络分为多个网络。
因此,一个IP地址就有了两个识别码,一个是IP地址,另一个是子网掩码。
它对应IP地址网络标识部分的位全部为"1",对应IP地址主机标识的部分则全部为"0"。由此,一个IP地址可以不再受限于自己的类别,而是可以用这样的子网掩码自由地定位自己的网络标识长度。当然,子网掩码必须是IP地址的首位开始连续的"1"。
- 确定网络地址:将IP地址与子网掩码进行按位"与"操作,可以得到网络地址。
- 确定主机地址:将IP地址与子网掩码进行按位"非"操作,然后与IP地址进行按位"或"操作,可以得到广播地址,从而确定主机地址范围。
- 划分子网:通过增加子网掩码中的1的位数,可以将一个大的网络划分为更小的子网。
以下是如何计算子网掩码的一些示例:假设我们需要为一个C类地址(192.168.1.0)创建一个可以容纳50台主机的子网,我们需要确定子网掩码。
- 首先确定所需的主机位数。50台主机需要足够的位数来表示,至少需要6位(2^6^ = 64 > 50)。
- C类地址有24位网络位和8位主机位。为了得到6位主机位,我们需要从8位中借用2位给网络位。
- 因此,新的子网掩码将是255.255.255.192(二进制为11111111.11111111.11111111.11000000)。
子网掩码可以用点分十进制表示,也可以用"/"后跟网络位的位数来表示,例如:
- 255.255.255.0 可以表示为 /24
- 255.255.255.192 可以表示为 /26
2、路由
路由控制(Routing)是指将分组数据发送到最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能"迷失",无法到达目标地址。因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。
路由器要有路由发现的算法。
每次跳跃的范围:以太网等数据链路中使用MAC地址传输数据帧。此时的一跳是指从源MAC地址到目标MAC地址之间传输帧的区间。也就是说它是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。在一跳的这个区间内,电缆可以通过网桥或交换集线器相连,不会通过路由器或网关相连。
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指定出来。因为每一跳在转发IP数据包时会分别指定下一跳的操作,直至包达到最终的目标地址。
我们仍可以使用之前旅游的例子,IP数据包可以当作旅行者,车站、机场可以视为路由器。当某个IP包到达路由器时,路由器首先查找其目标地址(IP包被转发到途中的某个路由器时,实际上是装入数据链路层的数据帧以后再被送出),从而再决定下一步应该这个数据包到达哪个路由器,然后再把包发送过去。当这个IP包到达那个路由器以后,会再次经历查找下一目标地址的过程,并由该路由器转发给下一个被找到的路由器。这个过程可能会反复多次,直到找到最终的目标地址将数据包发送给这个节点。
发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于"指明路由器或主机"的信息,以便真正发往目标地址。保存这种信息的就是路由控制表 (Routing Table)。实现IP通信的主机和路由器都必须持有一张这样的表。它们也正是在这个表格的基础上才得以进行数据包发送的。它包含了网络设备能够到达的网络地址信息以及如何到达这些地址的指示。
IP地址的网络号部分用于进行路由控制。下图说明了在复杂的网络环境中,如何利用路由器的路由表来决定数据包的最佳路径,从而实现不同子网之间的通信。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址,Windows可以使用 netstat -r
命令查看路由表,Linux下可以使用 netstat -rn
或route
查看。
在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。
eth0
是一个网络接口名称,通常用于表示第一块以太网网卡。在Linux系统中,网络接口的名称如 eth0
、eth1
等,代表不同的网络接口或网络适配器。具体来说:
-
eth0
: 这是系统中第一个以太网接口的名称。它通常是通过有线以太网连接到网络的网卡。如果系统中有多个以太网接口,第二个接口可能被命名为eth1
,第三个为eth2
,以此类推。 -
以太网接口 :
eth0
是传统的命名方式,表示通过以太网协议进行连接的接口。以太网是一种常见的局域网技术,用于计算机和网络设备之间的有线连接。 -
现代命名 : 在较新的Linux系统中,网络接口的命名方式已经变得更加复杂和灵活,可能会使用像
enp0s3
或ens33
这样的名称,这些名称是基于网络接口的硬件位置和其他因素动态生成的。
eth0
在网络配置和路由表中表示网络接口,用于发送和接收数据包。它可以通过网络配置工具(如 ifconfig
、ip
命令)进行管理和配置。
在 route
命令的输出中,各列的含义如下:
-
Destination : 目的地网络地址。这个字段指定了路由的目标网络或主机地址。它可以是一个具体的 IP 地址、一个网络地址或
default
(默认路由)。 -
Gateway: 网关地址。这个字段指定了数据包应该被转发到的下一个跳点的网关地址。对于默认路由,这通常是一个路由器或其他网络设备的地址。
-
Genmask: 子网掩码。这个字段指定了目的地地址的网络部分的掩码,用于确定目的地网络的范围。它定义了哪些部分是网络地址,哪些部分是主机地址。
-
Flags: 路由标志。这个字段显示路由的状态和特性。常见的标志包括:
U
:表示路由是"Up"(激活状态)。G
:表示路由是"Gateway"(通过网关)。H
:表示目标是一个"Host"(主机),而不是网络。R
:表示路由是"Reject"(拒绝),用于丢弃匹配的流量。
-
Metric: 度量值。这个字段表示路由的优先级。度量值越小,优先级越高。用于在多个路由选项之间进行选择。
-
Ref: 引用计数。这个字段显示有多少个路由条目引用了这个路由,通常用于内部计算。
-
Use: 使用计数。这个字段显示路由被使用的次数,表示流量通过这个路由的频率。
-
Iface : 网络接口。这个字段显示了用于发送数据包的网络接口名称,如
eth0
、wlan0
等。
每一列都帮助定义和描述路由条目的不同方面,确保网络流量按照预期的路径转发。
以下是 route
命令输出的中文解释:
-
default : 这是默认路由,用于匹配所有其他未指定的流量。它通过
_gateway
作为网关,子网掩码是0.0.0.0
,并且流量通过eth0
接口转发。 -
100.100.2.136 : 这条路由将目标 IP 为
100.100.2.136
的流量通过_gateway
转发,子网掩码是255.255.255.255
,接口为eth0
。 -
100.100.2.138 : 类似于上条路由,这条路由将目标 IP 为
100.100.2.138
的流量通过_gateway
转发,子网掩码也是255.255.255.255
,接口为eth0
。 -
172.19.80.0 : 这条路由涵盖了子网
172.19.80.0
,子网掩码是255.255.240.0
,流量直接通过eth0
接口转发。 -
_gateway : 这条路由表示网关本身,子网掩码是
255.255.255.255
,并且流量通过eth0
接口转发。
总的来说,流量主要通过 eth0
接口转发,有些特定 IP 地址和子网的流量通过指定的网关进行转发,默认路由用于处理所有其他流量。
3、IP报文
通过IP进行通信时,需要在数据起那么加入IP首部信息。IP首部中包含着用于IP协议进行发包控制的所有必要信息。下图是IPv4的数据报格式:
版本(version):占 4 位,表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4 ,即 IPv4。
首部长度 (IHL,Internet Header Length ):占 4 位,可表示的最大十进制数值是 15。这个字段所表示数的单位是4字节。因此,当 IP 的首部长度为 1111 时(即十进制的 15),首部长度就达到 60 字节。当 IP 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。
数据部分永远在 4 字节的整数倍开始,这样在实现 IP 协议时较为方便。首部长度限制为 60 字节的缺点是,长度有时可能不够用,之所以限制长度为 60 字节,是希望用户尽量减少开销。最常用的首部长度就是 20 字节(即首部长度为 0101),这时不使用任何选项。
区分服务 (TOS,Type Of Service):由8比特构成,用来表明服务质量。
总长度 :表示IP首部与数据结合起来的总字节数,单位为字节。总长度字段为 16 位,因此数据报的最大长度为 2^16^-1=65535 字节。
标志 (ID,Identification):由16比特构成,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。通常,每发送一个IP包,它的值也逐渐递增。此外,即使ID相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片。
标志 (flags):由3比特构成,表示包被分片的相关信息。
- 第1位标志是预留位,必须为0。
- 第2位标志是DF (Don't fragment),用来表示是否可以进行分片。DF = 1 表示不允许分片,DF = 0 表示可以分片。
- 第3位标志是 MF (More fragment)。代表数据是否分片,如果MF位值为1,表示后面还有数据,还没有传输完毕。如果MF = 0表示最后一个分片或者只有一个分片。
片偏移 (FO,Fragment Offset ):由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0。由于FO域占13位,因此最多可以表示8192(=2^13^ )个相对位置。单位为8字节,因此最大可表示原始数据8×8192 = 65536字节的位置。
生存时间 (TTL,Time To Live ):表示数据报在网络中的寿命,占 8 位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。
路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。 由此可以避免IP包在网络中无限传递的问题。
协议:表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。
首部校验和 (Header Checksum):由16比特(2个字节)构成,也叫IP首部校验和。该字段只校验数据报的首部,不校验数据部分。它主要用来确保IP数据报不被破坏。
源地址 (Source Address):由4个字节构成,表示发送端IP地址。
目标地址 (Destination Address):由4个字节构成,表示接收端IP地址。
4、IP报文的分片与重组
任何一台主机都有必要对IP分片进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。
不同数据链路有个最大的区别,就是它们各自的最大传输单位(MTU ,Maximum Transmission Unit)不同。就好像人们在邮寄包裹或行李时有各自的大小限制一样。MTU是网络协议的一个参数,它定义了在数据链路层可以传输的最大数据包大小。这个大小通常与网络媒介和技术有关。
MTU的值在以太网中是1500字节。IP的上一层可能会要求传送比这些MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。
为了解决这个问题,IP进行分片处理。顾名思义,所谓分片处理是指,将较大的IP包分成多个较小的IP包 。分片的包到了对端目标地址以后会再被组合起来传给上一层。即从IP的上层次看,它完全可以忽略数据包在途中的各个数据链路上的MTU,而只需要按照源地址发送的长度接收数据包。IP就是以这种方式抽象化了数据链路层,使得从上层更不容易看到底层网络构造的细节。
经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。
分片后每个分片都包含独立的IP报头。这是因为即使原始数据包被分片,每个分片仍然是独立的IP数据包,需要自己的IP报头来包含必要的IP层信息,如源IP地址、目的IP地址、协议类型(TCP或UDP)、分片标志等。
由于每个分片都是独立的IP数据包,它们在网络中传输时会受到IP层的处理,包括分片和重新组装,因此每个分片都有完整的IP报头。这个过程不影响TCP/UDP层的数据,每个分片都会包含完整的IP报头,以便在接收端能够正确地组装并传递给应用层。
接收方收到大量IP报文,这些报文可能来自多个客户端,并且其中有的报文进行了分片,有的没有。以下是接收方处理这些报文的步骤:
-
判断报文是否分片:
- 没有分片 :如果报文没有分片,它将直接被传输层接收并处理。
MF
为0,而且片偏移为0。 - 分片了 :如果报文进行了分片,接收方会检查每个分片的标志(Flags)字段中的
MF
(More Fragments)标志。- 第一片 :如果
MF
标志为1,表示还有后续的分片;片偏移一定是0 - 中间片 :中间的分片都具有
MF
标志为1。片偏移一定不是0 - 最后一片 :最后一片的分片具有
MF
标志为0。片偏移一定不是0
- 第一片 :如果
- 没有分片 :如果报文没有分片,它将直接被传输层接收并处理。
-
保证收到了所有的分片:
- 第一片丢了:如果第一片丢失,接收方无法正确地确定分片的顺序,因为它是第一个分片。接收方通常会等待一段时间,以期望第一片能够到达。如果在这段时间内没有收到第一片,接收方可能会选择丢弃整个分片数据包。
- 中间丢了 :如果中间的分片丢失,接收方仍然可以正确地组装剩余的分片,因为它们都带有
MF
标志。接收方会等待一段时间,以期望丢失的分片能够到达。如果在这段时间内没有收到丢失的分片,接收方可能会选择丢弃整个分片数据包。(IP报头有数据的大小,因此我们可以根据数据的大小和片偏移的大小来计算是否是中间某位置的分片) - 最后一片丢了:如果最后一片丢失,接收方无法正确地完成分片的组装,因为它是最后一个分片。接收方通常会等待一段时间,以期望最后一片能够到达。如果在这段时间内没有收到最后一片,接收方可能会选择丢弃整个分片数据包
- 接收方会根据每个分片的标识符字段来确定它们是否属于同一个原始数据包。
- 接收方会按照分片偏移字段中的信息来正确地组装分片。
- 接收方会等待足够长的时间来确保所有的分片都已经到达。如果在一个合理的超时时间内没有收到所有分片,接收方可能会丢弃该数据包。
-
组装分片并发送给传输层:一旦接收方确认所有分片都已到达并且可以正确组装,它将组装后的数据包传递给传输层。传输层(如TCP或UDP)会继续处理组装后的数据包,确保数据能够正确地传递给应用层。
注意:当如果一个 IP 分片丢失,整个 IP 报文的所有分片都得重传。
既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?
IP 层本身没有超时重传机制,它由传输层的 TCP 来负责超时和重传。
当某一个 IP 分片丢失后,接收方的 IP 层就无法组装成一个完整的 TCP 报文(头部 + 数据),也就无法将数据报文送到 TCP 层,所以接收方不会响应 ACK 给发送方,因为发送方迟迟收不到 ACK 确认报文,所以会触发超时重传,就会重发整个 TCP 报文。因此,IP 层进行分片传输是很没有效率的。
所以,为了达到最佳的传输效能 TCP 协议在建立连接的时候通常要协商双方的 MSS 值,当 TCP 层发现数据超过 MSS 时,则就先会进行分片,当然由它形成的 IP 包的长度也就不会大于 MTU ,自然也就不用 IP 分片了。
三、IP 属于面向无连接型
IP 面向无连接,即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送IP的数据,该数据会立即被压缩成IP包发送出去。
在面向有连接的情况下,需要事先建立连接。如果对端主机关机或不存在,也就不可能建立连接。反之,一个没有建立连接的主机也不可能发送数据过来。
而面向无连接的情况则不同。即使对端主机关机或不存在,数据包还是会被发送出去。反之,对于一台主机来说,它会何时从哪里收到数据也是不得而知的。通常应该进行网络监控,让主机只接收发给自己的数据包。若没有做好准备很有可能会错过一些该收的包。因此,在面向无连接的方式下可能会有很多冗余的通信。
四、IP协议相关技术
1、DNS
DNS (Domain Name System,域名系统)是一种分布式的数据库和命名系统,它将便于人类记忆的域名(如 www.baidu.com )转换为机器能够理解的IP地址(如 192.0.2.1)。DNS是互联网的关键组成部分,因为它使得用户无需记住复杂的IP地址就能访问网络资源。这样,我们平常在访问某个网站时不使用IP地址,而是用一串由罗马字和点号组成的字符串。
当用户输入主机名(域名)时,DNS会自动检索那个注册了主机名和IP地址的数据库,并迅速定位对应的IP地址 。而且,如果主机名和IP地址需要进行变更时,也只需要在组织机构内部进行处理即可,而没必要再向其他机构进行申请或报告。
域名的构成:域名是互联网上用于标识特定网站或资源的名称,它由多个部分组成,每个部分都有特定的含义和作用。
子域名(Subdomain) :
- 子域名是可选的,位于主域名之前,通常用于将网站的不同部分或服务进行分类。例如,
blog.example.com
中的blog
就是子域名。主域名(Second-Level Domain, SLD) :
- 主域名是域名的核心部分,通常反映了网站或组织的名称。在
www.example.com
中,example
就是主域名。顶级域名(Top-Level Domain, TLD) :
- 顶级域名位于域名的最右侧,用于指示网站或组织的类型或地理位置。例如,
.com
(商业机构)、.org
(非营利组织)、.net
(网络提供商)等。
域名的具体构成如下:子域名.主域名.顶级域名
例如,在域名
www.example.com
中:
www
是子域名,表示这是一个万维网服务。example
是主域名,这是组织或公司的名称。.com
是顶级域名,表示这是一个商业机构。以下是不同类型的顶级域名示例:
- 通用顶级域名(gTLDs) :
.com
、.net
、.org
、.info
、.biz
等。- 国家代码顶级域名(ccTLDs) :
.us
(美国)、.uk
(英国)、.de
(德国)、.cn
(中国)等。- 新通用顶级域名(New gTLDs) :
.club
、.shop
、.blog
、.app
等。
此外,还有一些特殊用途的顶级域名,如.gov
(政府机构)、.edu
(教育机构)、.mil
(军事机构)等。
在启用域名功能之前,单凭主机名还无法完全管理IP地址,因为在不同的组织机构中不允许有同名的主机。然而,当出现了带有层次结构的域名之后,每一个组织机构就可以自由地为主机命名了。
我们可以使用dig工具分析DNS 过程。centos下可以通过yum install bind-utils
安装dig工具。
bash
[root@zyb ~]# dig www.baidu.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47209
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 203 IN CNAME www.a.shifen.com.
www.a.shifen.com. 60 IN A 220.181.38.149
www.a.shifen.com. 60 IN A 220.181.38.150
;; Query time: 0 msec
;; SERVER: 183.60.83.19#53(183.60.83.19)
;; WHEN: Thu Sep 26 18:51:40 CST 2024
;; MSG SIZE rcvd: 90
上面是使用 dig
命令对域名 www.baidu.com
进行DNS查询的结果。
面试题:当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
当在浏览器地址栏输入一个URL并回车后,会发生以下一系列事件:
- 域名解析(DNS查询):浏览器首先检查域名是否在本地缓存中,如果没有,它会向网络中的DNS服务器发送请求,将域名解析为对应的IP地址。
- 建立TCP连接:浏览器使用解析得到的IP地址,通过互联网与目标服务器建立TCP连接。如果是HTTPS协议,还会进行SSL/TLS握手,确保数据传输的安全性。
- 发送HTTP请求:浏览器向服务器发送一个HTTP(或HTTPS)请求,请求可以包括GET或POST方法,以及请求头(如用户代理、接受的内容类型等)。
- 服务器处理请求:服务器接收到请求后,根据请求类型(如静态资源请求或动态页面请求)处理请求。如果是动态页面,服务器可能需要查询数据库、执行服务器端脚本等。
- 服务器响应:服务器处理完请求后,会返回一个HTTP响应,响应通常包括状态码(如200表示成功,404表示未找到等)、响应头(如内容类型、缓存策略等)和响应体(通常是HTML页面、图片、视频等资源)。
- 浏览器处理响应:浏览器接收到服务器的响应后,开始解析HTML文档,构建DOM树。同时,如果遇到外部资源的引用(如CSS、JavaScript文件、图片等),浏览器会发送额外的HTTP请求来获取这些资源。
- 渲染页面:浏览器根据CSS样式和HTML结构渲染页面,将内容显示在屏幕上。JavaScript文件执行可能会改变DOM结构或样式,进而影响页面的最终呈现。
- 关闭连接:如果服务器响应头中指示不需要持久连接(如HTTP/1.0),浏览器会在接收完资源后关闭TCP连接。如果是持久连接(如HTTP/1.1中的Keep-Alive),连接可能会保持一段时间以便传输后续请求。
2、ICMP
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通。但是 IP协议并不提供可靠传输。如果丢包了,IP 协议并不能通知传输层是否丢包以及丢包的原因。ICMP正式提供这类功能的一种协议。
ICMP的主要功能包括,确认IP包是否成功送达目标地址,通知在发送过程当中IP包被废弃的具体原因,改善网络设置等。有了这些功能以后,就可以获得网络是否正常、设置是否有误以及设备有何异常等信息,从而便于进行网络上的问题诊断。
在IP通信中如果某个IP包因为某种原因未能达到目标地址,那么这个具体的原因将由ICMP负责通知。
ICMP的这种通知消息会使用IP进行发送(在ICMP中,数据以明文的形式像TCP/UDP一样通过IP 进行传输。但ICMP仍是IP层的一部分)。收到ICMP包的主机就分解ICMP的首部和数据域以后得知具体发生问题的原因。
ping
是最著名的基于ICMP的工具之一,用于测试网络连接和延迟。它通过发送ICMP回显请求消息到目标主机,并等待目标主机返回ICMP回显应答消息来工作。
3、NAT技术
NAT(Network Address Translation)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。作为一种在IP网络中使用的路由技术,它允许一个或多个私有网络中的设备使用一个或几个公共IP地址来访问外部网络。
除了转换IP地址外,还出现了可以转换TCP、UDP端口号的NAPT技术,由此可以实现用一个全局IP地址与多个主机通信。
- 私有地址 :在内部网络(如家庭、办公室局域网)中使用私有IP地址,这些地址在互联网上不可路由。私有地址范围包括:
- 10.0.0.0 - 10.255.255.255(10.0.0.0/8)
- 172.16.0.0 - 172.31.255.255(172.16.0.0/12)
- 192.168.0.0 - 192.168.255.255(192.168.0.0/16)
- 地址转换:当内部网络中的设备需要访问外部网络时,NAT设备(如路由器)会将设备的私有IP地址和端口号映射到一个公共IP地址和不同的端口号。
- 端口号映射:NAT不仅可以转换IP地址,还可以转换端口号,以区分来自同一私有网络但不同设备的通信。
在NAT(NAPT)路由器的内部,有一张自动生成的用来转换地址的表。当10.0.0.10向163.221.120.9发送第一个包时生成这张表,并按照表中的映射关系进行处理。当私有网络内的多台机器同时都要与外部进行通信时,仅仅转换IP地址可不够,
当局域网内的主机访问公网时,通常情况下,局域网的出口路由器会将发往公网的数据包进行地址转换,将数据的源IP地址修改为路由器的公网IP地址,以便公网主机能够正确地返回响应。
在进行 NAT 转换时,路由器会将源 IP 地址和端口号替换为它自己的公网 IP 地址+端口号,并在其 NAPT 转换表中记录转换信息,以便在接收到响应数据包时,能够将目标 IP 地址从公网 IP 地址转换为对应的私有 IP 地址,并将响应数据包发送回相应的局域网主机。
具体而言,当路由器接收到返回的数据包时,它会检查数据包的目标 IP 地址+端口号。然后,根据NAPT转换表中的映射关系,找到对应的私有 IP 地址+端口号。接着,路由器会将数据包的目标 IP 地址+端口号修改为对应的私有 IP 地址+端口号,并将数据包发送到局域网内的相应主机。
4、DHCP
如果逐一为每一台主机设置IP地址会非常繁琐的事情。特别是在移动使用笔记本电脑、智能终端以及平板电脑等设备时,每移动到一个新的地方,都要重新设置IP地址。
为了
实现自动设置IP地址、统一管理IP地址分配,就产生了DHCP (Dynamic Host Configuration Protocol)协议。有了DHCP,计算机只要连接到网络,就可以进行TCP/IP通信。也就是说,DHCP让即插即用(指只要物理上一连通,无需专门设置就可以直接使用这个物理设备) 变得可能。而DHCP不仅在IPv4中,在IPv6中也可以使用。当子网中新增主机时需要给其分配IP地址,当子网当中有主机断开网络时,又需要将其IP地址回收,便于后续给新增主机分配。
使用DHCP之前,首先要架设一台DHCP服务器(一般用该网段的路由器充当DHCP服务器) 。然后将DHCP所要分配的IP地址设置到服务器上。此外,还需要将相应的子网掩码、路由控制信息以及DNS服务器的地址等设置到服务器上。