当前位置: 首页 > ds >正文

【网络】网络基础概念

前言

本篇博客开始进入新篇章——网络,让我们先从网络基础概念相关知识开始吧

💓 个人主页:zkf

⏩ 文章专栏:网络

若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

目录

1.网络基础概念

2.初识协议

协议分层

OSI七层模型

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

3.⽹络传输基本流程

4.跨⽹络传输流程图

5.Socket编程预备

5.1理解源IP地址和⽬的IP地址

5.2认识端口号

6.传输层的典型代表

7.网络字节序

8.socket编程接⼝


1.网络基础概念

⽹络发展:独⽴模式: 计算机之间相互独⽴;
⽹络互联: 多台计算机连接在⼀起, 完成数据共享;
⼴域⽹WAN: 将远隔千⾥的计算机都连在⼀起;

所谓 "局域⽹" 和 "⼴域⽹" 只是⼀个相对的概念. ⽐如, 我们有 "天朝特⾊" 的⼴域⽹, 也可以看做⼀个⽐较⼤的局域⽹.
计算机是⼈的⼯具,⼈要协同⼯作,注定了⽹络的产⽣是必然的

2.初识协议

"协议" 是⼀种约定.
打电话约定电话铃响的次数的约定
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表⽰ 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双⽅的数据格式.
思考: 只要通信的两台主机, 约定好协议就可以了么?
定好协议,但是你⽤频率表⽰01,我⽤强弱表⽰01,就好⽐我⽤中国话,你⽤葡萄⽛语⼀样,虽
然⼤家可能遵守的⼀套通信规则,但是语⾔不同,即是订好了基本的协议,也是⽆法正常通信的
所以,完善的协议,需要更多更细致的规定,并让参与的⼈都要遵守。
计算机⽣产⼚商有很多;
计算机操作系统, 也有很多;
计算机⽹络硬件设备, 还是有很多;
如何让这些不同⼚商之间⽣产的计算机能够相互顺畅的通信? 就需要有⼈站出来, 约定⼀个共同的
标准, ⼤家都来遵守, 这就是 ⽹络协议;
⼀般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公
司,下⾯是⽂⼼⼀⾔⽣成的标准制定组织,⼤家看⼀下就可以
问:能定制协议标准的组织或者公司
答:能定制协议标准的组织或公司主要有以下⼏类:
1. 国际标准化组织:
IEEE(电⽓和电⼦⼯程师协会):这是⼀个由计算机和⼯程领域专家组成的庞⼤技术组织,在
通信协议领域贡献突出。IEEE制定了全世界电⼦、电⽓和计算机科学领域30%左右的标准,包
括IEEE 802系列标准,这些标准涵盖了从局域⽹(LAN)到⼴域⽹(WAN)等多种⽹络技术。
ISO(国际标准化组织):ISO是由多个国家的标准化团体组成的国际组织,它在开放系统互连
(OSI)模型⽅⾯的⼯作尤为著名。OSI模型定义了⽹络通信的七层协议结构,尽管在实际应⽤
中,TCP/IP协议族更为普遍,但OSI模型仍然在学术和理论研究中占有重要地位。
ITU(国际电信联盟):ITU是联合国下属的专⻔机构,负责制定电信领域的国际标准。ITU-T
制定的标准涵盖了电话和⽹络通信,与ISO合作确保了通信技术的全球兼容性和互操作性。
2. 区域标准化组织:
ETSI(欧洲电信标准学会):由欧洲共同体各国政府资助,是⼀个由电信⾏业的⼚商与研究机
构参加并从事研究开发到标准制定的组织。
ASTAP(亚洲与泛太平洋电信标准化协会):1998年由⽇本与韩国发起成⽴的标准化组织,旨
在加强亚洲与太平洋地区各国信息通信基础设施及其相互连接的标准化⼯作的协作。
3. 公司:
某些公司,如泰凌微,也⾃研各种标准的软件协议栈,包括低功耗蓝⽛、zigbee、thread及
Matter等,并可进⾏定制化改动,这是其核⼼竞争⼒之⼀。泰凌微还计划重点发展智能电⼦价
签、智能遥控、智能家居等市场。
4. ⺠间国际团体:
IETF(互联⽹⼯程师任务组):这是⼀个负责开发和推⼴互联⽹协议(特别是构成TCP/IP协议
族的协议)的志愿组织,通过RFC发布新的或者取代⽼的协议标准。
5. 官⽅机构:
FCC(联邦通信委员会):美国对通信技术的管理的官⽅机构,主要职责是通过对⽆线电、电
视和有线通信的管理来保护公众利益。也对包括标准化在内的通信产品技术特性进⾏审查和监
督。
以上这些组织或公司都能在⼀定程度上定制协议标准,以满⾜特定需求或推动技术发展。

协议分层

协议本质也是软件,在设计上为了更好的进⾏模块化,解耦合,也是被设计成为层状结构的
软件分层的好处
在这个例⼦中, 我们的"协议"只有两层:语⾔层、通信设备层。
但是实际的⽹络通信协议,设计的会更加复杂, 需要分更多的层
但是通过上⾯的简单例⼦,我们是能理解,分层可以实现解耦合,让软件维护的成本更低

OSI七层模型

OSI(Open System Interconnection,开放系统互连)七层⽹络模型称为开放式系统互联参考
模型,是⼀个逻辑上的定义和规范;
把⽹络从逻辑上分为了7层. 每⼀层都有相关、相对应的物理设备,⽐如路由器,交换机;
OSI 七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传
输;
它的最⼤优点是将服务、接⼝和协议这三个概念明确地区分开来,概念清楚,理论也⽐较完整.
通过七个层次化的结构模型使不同的系统不同的⽹络之间实现可靠的通讯;
但是, 它既复杂⼜不实⽤; 所以我们按照TCP/IP四层模型来说明.

其实在⽹络⻆度,OSI定的协议7层模型其实⾮常完善,但是在实际操作的过程中,会话层、表⽰层是不可能接⼊到操作系统中的,所以在⼯程实践中,最终落地的是5层协议。

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

TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求
物理层: 负责光/电信号的传递⽅式. ⽐如现在以太⽹通⽤的⽹线(双绞 线)、早期以太⽹采⽤的的同
轴电缆(现在主要⽤于有线电视)、光纤, 现在的wifi⽆线⽹使⽤电磁波等都属于物理层的概念。物
理层的能⼒决定了最⼤传输速率、传输距离、抗⼲扰性等. 集线器(Hub)⼯作在物理层.
数据链路层: 负责设备之间的数据帧的传送和识别. 例如⽹卡设备的驱动、帧同步(就是说从⽹线上
检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就⾃动重发)、数据差错校验等⼯
作. 有以太⽹、令牌环⽹, ⽆线LAN等标准. 交换机(Switch)⼯作在数据链路层.
⽹络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识⼀台主机, 并通过路由表的
⽅式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)⼯作在⽹路层.
传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送
到⽬标主机.
应⽤层: 负责应⽤程序间沟通,如简单电⼦邮件传输(SMTP)、⽂件传输协议(FTP)、⽹络远
程访问协议(Telnet)等. 我们的⽹络编程主要就是针对应⽤层.

物理层我们考虑的⽐较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为 TCP/IP四层模型.
⼀般⽽⾔
对于⼀台主机, 它的操作系统内核实现了从传输层到物理层的内容;
对于⼀台路由器, 它实现了从⽹络层到物理层;
对于⼀台交换机, 它实现了从数据链路层到物理层;
对于集线器, 它只实现了物理层;
但是并不绝对. 很多交换机也实现了⽹络层的转发; 很多路由器也实现了部分传输层的内容(⽐如端⼝转发);
再识协议
上⾯的内容,我们只是懂了⼀些基本概念,还是达不到我们的⽬标,下⾯我们再次重新理解协议和协议分层。
为什么要有TCP/IP协议?
⾸先,即便是单机,你的计算机内部,其实都是存在协议的,⽐如:其他设备和内存通信,会有内
存协议。其他设备和磁盘通信,会有磁盘相关的协议,⽐如:SATA,IDE,SCSI等。只不过我们感知不到罢了。⽽且这些协议都在本地主机各⾃的硬件中,通信的成本、问题⽐较少。
其次,⽹络通信最⼤的特点就是主机之间变远了。任何通信特征的变化,⼀定会带来新的问题,有
问题就得解决问题,所以需要新的协议咯
所以,为什么要有TCP/IP协议?本质就是通信主机距离变远了
什么是TCP/IP协议?
TCP/IP协议的本质是⼀种解决⽅案
TCP/IP协议能分层,前提是因为问题们本⾝能分层
TCP/IP协议与操作系统的关系(宏观上,怎么实现的)
所以究竟什么是协议?
截⽌到⽬前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。
OS源代码⼀般都是⽤C/C++语⾔写的。

