计算机网络相关概念
计算机网络是由若干个计算机节点或者相关硬件节点与链接这些节点的链路组成的网状数据通路。
internet和Internet是两个需要区分的名词,前者是泛指的互联网结构,而后者是基于TCP/IP协议的现代 因特网。
以太网是一种使用有线连接实现局域网连接的技术形式,以太网主要通过“星型拓扑结构 + 交换机 + 网线/光纤 + 物理网卡”的方式来实现。
计算机网络的分类
按网络使用者划分可以分为:
- 公用网 -- 由电信运用商建设,由互联网服务提供商(ISP),如中国移动,向普通用户提供互联网接入
- 专用网 -- 特定单位的需求下的专门内部网络,不对外使用。
按照空间拓扑结构可以分为
- 总线型 -- 单一互联网总线串联所有计算机。建网结构简单,但是重负载情况下的通信效率低。
- 星形网络 -- 中心化的网络架构,所有计算机通过独立线路与中心设备相联。实现成本高且中央设备对故障敏感,优点是便于管理与控制。
- 环形网络 -- 去中心化的网络架构,通过环形网络连接所有计算机。例子:令牌环局域网
- 网状网络 -- 去中心化的网络架构,广泛应用于广域网,可靠性较高,但是控制复杂,线路成本较高。
按照分布范围分类
- 广域网(WAN) -- 长距离通信,城市间的互联网结构,用于构成互联网的骨干部分,通过高速链路连接节点交换机。
- 城域网(MAN) -- 中距离通信,城市内或者城市群内的互联网结构。城域网通常使用以太网,因此有时也被纳入局域网。
- 局域网(LAN) -- 短距离通信,通过主机高速线路互联。
- 个人区域网(PAN) -- 使用无线网络在个人工作区域连接计算机与其他消费电子设备。
按传输技术分类 - 广播式网络 -- 联网计算机共享同一个公共通信的信道,所有计算机都能收听到报文信息,根据目的地址的检查决定是否
- 点对点网络 -- 每一条物理线路独立连接一对计算机,如果主机间没有直接连接,则分组通过中间件
计算机网络的功能
- 数据通信
- 资源共享 -- 硬件/软件/数据的共享, 比如NAS实现云存储
- 分布式处理 -- 单一复杂任务的分布式计算
- 提高可靠性 -- 通过网络进行数据备份,比如git
- 负载均衡 -- 高并发任务的负载分配
网络的信息交换方式
节点间的信息交换方式分为
- 电路交换
- 报文交换
- 分组交换
电路交换
电路交换是通过电话线+电话交换机形式建立节点间的稳定通信线路资源,建立后通信线路由双方独占直到结束。因此电路交换通常只使用低频、连续且大量的
电路交换分为三个阶段 -- 建立连接(开启占用通信资源) -> 传输数据(持续占用通信资源) -> 释放连接(释放通信资源)
电路交换面临的问题有: 建立连接的时间长、线路利用率低与灵活性差、难以实现差错控制
报文交换
报文交换是用户节点将传输信息(比如源地址、目的地址等控制信息)封装为报文后传输。报文通过存储转发技术,在通信双方的节点中间的节点之间进行接收、存储、转发直到最终接收的节点。
假如节点A到节点B存在多个路径,每一个报文可以独立选择如何经过
交换节点能对报文进行差错检验,从而实现差错控制。报文交换方式不需要独占通信线路资源,线路利用率高。但是交换节点需要缓存报文后再转发,加大了缓存开销与转发的时间开销。如果报文过长,重传的成本也相应提高。
分组交换
分组交换则是将报文进一步拆分为等长的数据段,每一个细分的数据段的首部包含必要的控制信息(源地址、目的地址、分组号等),组内的数据传输可能不通过相同的路径传输。网络中的分组交换器查询分组的首部后缓存并处理转发。
- 数据报服务 -- 数据报是分组的一种具体的实现形式,中转路由器将数据报作为独立的实体进行缓存、转发,同一报文的若干个数据报可能通过完全不同的路径传输。
- 虚电路服务 -- 仿照电路交换模式,在通信的结点间的所有交换设备建立逻辑通信连接,逻辑连接建立后会分配一个唯一的虚电路标志(VCID),分组通过VCID进行传输与转发。
分组方式降低了报文的出错概率与重传的代价,遇到分组出错后只需要重传分组片段而不需要重传整个报文。但是每一个分组都需要额外的控制信息管理分组段。增加了控制复杂度同时降低了有效信息密度。
分组可能失序、丢失或者重复,通常需要控制信息的管理。数据报服务模式的分组可能通过不同路径到达目的主机,需要在目的主机重排序,也有可能在传输过程发生丢包。虚电路不会发生失序,但是和电路交换一样有连接的建立与占用的时间与通信资源的开销。
分组交换的时延通常是最小的,相比而言最灵活且最适合突发式通信。
网络的性能指标
- 速率 -- 数据传输的速度
- 带宽 -- 信道支持的最大速率
- 吞吐量 -- 单位时间内通过某个位置的实际数据量
- 时延 -- 从当前结点传输到目的结点的总耗时,包括发送时延、传播时延、处理时延、排队时延
发送时延指发送结点分组信息全部推入传输链路的耗时。满足
传播耗时为数据在信道中的传输时间
处理时延为交换结点内的处理耗时
排队时延为数据在路由器等设备等输入输出队列中的排队耗时
关于传输信道的其他性能指标有:
- 时延带宽积 -- 第一个比特到达接收端时,已发送的比特量。
- 往返时延
- 信道利用率 -- 有数据通过的时间占整个统计时间窗口的比例
计算机网络的体系架构
计算机网络分层架构
OSI 模型是ISO提出的网络体系标准,称为开放系统互联参考模型(OSI),自上而下分为
应用层 -> 表示层 -> 会话层 -> 传输层 -> 网络层 -> 数据链路层 -> 物理层
分层的基本原则为:
- 各层基本的功能相对独立,符合各层的技术实现目标
- 各层的接口清晰,依赖少
- 层间保证独立性,上层向下层提供服务,下层为上层提供数据
- 分层结构有利于标准化工作
各个层间的数据块可以分为:
- 数据服务单元(SDU) -- 相邻层之间交换的数据单元,第 层的SDU记为 n-SDU
- 协议控制信息(PCI) -- 用于当前层处理的控制协议操作信息, 第 层的PCI记为 n-PCI
下层传入当前层的信息称为协议数据单元(PDU), 包含SDU与PCI,当前层将PCI处理后,将SDU传递到下一层作为下一层的PDU。第 层的PDU记为 n-PDU
因此满足
协议是各层对应实体之间的通信协规则集,协议由三个部分组成
- 语法
- 语义
- 同步(时序)
接口是单个实体的各层之间的访问点
服务是下层为相邻的上层暴露的功能调用。
三者整体结构关系为
协议
n层 实体 ------实体
| 接口| 服务
n-1层 实体 ------实体
根据是否连接/是否可靠/是否应答可将服务分为:
- 是否连接
- 面向连接服务 -- 通信双方在传输前先建立连接并分配相应资源。最典型的场景就是电路交换或者虚电路模式的分组交换以及SSH等连接服务
- 无连接服务 -- 网络动态选择路径,无需预先建立连接。
- 是否可靠
- 可靠服务 -- 具有检错、纠错、应答机制,保证传输等数据完整且正确
- 不可靠服务 -- 无连接服务无法保证完全的可靠性
- 是否应答
- 有应答服务 -- 接收方获得数据后会向发送方发送应答。类似于FTP的文件传输服务是有应答服务
- 无应答服务 -- 接收方不返回应答,比如网页访问,客户端本地收到网页(比如相应的html/css/js文件)并不会返回应答
OSI结构
物理层
物理层是实现最底层传输信息流的层,比如设备的接口特征、通信的编码意义和电气特征等。
传输介质并不属于物理层的信息,底层信息传输不会关注传输介质的不同,因此这是属于比物理层更底层的物理介质层。
数据链路层
数据链路层内的数据开始存在意义,而不是物理层中透明的原始比特流。数据链路层的数据单位是 帧。
在数据链路层中,计算机能实现基本的差错控制与流量控制,以及对共享信道的访问控制。
数据链路层是根据MAC地址进行结点与结点间通信的
网络层
网络层的传输单位是数据报(一种分组方式),主要任务是将数据报单元传输到目的主机。虚电路模式与数据报模式的数据交换都是发生在网络层的数据交换。
网络层提供的功能主要是
- 流量控制 -- 协调发送主机和接收主机的全局收发速率, 在现代网络层次中,网络层的数据流量的功能实际已分配给了数据链路层与传输层
- 拥塞控制
- 差错控制
网络层是基于IP地址进行主机间通信的
传输层
传输层负责主机端口间的信息通信。
由于设备通信进程通常不唯一,因此传输层需要复用与分用的功能。
由于传输层是端口间的信息传输,端口对应进程的对外通信需求,因此传输层是进程内核态的最顶层交互,再向上的封装都是进程用户态的暴露。
会话层
会话层管理的是不同主机进程间的会话,比如会话的建立、维护与终止等功能。
会话层承担着会话同步的功能,支持在连接上有序传输数据并引入检查点机制,用于实现会话恢复与断点续传。
TLS/SSL 协议的握手阶段时实现在会话层的。访问 HTTPS 网站时,客户端和服务器首先要打招呼、交换证书、协商将要使用的密码套件。这个“建立安全会话、维持会话”的过程,属于会话层的功能。
表示层
表示层用于解决设备信息系统异构时信息不一致以及数据的加密、压缩、解密等功能
最经典的场景是在Windows系统和Macos/Linux之间建立SSH时,由于不同系统之间的编码方式/换行符等差异(比如Windows使用GBK编码,Linux/Macos默认使用UTF-8/换行符差异CRLF\r\n与LF\n)
TLS/SSL 在表示层实现数据的加密与解密的过程,对于下层的传输层等层次接收的数据是加密后的数据帧/数据流,而不是规律可读的数据。
应用层
用户与网络的接口
Example
在一个Flask+Nginx的后端通信场景,且单设备含有多网卡的场景中
Flash监听本地回环的127.0.0.1:4000的端口,后端服务体现在应用层的用户后端程序实现中;表示层体现在Flask的底层实现,如pythonjson实现相关的序列化与反序列化/ gzip实现相关的压缩;会话层的功能,比如网络上或者业务上的会话维持,通常是基于Flask底层的依赖完成的,比如WSGI的Werkzeug库用于处理TCP socket请求、flask session 用于实现后端业务面上的加密与与Cookie
传输层中,本地回环和外部端口监听体现了传输层的复用特点。后端的进程可以监听若干个本地回环的端口,不同于MAC,端口并不是设备唯一确定的。
比如Nginx绑定外网端口<ip>:80并外部流量反向代理到后端的127.0.0.1:4000端口。
同时Flask将监听127.0.0.1:4000的流量传入进程中,体现了传输层的分用的特点。
而对于设备的不同的网卡,他们在物理层与数据链路层完全不同,因为他们的通信路径、MAC地址完全不同;在网络层中,不同网卡通常分配不同的IP地址,因此网络层的信息也是独立的;在传输层中,不同网卡的外部流量可能交由同一个进程管理,因此在传输层网卡之间存在相同的部分;在用户态的相关层中,用户可以查看不同的网卡信息,但是Flask等库已经封装了不同网卡等的调用方式,用户只关心进程级的信息交互,此时不同的网卡对用户整体使用是无关的。使用有线上网和无线上网对相同的网站访问没有区别
