网络层那点事儿~

网络层和链路层

传输层提供端到端的可靠传输,也就是不同主机中的进程间通信,通过端口唯一确认主机中的进程,TCP 报文首部也有端口字段,详情可见 TCP 报文段格式

网络层负责将数据从一台主机传输到另一台主机,往往这两台主机在物理上没有直接相连;而链路层也是负责将数据从一台主机传输到另一台主机,往往这两台主机在物理上直接相连

下面主要介绍网络层和链路层是如何相互配合将数据从一台主机传输到另一台主机。网络层通过 IP 地址定义一台主机,链路层通过 MAC 地址定位一台主机。下面模拟一种场景,如下图所示:

1

注意:路由器的每个端口都有一个 IP 地址和 MAC 地址

主机 A 向主机 B 发送数据,它们俩在物理上没有直接相连,需要依赖网络层将数据从主机 A 发送到主机 B

可以看出数据包在传输过程中,报文的源/目标 IP 地址始终保持不变,分别为:10.0.1.210.0.5.6,变化的是 MAC 地址。网络层负责根据 IP 地址寻址➕路由,而链路层负责将数据在两个物理上相邻的节点中传输!!

注意:由于 MAC 地址在网络层封装,所以有些说法认为 ARP 属于网络层,有些说法认为 ARP 属于链路层,但这不重要,只要理解这个过程即可

IP 分类

IP 主要分为五类:A 类地址、B 类地址、C 类地址、D 类地址、E 类地址,但这里只想简单给出公有 IP 和私有 IP 的分类

简单来说,公有 IP 是网络中所有人都可以访问的 IP,而私有 IP 只有在同一个局域网中的人才可以访问。公有 IP 不允许重复;同一个局域网中的私有 IP 不允许重复,但在不同的局域网中可以重复

私有 IP 只有三种范围,如下:

在这三个范围之外的所有 IP 都是公有 IP!!

路由控制

上文说:网络层负责将数据从一台主机传输到另一台主机,往往这两台主机在物理上没有直接相连。那么它是如何将数据从一台主机传输到另一台主机呢?

网络层有一个重要的设备:路由器,它内部有一张路由转发表,根据目标 IP 地址可以知道该数据包从路由器的哪一个端口转发出去。回到第一部分的例子中,先将例子扩展的更丰富一些,如下图所示:

2

上图中 IP 数据包的源 IP 地址为10.1.1.30,目标 IP 地址为10.1.2.10

第一步:主机 A 根据目标 IP 地址匹配到0.0.0.0/0,那么下一跳就是10.1.1.1。这里的0.0.0.0/0就是默认路由,在没有匹配到其它路由时就会匹配默认路由,默认路由的下一跳就是默认网关

第二步:路由器根据目标 IP 地址匹配到10.1.2.0/24,那么下一跳就是10.1.0.2

第三步:路由器根据目标 IP 地址匹配到10.1.2.0/24,那么下一跳就是10.1.2.1,最终通过交换机将数据发送给目标主机

IP 分片与重组

数据链路层的传输单位是帧,不同的数据链路有不同的最大传输单元 (MTU),以太网的 MTU 是 1500 字节。换句话说,MTU = IP 首部 + TCP 首部 + 数据,一旦「IP 首部 + TCP 首部 + 数据」超过了 MTU,那么就会分片

在 TCP 中,如果数据长度 > MTU - IP 首部 - TCP 首部,就会进行分片;在网络层中,如果 TCP 首部 + 数据 > MTU - IP 首部,也会进行分片

如果 TCP 不分片,仅仅在网络层分片,那么一旦某个分片数据丢失,TCP 需要重传整个数据,因为 TCP 需要保证数据的可靠性,而网络层不需要保证数据的可靠性

所以 TCP 也会进行分片,如果某个分片数据在传输过程中丢失,那么只需要重传该分片数据即可,不需要重传所有数据

一般来说,TCP 分片已经考虑了 IP 首部的长度,所以在网络层不会超过长度,也就不会再进行分片,但存在一些特殊情况需要在 TCP 分片后,网络层还需要继续分片,如传输链路中存在更小的 MTU

详情分析可见 TCP分段了,IP层就一定不会分片了吗?