?问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗?
回答:答案是肯定的!因为双⽅都有同样的结构体类型struct protocol。也就是说,⽤同样
的代码实现协议,⽤同样的⾃定义数据类型,天然就具有”共识“,能够识别对⽅发来的数
据,这不就是约定吗?
关于协议的朴素理解:所谓协议,就是通信双⽅都认识的结构化的数据类型
因为协议栈是分层的,所以,每层都有双⽅都有协议,同层之间,互相可以认识对⽅的协
议。

3.⽹络传输基本流程

局域⽹⽹络传输流程图
局域⽹(以太⽹为例)通信原理
⾸先回答,两台主机在同⼀个局域⽹,是否能够直接通信?
每台主机在局域⽹上,要有唯⼀的标识来保证主机的唯⼀性:mac地址
认识MAC地址
MAC地址⽤来识别数据链路层中相连的节点;
⻓度为 48 ⽐特位, 即 6 个字节. ⼀般⽤ 16 进制数字加上冒号的形式来表⽰(例如:
08:00:27:03:fb:19)
在⽹卡出⼚时就确定了, 不能修改. mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地
址, 可能会冲突; 也有些⽹卡⽀持⽤⼾配置mac地址).
以太⽹中,任何时刻,只允许⼀台机器向⽹络中发送数据
如果有多台同时发送,会发⽣数据⼲扰,我们称之为数据碰撞
所有发送数据的主机要进⾏碰撞检测和碰撞避免
没有交换机的情况下,⼀个以太⽹就是⼀个碰撞域
局域⽹通信的过程中,主机对收到的报⽂确认是否是发给⾃⼰的,是通过⽬标mac地址判定
这⾥可以试着从系统⻆度来理解局域⽹通信原理
初步明⽩了局域⽹通信原理,再来看同⼀个⽹段内的两台主机进⾏发送消息的过程

⽽其中每层都有协议,所以当我进⾏进⾏上述传输流程的时候,要进⾏封装和解包

下⾯我们明确⼀下概念
报头部分,就是对应协议层的结构体字段,我们⼀般叫做报头
除了报头,剩下的叫做有效载荷
故,报⽂ = 报头 + 有效载荷
然后,我们在明确⼀下不同层的完整报⽂的叫法
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在⽹络层叫做数据报
(datagram),在链路层叫做帧(frame).
应⽤层数据通过协议栈发到⽹络上时,每层协议都要加上⼀个数据⾸部(header),称为封装
(Encapsulation).
⾸部信息中包含了⼀些类似于⾸部有多⻓, 载荷(payload)有多⻓, 上层协议是什么等信息.
数据封装成帧后发到传输介质上,到达⽬的主机后每层协议再剥掉相应的⾸部, 根据⾸部中的 "上层
协议字段" 将数据交给对应的上层协议处理.

在⽹络传输的过程中,数据不是直接发送给对⽅主机的,⽽是先要⾃定向下将数据交付给下层协议, 最后由底层发送,然后由对⽅主机的底层来进⾏接受,在⾃底向上进⾏向上交付,下⾯是⼀张⽰意图。

下图为数据分⽤的过程

4.跨⽹络传输流程图

⽹络中的地址管理 - 认识IP地址
IP 协议有两个版本, IPv4 IPv6 . 凡是提到IP协议, 没有特殊说明的, 默认都是
IPv4
IP 地址是在 IP 协议中, ⽤来标识⽹络中不同主机的地址;
对于 IPv4 来说, IP 地址是⼀个 4 字节, 32 位的整数;
我们通常也使⽤ "点分⼗进制" 的字符串表⽰ IP 地址, 例如 192.168.0.1 ; ⽤点分割的每⼀个
数字表⽰⼀个字节, 范围是 0 - 255 ;
跨⽹段的主机的数据传输. 数据从⼀台计算机到另⼀台计算机传输过程中要经过⼀个或多个路由器.
下⾯是⼀张⽰意图

