网络层的主要作用是 : 实现主机到主机 (IP 到 IP) 的通信,描述的是主机与主机的通讯,网络层使用的中间设备叫路由器
数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递, 而一旦跨越多种数据链路, 就需要借助网络层
网络层可以跨越不同的数据链路, 即使是在不同的数据链路上也能实现两端节点之间的数据包传递
举个例子, 当我们要到达某个目的地的时候, 提前制定一个行程表 (何时到哪一目了然) , 需要换乘多种方式, 于是需要购买机票, 火车票 , 当我们乘坐某种交通工具到达某个地方的时候 , 需要换乘, 但是具体换乘哪种方式, 这是不确定的, 比如滴滴, 朋友来接等, 但最终都会到达目的地
上面的行程表就相当于网络层, 而机票和火车篇相当于数据链路层, 从一个地方到另一个地方是逐跳, 两个地点之间就如同一个数据链路的源地址和目标地址等首部信息, 具体跳到哪个路由器是由具体的路由器决定的
其实具体的行程表是写在路由器上的, 可以说是有人预先安排了一个你不知道的具体行程的行程表
如果只有行程表而没有车票, 就无法达到目的地, 反之, 只有车票没有行程表, 也无法到达目的地, 以为你不知道哦该坐什么车, 也不知道在哪换乘
数据链路层传送的协议数据单元叫做 MAC 帧,而网络层传送的协议数据单元叫 IP 数据报
无连接的意思为 : 有可能先发的后到, 后发的先到
也就是说, 所传送的分组可能出错, 丢失, 重复和失序, 当然也不保证分组交付的时限
如果主机中进程之间的通讯是可靠的, 那么就由网络中的主机中的运输层负责, 采用这种设计思路的好处就是 : 网络造价大大降低, 运用方式灵活, 能够适应多种应用
IP 协议是 TCP/IP 体系中最主要的协议之一, 也是最重要的互联网标准协议之一
与 IP 协议配套使用的还有三个协议:
不可靠
不能保证 IP 数据报能成功地到达目的地, 仅提供最好的传输服务
如果发生某种错误时, 如某个路由器暂时用完了缓冲区, IP 有一个简单的错误处理算法 : 丢失该数据报, 然后发送 ICMP 消息给信源端, 任何要求可靠性必须由上层来提供 (比如 TCP)
无连接
每个数据报的处理是相互独立的, IP 数据报可以不按照发送顺序接收
在计算机通信中,为了识别同行对端,必须要是有一个类似于地址的识别码进行标识。在数据链路层中,MAC 地址正是用来标识同一个链路中不同计算机的一种识别码
作为网络层的 IP ,同样存在这种地址信息,叫做 IP 地址,IP 地址用于 “连接到网络中的所有主机中识别出进行通信的目标地址”,一个标准的 IP 地址如下:192.168.31.1(以点分开,一共占 4 个字节)
IP 地址和硬件地址是有区别的
在发送数据时, 数据从高层到低层,然后才到通信链路上传输。使用 IP 协议的 IP 数据报一旦交给了数据链路层,就被封装成了 MAC 帧。 MAC 帧在传送时使用的源地址和目的地址都是硬件地址, 这两个硬件地址都写在 MAC 帧的首部中。
总之,IP 地址放在 IP 数据报的首部, 硬件地址放在 MAC 帧首部
用来与 IP 地址做按位与运算,得到网络号(或者叫网段),每个路由器都连通了两个网络
比如 IP 地址 :192.168.31.52,掩码为 255.255.255.0,它们按位与得到的结果为 192.168.31.0,这就是此台计算机所处的网络号
当路由器将 IP 地址与掩码按位与得到网络号在路由表上找不到后,就要转发下一跳,交给下一台路由器
每行占四个字节
占 4 位, 标识 IP 首部的版本号, IPv4 的版本号即为 4
占 4 位, 单位为 4 字节, 对于没有可选项的 IP 包, 它的长度为 20 字节, 此时应该填入 5
占 8 位, 用来表示服务质量, 前 3 位表示 IP 优先级 (0~7, 但是 5 是最高的), 后 3 位表示 TOS
几乎所有的网络都无视这些字段 (TOS 不用, 但是 IP 优先级是用的)
DSCP 是 TOS 的一部分, 现在统称 DissServ, 用来质量控制
AF : 确保转发 (AF11 一般对应 FTP)
EF : 加速转发 (一般对应语音流量)
BE : 尽力转发
ECN 用来报告网络拥堵情况, 占 2 位
表示 IP 首部与数据部分合起来的总字节数, 占 16 位, 单位为字节, 意味着 IP 包的最大长度为 65535 字节 (不可能超过这个限制)
占 16 位, 用于分片重组, 同一个分片的标识值相同, 不同分片的标识值不同
通常, 没发送一个 IP 包, 它的值会递增
此外, 即使 ID 相同, 如果目标地址, 源地址或协议不同的话, 也会被认为是不同的分片
占 3 位, 标识包被分片的相关信息,
第 1 个比特位 : 未使用, 现在必须是 0
第 2 个比特位 : 指示是否进行分片, 0 表示可以分片, 1 相反
第 3 个比特位 : 包被分片的情况下, 表示是否为最后一个包, 0 表示最后一个分片的包, 1 相反
占 13 位, 用来标识分片的每一个字段相对于原始数据的位置
占 8 位, 指的是可以中转多少个路由器的意思, 每经过一个路由器, 递减, 为 0 时丢弃该包
占 8 位, 表示 IP 首部的下一个首部隶属于哪个协议
占 16 位, 校验数据报的首部, 不校验数据部分, 用来确保 IP 数据报不被破坏
占 32 位, 表示发送端的 IP 地址
占 32 位, 表示接受端的 IP 地址
长度可变, 通常只在进行实验或诊断时使用, , 最大占 40 字节, 可以用来记录 IP 数据报经历了几跳, 每一跳占 4 个字节, 最大可记录 9 跳
如果长度不足 4 字节整数倍, 需要填充
IP 数据报携带的数据, 将 IP 上层协议的首部 (TCP 首部, UDP 首部…) 也作为数据进行处理
在互联网转发数据报时,是从一个路由器根据路由表转发到下一个路由器,在路由表(必须使用 IP 地址)中,对每一条路由最重要的是这两个信息:目标的网络地址 ,下一跳地址
IP 数据报的转发是交给路由器处理的, 路由器根据目的 IP 地址查找路由表进行转发
在逐跳的过程中
首先将 IP 数据报封装成 MAC 帧,交给数据链路层传输,数据链路层只能看到硬件地址
数据链路层根据硬件地址找到链路节点,链路节点收到 MAC 帧后,根据硬件地址决定是收下还是丢弃
如果收下,剥去 MAC 的帧首部和尾部交给网络层
现在,路由器就能看到 IP 数据报的 IP 地址了, 将目的 IP 地址与掩码按位与得到网络号,如果此台路由器找不到该网络号,就需要交给下一跳了
每一跳硬件地址会逐链路变化,路由表找到下一跳的 IP 地址后, 网络接口软件使用 ARP 把下一跳的路由器 IP 地址转换成硬件地址,填入 MAC 帧首部
IP 数据报最终一定可以找到目的主机所在目的网络上的路由器,只有到达最后一个路由器时,才试图向目的主机进行直接交付
源 IP 和目的 IP 始终保持不变 (除非有 NAT 存在)
IP 把 MTU (MAC 帧数据部分的最大长度 1500)与数据报长度进行比较
如果需要进行分片,分片可以发生在原始发送端主机上,也可以发生在中间路由器上
把一份 IP 数据报分片以后,只有到达目的地才进行重新组装
重新组装由目的端口 IP 层来完成,其目的是使分片和重新组装过程对传输层是透明的
传输层的 TCP/UDP 根本不知道什么是分片,它只知道我发了一坨数据,或者收到了一坨数据 , 它根本不管你网络层是怎样处理的(它只管将数据报交给网络层 ,或者将数据报分用给应用层)
已经分片过的数据报有可能会再次进行分片(可能不止一次)