网络
形式化的定义网络为图
计算机网络
层级
- 应用层(application)
- 网络层(network)
- 传输层(transport)
- 链路层(link)
- 物理层(physics)
每层都向上提供接口,利用下层的服务实现更强的功能
逻辑上数据传输是在同层之间的,实际上是通过向下调用接口实现真正的传输,最终是物理信号在真实世界里的传输。
节点
特别的,计算机网络中的节点有两种类型
- 主机(host)。通常用 \(\square\) 表示
- 网络交换设备(packet switch),包括交换机、路由器等等。通常用 \(\bigcirc\) 表示
边
链路指连接两个节点的边,同样有两种类型
- 接入网链路,边的一端为主机。
- 主干链路,非接入网链路。
可以发现逻辑上我们只关心所有 \(\square\) 组成的网络,所有的 \(\bigcirc\) 只是为了中继。这是因为只有主机会产生和消费数据,而所有的交换设备只负责转发(当然也有交换设备会消耗数据,例如带拦截广告功能的软路由...)
互联网
以 TCP 和 IP 协议为主的最大的那个网络。感觉这个定义非常有意思。
粗略地讲,可以把网络划分为三个部分
- 核心,即非主机的、提供网络连接功能的部分
- 接入,即主机到核心的连接
- 边缘,即所有主机,提供了网络的应用服务
边缘
主要是应用进程。这些应用通过 OS 提供的网络 api 来进行远程进程通信
通信模式
- C/S 模式,即主从关系
- P2P 模式,即对等关系
通信方式
- 面向连接,即在正式通信前需要建立连接,进行准备。
- 无连接
网络不过是另一种进程间通信,具体的细节对于用户进程而言是不可感知的。
核心
电路交换(circuit switch)
从电话网来
- 通信双方建立专有连接(耗时)
- 中间节点需要维护通信状态
- 每段线路划分为固定的片,每个用户每次只能用其中一片
- 划分的方式包括:
- 时分复用
- 频分复用
分组交换(packet switch)
- 无需建立专有连接
- 中间节点无需感知通信状态
- 通信数据被划分成段传输。任意时刻,数据独占一段通信线路,可以实现同时间内不同线路的共享
- 转发节点内有等待队列
- 本质上是一种离散的时分复用,也叫 statistical multiplexing
还可以细分为 datagram switch 和 virtual circuit switch,后者本质上是希望 packet switch 能有 circuit switch 的某些特性提出来的 hack。
接入
这部分解决了我对一些名词的陈年疑惑...非常奇妙
调制解调器(modem)
最早是利用已有的电话线路接入网络的。modem 负责把数字信号调制成音频信号,由电话线路传输后入网。
- 上网和打电话不能同时进行
- 带宽很低
- 成本低,复用线路
- 是专线
有些实现把电话线频分复用,专门留出一部分给网络。其中又分出上下行专用的带宽,这样就可以同时打电话和上网了。这样的方式叫 DSL(Digital Subscriber Line)
有线电视(cable)
同样是类似的思路,利用已有的有线电视线路。
这下终于知道为什么以前爹妈拔掉机顶盒的线就没法上网了。
电网
可以调制解调到电力(电流)上...
物理媒体
- 导引性媒体,有型介质、存在导体、可以定向传播,例如光纤、电缆
- 非导引性媒体,例如电磁波
四层
应用层
注意到网络提供的服务本质上就是 RPC,因此协议做的事情和 shell 命令解析是同样的。
有 HTTP FTP SMTP POP3 一大堆协议。这是因为应用很多,不同应用的协议通常不共享。
应用层的许多协议因为历史原因,都是明文传输数据的(即协议本身不负责内容的加密)。解决的办法是在此之上加一层加密层(例如 HTTP + TLS = HTTPS),这样明文传输的就是加密后的内容了。
进程通常在 OS 中通过 socket api 来管理和使用它与其它进程的连接。连接(即进程-进程对)与 socket 是一一对应的关系,而和端口号没有数量关系(一个进程可以通过一个端口和多个进程建立连接,此时多个连接共享一个端口,各自通过不同的 socket 把数据传递给对应的进程)
传输层
提供的是进程到进程的字节流通讯,进程通过端口号区分。
TCP(Transmission Control Protocol)
- 面向连接,通信前需要握手建立连接
- 可靠服务,保证顺序、正确性等等
- 流量控制,可以协调发送方和接收方的传输速度
- 拥塞控制,可以适应网络的拥堵
UDP(User Datagram Protocol)
- 无连接
- 不可靠
- 无流量控制
- 无拥塞控制
网络层
IP 协议提供了主机到主机的不可靠通信。这里主要包括
- 路由,即修改和查询路由表这个数据结构
- 转发,查询路由表,把 packet 发给下一跳设备
- 缓冲,提供队列缓冲已处理但还未轮到发送的 packet
- TTL,丢弃可能走入环路的包
- 校验
链路层
也有可靠和不可靠的协议,通常介质越可靠则协议越不可靠;介质越不可靠则协议越可靠。
还有被动介质的说法,例如 WiFi 的工作原理决定了所有的数据都会被发送给终端设备,那些不属于目标设备的数据帧将会被终端设备自行丢弃。这使得同一 WiFi 下的终端设备可以彼此看到对方的数据帧,从而还原出数据包,这就带来了潜在的窃听风险。