⾸先理解⼀下IP地址的意义
为什么要去⽬标主机,先要⾛路由器?
⽬的IP的意义
然后结合封装与解包,体现路由器解包和重新封装的特点
对⽐IP地址和Mac地址的区别
IP地址在整个路由过程中,⼀直不变
Mac地址⼀直在变
⽬的IP是⼀种⻓远⽬标,Mac是下⼀阶段⽬标,⽬的IP是路径选择的重要依据,mac地址是局域⽹
转发的重要依据
IP⽹络层存在的意义:提供⽹络虚拟层,让世界的所有⽹络都是 IP ⽹络,屏蔽最底层⽹络的差异

5.Socket编程预备

5.1理解源IP地址和⽬的IP地址

IP 在⽹络中,⽤来标识主机的唯⼀性
但是这⾥要思考⼀个问题:数据传输到主机是⽬的吗?不是的。因为数据是给⼈⽤的。⽐如:聊天是⼈在聊天,下载是⼈在下载,浏览⽹⻚是⼈在浏览?
但是⼈是怎么看到聊天信息的呢?怎么执⾏下载任务呢?怎么浏览⽹⻚信息呢?通过启动的 qq,迅雷,浏览器。
⽽启动的 qq,迅雷,浏览器都是进程。换句话说,进程是⼈在系统中的代表,只要把数据给进程,⼈就相当于就拿到了数据。
所以:数据传输到主机不是⽬的,⽽是⼿段。到达主机内部,在交给主机内的进程,才是⽬的。
但是系统中,同时会存在⾮常多的进程,当数据到达⽬标主机之后,怎么转发给⽬标进程?这就要在⽹络的背景下,在系统中,标识主机的唯⼀性。

5.2认识端口号

端⼝号( port )是传输层协议的内容.
端⼝号是⼀个 2 字节 16 位的整数;
端⼝号⽤来标识⼀个进程, 告诉操作系统, 当前的这个数据要交给哪⼀个进程来处理;
IP地址 + 端⼝号能够标识⽹络上的某⼀台主机的某⼀个进程;
⼀个端⼝号只能被⼀个进程占⽤.
端⼝号范围划分
0 - 1023 : 知名端⼝号, HTTP, FTP, SSH 等这些⼴为使⽤的应⽤层协议, 他们的端⼝号都
是固定的.
1024 - 65535 : 操作系统动态分配的端⼝号. 客⼾端程序的端⼝号, 就是由操作系统从这个范
围分配的.
理解 "端⼝号" 和 "进程ID"
我们之前在系统编程的时候, 学习了 pid 表⽰唯⼀⼀个进程; 此处我们的端⼝号也是唯⼀表⽰⼀个
进程. 那么这两者之间是怎样的关系?
⼀个进程可以绑定多个端⼝号; 但是⼀个端⼝号不能被多个进程绑定;
进程 PID 属于系统概念,技术上也具有唯⼀性,确实可以⽤来标识唯⼀的⼀个进程,但是这样
做,会让系统进程管理和⽹络强耦合,实际设计的时候,并没有选择这样做。
理解源端⼝号和⽬的端⼝号
传输层协议( TCP UDP )的数据段中有两个端⼝号, 分别叫做源端⼝号和⽬的端⼝号. 就是在描述 "数据是谁发的, 要发给谁";
理解socket
综上, IP 地址⽤来标识互联⽹中唯⼀的⼀台主机, port ⽤来标识该主机上唯⼀的⼀个⽹络进程
IP+Port 就能表⽰互联⽹中唯⼀的⼀个进程
所以,通信的时候,本质是两个互联⽹进程代表⼈来进⾏通信,{srcIp,srcPort,dstIp,dstPort}
这样的4元组就能标识互联⽹中唯⼆的两个进程
所以,⽹络通信的本质,也是进程间通信
我们把 ip+port 叫做套接字 socket

6.传输层的典型代表

如果我们了解了系统,也了解了⽹络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通
过⽹络协议栈进⾏通信,必定调⽤的是传输层提供的系统调⽤,来进⾏的⽹络通信。
认识TCP协议
此处我们先对 TCP ( Transmission Control Protocol 传输控制协议)有⼀个直观的认识; 后
⾯博客我们再详细讨论TCP的⼀些细节问题.
传输层协议
有连接
可靠传输
⾯向字节流
认识UDP协议
此处我们也是对 UDP ( User Datagram Protocol ⽤⼾数据报协议)有⼀个直观的认识; 后⾯博客再详
细讨论.
传输层协议
⽆连接
不可靠传输
⾯向数据报
因为我们暂时还没有深⼊了解 tcp udp 协议,此处只做了解即可

