一、前言
前面我们学习了应用层的HTTP/HTTPS协议和传输层的TCP/UDP协议。
HTTP/HTTPS协议主要是对数据请求的一个传输超文本应用层协议。HTTP/HTTPS协议的主要目的是确保客户端和服务器之间的数据传输安全、可靠、高效。通过HTTP/HTTPS协议,用户可以使用浏览器访问互联网上的各种网站,并且在网站之间浏览、跳转、获取信息等操作。
TCP协议是对传输的数据进行控制,保证数据传输的可靠性的传输层协议。UDP协议是对传输的数据可以容忍一定数据丢失的传输层协议。TCP协议确保数据的可靠性和完整性,通过数据确认和超时重传等机制,以确保数据按正确的顺序到达目标。UDP协议它不提供数据确认、重传或连接状态维护,因此在传输速度上通常较快。
但这里我们已经了解到了安全、可靠、高效的传输,但是到底怎么传输呢?数据是怎么通过网络找到目标主机的呢?接下我们来看网络层的IP协议。
二、简单认识IP协议
2.1 IP协议的基本概念
IP(Internet Protocol)是一种网络通信协议,它是互联网的核心协议之一,负责在计算机网络中路由数据包,使数据能够在不同设备之间进行有效的传输。IP协议的主要作用包括寻址、分组、路由和转发数据包。
注意,IP协议负责的是数据包的路由。其作用类似于邮政系统中的邮政地址。它为数据包提供了唯一的地址,并规定了如何将数据包从发送方路由到接收方。
举个例子理解一下:想象一封电子邮件从您的计算机发送到朋友的计算机。在这个过程中,IP协议充当了邮递员的角色。它确保邮件(数据包)具有正确的发送地址和接收地址,并且知道如何跨越网络中的路由点(类似邮局)以最终到达目的地。无论您的朋友身在世界的哪个地方,IP协议都能确保邮件准确地送达。
2.2 IP协议报文格式
IP协议报文由两个主要部分组成:IP首部和数据部分。具体如下图:
- IP首部:
- 4位版本(Version):指示IP协议的版本号,通常为4(IPv4)或6(IPv6)。
- 4位首部长度(Header Length):指示IP首部的长度,以32位字长为单位,即4字节。实际长度为该字段值乘4。包含 选项 字段的大小。
8位服务类型(Differentiated Services):3位优先权字段(已经弃用),4位TOS字段,,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时、最大吞吐量、最高可靠性、最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(Total Length):指示整个IP报文的长度,包括首部和数据部分。
- 16位标识(Identification):用于唯一地标识一个IP数据报,常用于分片和重组。
- 3位标志(Flags):用于指示数据报的处理状态,包括是否可以分片和是否是最后一片。第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。 第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
- 13位片偏移(Fragment Offset):用于指示该分片相对于原始数据报起始位置的偏移量。
- 8位生存时间(Time to Live,TTL):防止数据报在网络中无限循环,每经过一个路由器,该值减1,直到为0,数据报将被丢弃。
- 8位协议(Protocol):指示封装在IP数据报中的上层协议,如TCP、UDP等。
- 16位首部校验和(Header Checksum):用于检验IP首部中是否发生错误。
- 源IP地址(Source IP Address):指明发送方主机的IP地址。
- 目标IP地址(Destination IP Address):指明接收方主机的IP地址。
- 可选项(Options):可选字段,包括记录路由路径、时间戳、安全和加密等信息。最多40字节。
- 数据部分:
- 数据部分是IP协议传输的实际数据,可以是TCP、UDP等上层协议封装的数据。
上述即为IP报文格式的详解,关键在于16位标识、3位标志、13位片偏移。这就涉及到数据的分片与组装了。下文会对此进行详细解释。
2.3 分片与组装
网络层的IP协议是为数据的路由提供决策,而真正的对数据进行转发路由的是数据链路层。如下图:
由于链路层物理特征的原因,一般无法转发太大的数据。链路层转发数据报文到网络是有大小限制的,一般是1500字节这也就是我们所说的MTU。
最大传输单元(Maximum Transmission Unit,简称MTU)是指通信网络中可以一次性传输的最大数据包大小。它通常以字节数为单位表示。MTU对网络通信非常重要,因为它影响到数据传输的效率和网络的性能。
在网络通信中,数据传输的基本单位是数据包。每个数据包包含数据以及相关的控制信息。MTU定义了一个数据包的最大大小,超过这个大小的数据包需要分片成更小的数据包进行传输,然后在目的地重新组装。我们也可在Linux下查看自己主机的MTU大小,具体如下图:
那么这里就涉及到一个问题:我们知道分片和组装都是有消耗的,分片行为是网络层做的,那么组装是由谁来做呢?也是网络层!因为我发送方发送的是一个TCP完整的报文,报文大小大于1500字节后,网络层就需要对其进行分片再交给链路层。接收方在网络层向上交付时,也得需要一个完整的报文。至于你是怎么做的,传输层一点也不关心。具体如下图:
接下来我们看一下网络层分片与组装的过程。举例详解网络层的分片与组装过程:
- 数据分片:
假设我们有一个较大的数据包,它需要通过网络传输。首先,网络层会将这个数据包分成多个较小的分片。每个分片包含数据的一部分,以及一些关键的信息,如分片的偏移量和标识号。这些信息在后续的组装过程中用于正确还原数据。分片的传输:
这些数据分片被分别发送到网络中。它们可以采用不同的路径,经过不同的路由器和链路,因为