【网络】计算机网络世界的基础概念

文章目录

一、网络的发展背景

计算机网络的诞生源于人们"协作"的需求。

  • 计算机刚诞生时,计算机之间相互独立。
  • 之后产生了通过交换机和路由器连接在一起的局域网。
  • 之后,我们可以由无数路由器连接到全世界,这就是广域网。

根据覆盖范围,网络主要分为两类:

类型 局域网(LAN) 广域网(WAN)
范围 小(一间办公室、一栋楼) 大(城市、国家、全球)
例子 家庭Wi-Fi、公司内网 互联网、银行跨省专网
特点 高速、低延迟、自己可控 租用线路或通过运营商互联
传输技术 以太网、Wi-Fi 光纤、卫星链路

所谓局域网和广域网,只是一个相对的概念。比如我们有墙,整个国内也可以看做一个局域网。

简而言之,网络发展经历了单机处理 → 局域网共享 → 广域网互联 → 全球互联网的演进。

而本质规律是:计算机是人的工具,只要人需要协作工作,注定了网络的产生与发展是必然的!

二、初识协议

就像两个人打电话需要约定说同一种语言,计算机之间只能传输01,想要用01表示出不同的数据信息,计算机之间通信必须遵守协议 ------ 一套约定好的规则(数据格式、顺序、错误处理等)。

协议,是一种约定!

但是,新事物的诞生势必会产生更多的问题。两台机器通过网络进行通信,有以下四种问题:

  • 问题1:如何进行数据传递
  • 问题2:如何定位目标主机和选择路径
  • 问题3:如果数据丢失怎么办
  • 问题4:如何处理数据

为了解决这些问题,人们采用了分层思想,分层可以实现解耦合,每层专门处理一个问题,降低复杂度。

  • 每一层负责一部分功能

  • 层与层之间有接口

  • 对上层隐藏下层实现细节

这就好比打电话:分为用户层和电话层。"用户层协议"需要约定好我们都说汉语,"电话层协议"约定好电话机之间如何收发数据,而两层之间只需要解决,用户怎么给电话数据,电话怎么给用户数据。除此之外层之间不关心实现细节。

当然,实际的网络通信协议模型,会有更多的层。

三、OSI七层模型与TCP/IP五层模型

国际标准化组织(ISO)提出的OSI(Open System Interconnection)七层网络模型,它把网络从逻辑上化为了七层,它是一种框架性的设计方法,概念清楚,理论完整。

层号 名称 功能概览 相关技术
7 应用层 为用户提供网络服务 HTTP、FTP、SMTP
6 表示层 数据格式转换、加密、压缩 JPEG、ASCII
5 会话层 建立终止通信链接、管理以下分层 RPC、NetBIOS
4 传输层 端到端可靠传输、流量控制 TCP、UDP
3 网络层 路由选择、跨网络寻址 IP、路由器
2 数据链路层 相邻节点间的帧传输、差错控制 以太网、MAC、交换机
1 物理层 比特流在物理介质上的传输 网线、光纤、电压信号

但是,OSI模型复杂且偏理论,实际互联网用的是更简洁的TCP/IP模型!

TCP/IP模型是互联网的事实标准,通常描述为4层(不包括物理层)或5层。按5层版本来讲:

层号 名称 主要协议/设备 主要功能
5 应用层 HTTP、DNS、SSH 负责应用程序间的沟通
4 传输层 TCP、UDP 负责两台主机之间的数据传输
3 网络层 IP、ICMP、路由器 负责地址管理和路由选择
2 数据链路层 以太网、MAC、交换机 负责设备之间的数据帧的传送和识别、冲突检测、数据校验等
1 物理层 网线、光纤、集线器 负责光电信号的传递

物理层是硬件的东西,我们只考虑与软件相关的前四层,因此有时候我们也称为TCP/IP四层模型。

回到上面提出的四个问题,可以发现,每一层就可以专门解决一个问题了:

  • 问题1:如何进行数据传递。数据链路层解决
  • 问题2:如何定位目标主机和选择路径。网络层解决
  • 问题3:如果数据丢失怎么办。传输层解决
  • 问题4:如何处理数据。应用层解决

四、TCP/IP协议与数据封装、解包、分用

TCP/IP协议其实是TCP/IP模型中所有协议的统称。由于其中TCP协议和IP协议最为著名,所以我们整体称为TCP/IP协议栈。

TCP/IP协议的本质是一种解决方案,它能分层,前提是因为问题本身能分层。

数据链路层在驱动程序中实现,网络层和传输层集成在OS内核中,应用层就在OS上层由用户实现。

TCP协议是传输层最著名的协议,IP协议是网络层最著名的协议。而这两层必须实现在OS内核中。无论OS怎么不同,这部分大家必须一样,才能进行通信,这就是为什么安装不同OS的主机也能相互通信的原因。

在网络传输的过程中,数据不是直接发送给对方主机的,而是要自顶向下将数据交给下层协议,层层封装,最后由最底层物理层来发送;对方的物理层接收到,再自底向上层层交付:这个过程是封装与解包!

  • 既然协议是程序中、OS内核中实现的,不难想到,协议一定就是代码。所谓协议,就是通信双方都认识的结构体类型! 两方用同样的自定义数据类型,就都能够识别对方发来的数据,这就是约定!具体一种协议的结构体变量,称为报头!
  • 数据中,除了报头,剩下的部分叫做有效载荷。报头中会记录报头有多大、有效载荷有多大、上层协议是什么等信息。
  • 报头 + 有效载荷 = 报文
  • 不同协议层对于报文有不同的叫法:
报文名称
应用层 请求与应答
传输层 数据段
网络层 数据报
数据链路层 数据帧
  • 对于发数据端,封装的本质,是在上一层提供的报文的头部,拷贝添加当前层的协议层的结构体变量。
  • 对于收数据端,它的每一层必须解决两个问题,这也是我们之后学习每种协议必须知道的:怎么分离当前层的报头和有效载荷(怎么解包)?自己的有效载荷向上交付给哪一个协议(怎么分用)? 分用概念如下图:

在这种结构中,可以认为封装和解包的过程,类似栈的入栈与出栈。这就是为什么称为TCP/IP协议栈

五、网络传输基本流程

1. 局域网传输流程 -- 认识MAC地址

局域网(Local Area Network,LAN)是指在相对较小的物理范围内,连接多台计算机、打印机、服务器及其他设备的计算机网络。局域网有很多种,如以太网、令牌环网、WLAN等。下面用以太网为例。

两台机器在同一个局域网内,是能够直接通信的。
每台机器在局域网中,需要有一个唯一的标识来保证自己的唯一性,这就是MAC地址!
MAC地址用来识别数据链路层中相连的结点,它是硬件固定的,一张网卡生产出来就会固定一个MAC地址。

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

在我的Windows电脑上,输入ipconfig /all命令,可以查到我的电脑的MAC地址:

假设机器 A(MAC 地址为 AA)与同一以太网中的机器 B(MAC 地址为 BB)通信。
机器 A 发送的数据帧报文中,报头一定会包含源 MAC 地址和目的 MAC 地址,以此标识数据的发送方与接收方。 在本次通信中,源 MAC 地址为 AA,目的 MAC 地址为 BB。

报文被发送到以太网后,所有接入该网络的设备都能收到这份报文。例如,MAC 地址为 CC 的机器 C 也会收到该报文,但它在解析报头时发现目的 MAC 地址并非自身,便会直接丢弃该数据,不会做进一步处理。只有机器 B 在确认目的 MAC 地址与自身匹配后,才会接收并处理这份数据。

在传统以太网中,同一时刻只允许一台设备向网络发送数据。如果多台设备同时发送数据,就会发生数据碰撞,导致通信失败。
因此,所有发送数据的设备都需要具备碰撞检测能力,并执行相应的碰撞避免算法。局域网通信,本质上就是一个依赖碰撞检测与避免机制、不断尝试重传的过程,而这一整套逻辑,都在数据链路层完成。
没有交换机的情况下,一个以太网就是一个碰撞域。

从系统层面理解,以太网是一种共享资源,必须维护任意时刻只有一个主机使用,这是原子性的体现!

2. 跨网络传输流程 -- 认识IP地址

IP协议有两个版本:IPv4和IPv6。我们的学习以IPv4为默认。

  • IP地址是指在IP协议中,用来标识公网中唯一一台主机的地址。
  • 对于IPv4,IP地址是一个4字节,32位的整数。我们通常也使用"点分十进制"的字符串表示IP地址。例如191.152.0.1,点分割的每一个数字表示一个字节,范围是0~255。
  • 对于IPv6,IP地址是一个16字节,128位的整数,原理类似。

在跨网络的数据传输中,数据从一台计算机发送到另一台计算机,往往需要经过多个路由器的转发。假设主机 A 要向主机 B 发送数据,整个过程有两个关键特点:

  • IP 地址全程不变:数据包从 A 到 B,无论经过多少个路由器、跨越多少个网络,数据包头部的源 IP 地址(主机 A 的 IP)和目标 IP 地址(主机 B 的 IP)始终保持不变。
  • MAC 地址每跳更新:在局域网传输中,数据包每经过一个 "跳点"(例如从电脑到家庭路由器、再到运营商机房等),源 MAC 地址和目标 MAC 地址都会被路由器改写为当前链路的起点和终点地址。

IP 协议属于网络层协议。在每一段链路中,数据包都需要在路由器中解包到网络层,路由器会根据目标 IP 地址判断下一跳转发路径。 因此:

  • IP 地址解决的是主机定位和路径选择问题,它提供的是端到端的 "长远目标";
  • MAC 地址解决的是局域网内的转发问题,它对应的是单段链路的 "当前目标"。

为什么要有IP协议这一层呢?之前不是说MAC地址也能标识主机的唯一性吗?

这是因为,在计算机网络发展中,全球各地区都是先有了自己的局域网,制定了各自的实现方式规则。随

着跨局域网传输的需求产生,必须统一各类局域网通信,最佳的方式就是添加一层网络层:统一网络层报文,不同的局域网中,大家都能看到同样的IP网络!

IP网络层存在的意义是:提供了网络虚拟层,让世界的所有网络都是IP网络,屏蔽了最底层局域网的差异!

六、端口号和套接字

网络通信,并不是只是两台主机在通信,而根本是在两个主机上的两个进程在通信!

一台主机从网络中获取到数据包,不是最终目的。最终目的是主机应用层中的某个进程需要这份数据,可是一台机器上同时会有许多进程,数据报文要如何交付给对应的进程呢?

端口号(port)是传输层协议的内容。它是一个2字节16位的整数,用来标识当前主机中的一个进程,告诉OS当前数据要交给哪个进程处理。在同一传输层协议,一个端口号只能被一个进程绑定。

端口号的数据范围划分:

  • 0~1023:称为知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,它们的端口号都是固定的。
  • 1024~65535:OS动态分配的端口号,客户端程序的端口号在这个范围内由OS分配。

进程id和端口号都标识进程的唯一性,但是用处不同,进程id用于系统进程管理,端口号用户网络通信。如果网络通信也使用进程id,会使系统进程管理和网络强耦合。
另外,一个进程可以绑定多个端口号。

IP地址标识网络中一台主机的唯一性,端口号标识一台主机中的一个进程的唯一性。因此,IP地址+端口号,能够标识整个网络世界中的唯一的进程!我们把【ip + port】叫做套接字(socket)!

使用操作系统提供的Socket接口,编写代码实现网络通信的过程,就叫Socket编程,它是所有网络程序的底层基础。

那么,数据包解包到传输层后,又该如何交给应用层具体进程?

  • 首先,传输层协议的报头中,一定会记录 "协议种类"、"源端口号"、"目的端口号"
  • OS内核里存在一张表,记录每个已被绑定的端口号属于哪个进程
  • 查这张表,找到数据段报头中"目的端口号"属于哪个进程
  • Linux中一切皆文件,内核把收到的数据放进该进程对应的Socket接收缓冲区(文件)。进程可以通过read等函数,像读普通文件一样,得到数据!
    反之,源进程发送数据时,只要通过write等函数写入他的Socket写入缓冲区(文件)即可。

本篇完,感谢阅读。

相关推荐
小挪号底迪滴7 小时前
浅析 AI 实时语音流转译背后的技术架构:从 WebSocket 到流式 LLM
人工智能·websocket·架构
时空自由民.7 小时前
蓝牙GAP/GATT协议和计算机网络TCP/UDP通信对比
tcp/ip·计算机网络·udp
AI木马人7 小时前
8.人工智能实战:大模型服务“看起来正常却突然变慢”?Prometheus + Grafana + GPU 指标构建全链路监控体系
人工智能·grafana·prometheus
梦想画家7 小时前
RAG应用基石:从六种文档切分算法看语义完整性
人工智能·算法·rag
Touch_Base7 小时前
护照、身份证与罚单:动力电池出海的隐性门槛
大数据·人工智能·创业创新·esg·可持续
ACP广源盛139246256737 小时前
ASW3742@ACP# 产品规格详解
网络·人工智能·嵌入式硬件·计算机外设·电脑
TBrL7UtdTELTTdut4BAL7 小时前
F7015TV3 光猫 Telnet 命令配置 DHCP 服务器
运维·服务器·网络
llilian_167 小时前
晶体频率测试仪 破解晶振品控核心难题:晶体频率网络测试仪深度解析 晶体网络分析仪
网络·功能测试·单片机·嵌入式硬件·测试工具·51单片机
迦南的迦 亚索的索7 小时前
AI_09_Coze_多模态和循环结构
人工智能