Linux网络基础知识

一、网络


1.网络与操作系统的关系

网络获取数据,操作系统则负责加工和处理数据。网络通信离不开网卡、光纤等硬件,操作系统对这些硬件进行管理。


2.网络的发展

  1. 独立模式: 计算机之间相互独立。
  2. 网络互联: 多台计算机连接在一起, 完成数据共享。
  3. 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起。
  4. **广域网WAN:**将远隔千里的计算机都连在一起。

注:局域网和广域网没有明确的分界线


3.网络需解决的主要问题

  1. 如何处理发来的数据?
  2. 长距离传输的数据丢失的问题
  3. 如何定位的主机的问题?
  4. 如何保证数据准确到达下一个设备?

这些问题产生的主要原因是传输距离变长了。

注:收发过程中的所有中间件都要处理同样的问题


二、网络协议


网络协议,是各个计算机的约定的共同标准。计算机之间的传输媒介是光信号和电信号,通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息,想传递各种不同的信息,就需要约定好双方数据格式


1.OSI七层网络模型

七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;该模型把网络从逻辑上分为了7层。每一层都有相关和相对应的物理设备,比如路由器、交换机。OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输。它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通过七个层次化的结构模型使不同的系统、不同的网络之间实现可靠的通讯。


2.TCP/IP五层(或四层)模型

实际工程中进一步总结出TCP/IP五层(或四层)模型:

**物理层:**负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。

**数据链路层:**负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。

**网络层:**负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网络层。

**传输层:**负责两台主机之间的数据传输。如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。

**应用层:**负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

下图展示OSI七层网络模型、TCP/IP四层模型与操作系统的对应关系。


3.协议分层的原因

  • 通过逐层封装,把数据拆解成片段,方便重传丢失的包以及不同厂商的设备对接。
  • 同层协议高内聚,不同层协议低耦合。每一层只干一件事,实现同层高内聚, 层间通过标准化接口交互,实现不同层低耦合。这样, 当其它层协议发生变动时,当前层不受影响,仍能正常通信;此外当前层不关心上下层传入的数据,只对数据做相应处理,从而保证了隔离性与可维护性。

4.操作系统和协议栈的关系

网络通信遵循TCP/IP协议栈,而这个协议栈是内置于操作系统内核中的 。用户要传输数据,不可能直接访问硬件,必须通过应用层与内核之间的套接字(Socket)接口完成 。所有操作系统共用一套网络协议,因此即便有多套操作系统,各个操作系统的通信是通用的。


三、网络通信

对协议和网络有了基本概念后,下面来看看网络是如何通信的。


1.网络通信的流程

用户在应用层传入数据,跨越各个协议层,期间每层都会添加一个新的报头。(注:对于每一层而言除当前报头外的其它信息称为有效载荷,报文=报头+有效载荷)而每一层添加的首部格式 ,是该层协议规则在数据上的直接体现(如源/目的端口、IP地址等)。经过层层封装的数据到达数据链路层后被交付给目标主机(如下图)

接收方接收到数据包后,因同层协议相同,每一层都能够对报头进行解析并将当前报头给去掉再交付给上一层。相当于发送方某层添加的报头被接收方同一层准确无误地接收并解析。

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


2.通信的本质

通信的本质是贯穿协议栈的过程,更具体来讲,通信是不断封包解包的过程,因为发送方执行的是不断封包的流程,接收方执行的是解包+分用的流程。当然前提是通信双方的同层协议必须一致,这样才能确保接收方能正确解析发送方添加的报头信息。


3.各层协议共性(后续学习的指引)

根据通信的基本流程,不难看出协议有以下两种共性:

  1. 几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力。
  2. 几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力。

四、以太网通信方式


1.基本原理

在早期的共享式以太网(如使用集线器或总线型拓扑)中,每台主机在局域网上,都有自己的唯一标识。当某台主机向局域网中传输数据时,当前局域网的其它主机都会收到该数据,并对比数据链路层的报头(该层报头包括发送方的mac地址和接收方的mac地址),如果是自己的mac地址,说明自己正是接收方,否则丢弃。


2.数据碰撞问题

如果任何主机每次发送的数据都会被当前局域网的其它主机接收,必然有大量数据在局域网流通,互相干扰,产生数据碰撞问题。因此任何一台主机在发送数据时要执行碰撞检测和碰撞避免算法,本质就是保证任何时刻只有一个主机在发消息,此时局域网相当于临界资源,因为任何时刻只允许一台主机在局域网中发送数据。


3.安全问题

如果局域网中的任何数据都能被任一主机获取,必然伴随着数据泄露的安全问题,因此在应用层可对数据提前加密,从而解决数据被其它主机抓包的问题。


4.跨网络传输(路由器的介入)

前文提到广域网需要路由器作为中转站协助数据传输,下面介绍具体机制。

当发送方发现目标IP地址不属于当前局域网时,数据包需要经过路由器转发。

  1. 封装 :数据经过网络层 时,添加包含源IP和目标IP的IP首部(目标IP始终不变)。

  2. 发往网关 :数据到达链路层后,封装以太网帧,其中目的MAC地址 写的是**默认网关(路由器)**的MAC地址,从而将数据发送给路由器。

  3. 路由转发 :路由器收到数据帧后,剥离链路层首部 (解封装),读取网络层的目标IP地址,查询自身路由表。

  4. 重新封装 :路由器确定下一跳出口后,重新添加新的链路层首部 。此时,源MAC地址 改为路由器出口端口 的MAC地址,目的MAC地址 改为下一跳设备 的MAC地址(但IP首部中的源IP和目标IP绝对不变)。

  5. 循环:数据包逐跳(Hop-by-Hop)转发,重复上述"解封装+查表+重封装"的过程,直至抵达目标主机所在的局域网,最终由目标主机接收。


为什么路由器需要适配两层协议?

路由器工作在网络层,但它的数据链路层 需要支持多种不同的底层网络协议,比如图中两主机分别使用以太网驱动程序和令牌环驱动程序,但由于网络层包装的IP地址不变,所以只要路由器知道如何剥离以太网驱动程序首部和包装令牌环驱动程序首部,仍能将数据准确传输到指定的主机上。从而解决了底层网络的差异化问题。这一机制也体现了协议分层的核心优势:网络层(IP)不关心下层是哪种局域网技术,数据链路层也不关心上层是TCP还是UDP。


如何理解mac地址在局域网具有唯一性,而IP地址在全网络具有唯一性

在数据链路层是从主机到主机,经过路由器封包后变成主机到路由器,路由器生成新的mac地址所以mac地址在局域网唯一,可通过mac地址在局域网中准确找到目标。而IP始终不变,代表数据传输的宏观方向(从哪台主机到哪台主机),因此IP地址在全网络具有唯一性。

相关推荐
律宏阔3 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔3 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴3 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千4 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei374 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei374 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei374 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW4 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲4 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js
GeW4 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux