Linux网络编程【宏观理解网络通信】

发布于:2025-08-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

1. 局域网[以太网]通信原理

局域网有各种各样的通信标准,比如以太网,令牌环网,无线LAN。我们具体理解以太网的通信原理之后,后面两种一说就懂了!

1.1 MAC地址

首先,两台主机之间需要通信就必须有一个唯一的标识符,这样主机之间才能相互识别。所以,每台主机都有一个MAC地址来唯一标识它。MAC地址在出厂时就写入硬盘网卡当中,不能被修改

MAC地址长度为 48 比特位,即 6 个字节,一般用16进制数字加上冒号的形式来表示(例如08:00:27:03:fb:19)。

1.2 主机之间通信流程

主机A给主机B发送的报文在以太网中传输时,其他的在同一个局部网的主机都可以看到这个报文。但是,它们会识别这个报文是否是发给自己的,通过比较MAC地址即可。如果不是发给自己的,那么这个主机就对此报文不做处理,也就是丢弃。如果识别到是发给自己的,那么就做受理。

在以太网中,任何时刻,只允许⼀台机器向以太网中发送数据,如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞。数据可能就无法发送到目标主机。为了解决这个问题,所有发送数据的主机要进行碰撞检测和碰撞避免。一旦发生数据碰撞,当前主机就会进入休眠状态。weak之后重新发送信息。从操作系统的角度来看,以太网就是一个临界区,多台主机之间相互竞争网络资源。而在以太网中,任何时刻,只允许⼀台机器向以太网中发送数据就是在维护以太网的互斥属性!只不过维护这个互斥属性并不是加锁,主机之间不管三七二十一先干一架抢夺网络资源。发生数据碰撞后,再通过碰撞检测和碰撞避免算法确保只有一个主机发送数据。

1.3 系统内部信息的流通

初步明白了局域网通信原理,再来看同⼀个网络内的两台主机进行发送消息的过程。

主机之间通信本质是两个协议栈在通信,而数据发送的原始动力大部分情况下都是人为的!

并且网络协议栈每一层之间都有协议,协议的本质就是结构化的数据类型。所以,我们在进行上述传输流程的时候,就要进行封装和解包。

下面我们明确⼀下概念 :

• 报头部分,就是对应协议层的结构体字段,我们⼀般叫做报头

• 除了报头,剩下的叫做有效载荷

• 故,报文=报头+有效载荷

然后,我们在明确一下不同层的完整报文的叫法

• 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做(frame).

• 应用层数据通过协议栈发到网络上时,每层协议都要加上⼀个数据首部(header),称为封装 (Encapsulation).下图为封装过程:

• 首部信息中包含了⼀些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息.

• 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的"上层 协议字段"将数据交给对应的上层协议处理。我们把这个过程叫做分用。下图为分用过程:

1.4 总结一下

在网络传输的过程当中,数据不是直接发送给对方主机的。而是先要自定向下将数据封装为数据帧后交付给底层协议,然后由底层发送数据帧给目标主机。目标主机接收到数据帧后自底向上不断解包和分用,最终将数据交付给最上层

在上述过程当中,封装就像将每一层的报头入栈,而解包和分用就像将每一层的报头出栈,并且每一层都有对应的协议。所以,我们又把这种层状的网络结构成为协议栈!!

因此,要深刻认识协议。我们要提出两个问题,协议是如何做到解包的??是如何将有效载荷交付给上层的??我们以后慢慢理解~~

2. 跨网络传输流程

2.1 认识IP地址

IP 协议有两个版本,IPv4 和 IPv6 .接下来凡是提到IP协议,没有特殊说明的,默认都是 指 IPv4

• IP 地址是在 IP 协议中,用来标识网络中不同主机的地址;

• 对于 IPv4 来说,IP 地址是⼀个 4 字节,32 位的整数;

• 我们通常也使用"点分十进制"的字符串表示IP 地址,例如192.168.0.1 用点分割的每⼀个 数字表示⼀个字节,范围是0 - 255 ;

其实,IP地址也是用来表示在全球范围内主机的唯一性(公网IP)。但是我们之前说MAC地址也是如此,那他们之间有什么联系和区别呢??

简单来说,当一台主机向另一台主机发送数据时(不是局域网),我们把目标地址称为目标IP,把我们的主机地址叫做源IP。由于跨网络传输时并不是直接从一台主机到另一台主机的,需要经过路由器,路由器需要我们的目标IP作为参考来决定数据在传输时的下一站目标,我们把下一站的地址叫做目标MAC地址。形象一点说的话,对于一台主机,IP地址就是他的长远目标,MAC地址就是它为了实现自己的长远目标定制的短期目标

2.2 跨网络传输宏观流程

在每个子网下的主机IP地址都有相似性,当主机A发送数据时发现该数据并不是发送给自己局域网的主机,那么主机A就会把报文发给路由器【路由器也是主机】。路由器通过不同网卡的驱动先来来解包回和分用主机A发过来的报文,然后再封装报文从数据链路层发给主机B。

在整个跨网络传输的过程中,IP地址一直是不变的,而MAC地址是一直变化的,从网络层以上我们看到的IP地址都是一样的!!所以IP网络层存在的意义就是提供网络虚拟层,让世界上所有的网络都是IP网络,从而屏蔽最底层网络的差异

 下图是数据跨网络传输的宏观流程,其中诸多细节慢慢来说~~