7.网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有⼤端和⼩端之分, 磁盘⽂件中的多字节数据相对于⽂件中的偏移地址也有⼤端⼩端之分, ⽹络数据流同样有⼤端⼩端之分. 那么如何定义⽹络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到⾼的顺序发出;
接收主机把从⽹络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到⾼的顺序保存;
因此,⽹络数据流的地址应这样规定: 先发出的数据是低地址,后发出的数据是⾼地址.
TCP/IP协议规定,⽹络数据流应采⽤⼤端字节序,即低地址⾼字节.
不管这台主机是⼤端机还是⼩端机, 都会按照这个TCP/IP规定的⽹络字节序来发送/接收数据;
如果当前发送主机是⼩端, 就需要先将数据转成⼤端; 否则就忽略, 直接发送即可;
不管这台主机是⼤端机还是⼩端机, 都会按照这个TCP/IP规定的⽹络字节序来发送/接收数据;
如果当前发送主机是⼩端, 就需要先将数据转成⼤端; 否则就忽略, 直接发送即可;
为使⽹络程序具有可移植性,使同样的C代码在⼤端和⼩端计算机上编译后都能正常运⾏,可以调⽤以下库函数做⽹络字节序和主机字节序的转换。

网络规定:所有发送到⽹络上的数据,都必须是⼤端的!

8.socket编程接⼝

socket 常⻅API

// 创建 socket ⽂件描述符 (TCP/UDP, 客⼾端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端⼝号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建⽴连接 (TCP, 客⼾端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockaddr结构
socket API是⼀层抽象的⽹络编程接⼝,适⽤于各种底层⽹络协议,如IPv4、IPv6, 然⽽, 各种⽹络协议的地址格式并不相同.

IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址⽤sockaddr_in结构体表⽰,包括16位地址
类型, 16位端⼝号和32位IP地址.
IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的
⾸地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的
内容.
socket API可以都⽤struct sockaddr *类型表⽰, 在使⽤的时候需要强制转化成sockaddr_in; 这样
的好处是程序的通⽤性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构
体指针做为参数;
sockaddr 结构
sockaddr_in 结构
虽然socket api的接⼝是sockaddr, 但是我们真正在基于IPv4编程时, 使⽤的数据结构是sockaddr_in; 这个结构⾥主要有三部分信息: 地址类型, 端⼝号, IP地址
in_addr结构
in_addr⽤来表⽰⼀个IPv4的IP地址. 其实就是⼀个32位的整数;
http://www.xdnf.cn/news/19101.html

相关文章:

  • HarmonyOS安全开发实战:一套好用的数据加密方案
  • mysql mvcc机制详解
  • Java全栈开发面试实战:从基础到微服务架构的深度解析
  • IntelliJ IDEA Debug 模式功能指南
  • 替身演员的艺术:pytest-mock 从入门到飙戏
  • 寻找AI——初识墨刀AI
  • 极海发布APM32F425/427系列高性能MCU:助力工业应用升级
  • Ansible模块实战,操作技巧
  • 【C#】获取不重复的编码(递增,非GUID)
  • 怎么理解API?
  • R-Zero:通过自博弈机制让大语言模型无需外部数据实现自我进化训练
  • LeetCode-238除自身以外数组的乘积
  • 大脑的藏宝图——神经科学如何为自然语言处理(NLP)的深度语义理解绘制新航线
  • PowerShell下vim编辑文件时产生的额外文件
  • 网站防爆破安全策略分析
  • KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战
  • 学习设计模式《二十四》——访问者模式
  • 【数字投影】创新展厅视觉体验,3D Mapping投影全面解读
  • LaTeX论文转word插入mathtype公式
  • C/C++ 数据结构 —— 线索二叉树
  • 【C++】map 容器的使用
  • django配置多个app使用同一个static静态文件目录
  • Android Glide最佳实践:高效图片加载完全指南
  • 滥用Mybatis一级缓存引发OOM问题
  • 网络安全监控中心
  • 阿里云——计算服务深度解析与选型
  • ChatGPT 上线 “学习模式”:全版本开放,重构 AI 教育逻辑
  • 基于单片机步进电机控制电机正反转加减速系统Proteus仿真(含全部资料)
  • 北斗导航|接收机自主完好性监测算法综述
  • java数据类型获取长度方式总结