操作系统将对进程在内存空间上的分配分为用户态和内核态。内核态的执行权限高于用户态。
不同主机上的进程与进程之间的通信主要是想传输用户态的数据。
主机1上的进程A要先经过【用户态 -> 内核态】的数据复制,内核态再将此数据交由网卡实现【数字信号 -> 物理信号】的转换,由光纤等物理传输介质负责传输物理信号,到达主机2的网卡,再由主机2的网卡实现【物理信号 -> 数字信号】的转换,将数据向上交给内核态,最终由内核态将数据返回给用户态。
当数据到达时,会产生一个中断信号,让CPU中断当前正在执行的任务,而去执行一段提前准备好的代码(中断处理程序),将数据从网卡复制到内核态的内存区中。
由于用户态的权限不够,不足以完成某些任务时,需切换至内核态。以下是 【用户态 -> 内核态】 的三种方式:
采用集线器连接的以太网,网络逻辑拓扑结构为总线型为主,星型为辅。
OSI 七层网络协议。TCP/IP 五层网络协议。前者较后者多了表示层和会话层。
集线器工作在物理层,主要解决数据在物理网络介质中传输的问题。
由于多个主机共用一个信道,而信道一次只能传输有限的信号,故当过多主机都想占用信道传输信号时,超出信道的容量范围,则会导致冲突。发生冲突的主机之间就形成一个冲突域。
物理层的集线器组网天然导致的冲突域问题,需要由数据链路层来解决。
数据链路层常用的一种冲突避免算法:发生冲突后,静默随机时间,等待再次发送。
冲突避免算法虽然能避免冲突的发送,保证同一个冲突域内的主机都可以进行数据传输,但若主机太多,会降低信号的传输效率。
==> 1. 冲突域内的主机不要太多 2. 尽可能减少冲突域的出现。
交换机工作在数据链路层,主要解决了局域网LAN内主机与主机的通信问题。
物理层的集线器是傻瓜,只进行数据的复制和信号的放大 ,并不能解析数据(不知道数据长啥样),也不负责数据发生的方向和目标地址。而数据链路层的交换机能够解析数据链路层协议,根据数据指定的目标地址进行发送,只发送给目标主机。
通过集线器组建的局域网天然存在冲突域问题,而通过交换机组建的局域网可以划分冲突域,划分同一冲突域内的不同主机。
实际中常见的局域网组建结构:交换机+集线器
单播的目标地址是一台主机。
广播的目标地址是一个特殊地址。广播地址:FF-FF-FF-FF-FF-FF。
在一个广播域中,一个主机向外发送的数据,会被此广播域内的其他所有主机接收到。发送的目标地址为特殊的广播地址,并不指定发送到哪个主机。
数据链路层的地址指的是MAC地址(物理地址)。
MAC地址是在网卡被生产时就被写死的,不会发生重复冲突。
MAC地址的长度为48位(6字节),通常表示为12个4位16进制数。
路由器工作在网络层,主要解决跨局域网LAN的主机与主机间的通信问题。
路由器横跨在多个局域网LAN之间,对于每个局域网来说,都像是属于当前局域网内部的。
路由(route)即负责寻路工作,遵循网络层的协议,在能够送达数据的多条路线中找到最合适的一条,将数据从当前LAN的一台主机传送到另一LAN的另一主机上。
网络层的地址指的是IP地址。IP地址属于软件地址。
IP地址是随时变化的,并不是写死固定不变的。同一个网络内部的IP地址不应该重复。
IP地址的长度为32位(4字节),通常表示为4个8位二进制数。
本机:127.0.0.1 (对应域名localhost)
长期目标:路由器传输数据的整条路线的起点和终点。(固定不变)
短期目标:路由器传输数据的近期要到达的目的地。即下一步要走的一段路。(动态计算)
数据通过路由器在不同的LAN之间进行传输时,路由器能够解析网络协议,看得懂长期目标,而根据当前传输的进度动态计算短期目标。
主要解决进程与进程间的通信。
端口号的范围:0~65535,两个字节的无符号数。
一个端口号标识一个进程。而一个进程可以对外与多个端口(进程)进行通信。
主要处理业务逻辑。对应内存空间的用户态。
发送方进程将数据从应用层开始往下逐层进行封装(添加首部),传递到物理层将数字信号转为物理信号后,在物理传输介质中进行传播到接收方主机,由接收方从物理层开始向上进行解包(去除首部),并根据具体的控制信息进行分用处理,选择每层使用的协议。
首部信息主要包括:(控制信息)源地址、目标地址、分用信息等。
传输层:源端口、目标端口、…
网络层:源IP地址、目标IP地址、…
数据链路层:源MAC地址、目标MAC地址、…
通过封装+解包实现的数据传输,对于每层来说都好像是单独通信交流的,传输数据时不同的层次之间感受不到彼此的存在。