组成

原始的冯诺依曼架构:

image-20250510174220692

网络

总体模型:

-OSI-------TCP/IP-
应用层
表示层
会话层     应用层
-----------------
传输层     传输层
网络层     网络层
链路层     链路层
物理层

mac addr 每个网络硬件设备的物理地址,有48位,用以区分局域网内的设备.

mac addr 是可修改的,下面以 archlinux 为例:

ip link # 来自包 iproute2 查看网卡设备, 其中 link/ether 后跟的就是 mac 地址
ip link set dev interface down
ip link set dev interface address XX:XX:XX:XX:XX:XX
ip link set dev interface up

注意,因为 MAC 地址是与硬件绑定的,这种修改 mac 地址的方式是临时的.

想要让类似的变更永久生效,需要在系统重启时执行相应的命令或者修改对应的网卡配置文件.

HUB 双绞线 CSMA/CD 协议

HUB 集线器所在为物理层

SW 交换机 维护 mac 地址,使用网线,内有八根线,数据全双工

交换机所在层为数据链路层,其中数据如下:

数据头(起点->终点 mac 地址)| 数据

桥接:多个交换机相连

消息洪泛:找不到对应目标mac的SW会全体广播等待回应

SW 交换机可以在小范围内实现高效传输(内部 mac 表最大只有千条数据)

为解决这个问题,我们在交换机间设立路由器(网关)

IP 地址:

  1. 标识网络
  2. 标识设备

路由器通过一系列经过高度优化的算法,建立路由表.(网络层)

Q: 有 IP 还需要 mac 吗

A: IP 是抽象地址,不能直接用来通信,最终的通信还是需要用 mac 通信

内网通信流程:

  1. 通过 ARP 协议通过目标 IP 地址查询 mac 地址.
  2. mac 层传输

子网 ID 截断(按照binary的位)掩码位的 IP,以表示来自哪个子网.

IP: 192.168.1.1 子网掩码:255.255.255.0

此时包是这样的:

[数据头(起点->终点 mac 地址)| [IP 数据头(起点->终点 IP 地址) | IP 数据包的数据] ]

在上述包的传输过程中, IP 地址不变,而 mac 源目地址在不同阶段是会发生变化的.

NAT协议:共用 公网 IP 地址

特例:NAT 时,源地址的 IP 也会变化

TODO

事实上,我们以后还会继续这个套娃过程:

[mac 包头 | [IP 包头| [TCP 包头 | [HTTP 包头 | DATA... ] ] ] ]

路由器的连接成网

OSPF 协议:自动维护下一跳,哪些子网属于哪个路由器

BPG 协议辅助

端口:单台计算机的多应用

UDP 协议

不同的应用使用不同的端口

UDP 简单粗暴但是不稳定,TCP稳定(纠错机制)

如:

  1. 数据分段发送
  2. 每段数据接受后需要收到,不然重新发送

著名的“三次握手”:

四次挥手:

  1. 第一次挥手:A 说“我没啥要说的了”
  2. 第二次挥手:B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
  3. 第三次挥手:于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
  4. 第四次挥手:A 回答“知道了”,这样通话才算结束。

参考原文

UDP 和 TCP 是传输层,所有的应用层协议都建立在它们之上

TCP:

现在让我们来重新介绍 TCP/IP 模型下的计算机网络:

应用层:上层应用所处理的内容

传输层:错误检测、流量控制、数据分段

网络层:处理数据包的路由和转发

链路层:负责在物理链路上可靠地传输数据帧

下三层在 OS 内部实现.

层与层之间: