linux笔记归纳13:网络基础
网络基础
目录
一、计算机网络背景
1.1.网络发展
早期通过软盘对计算机数据进行拷贝,中间需要人的参与,效率低下
计算机是人类的工具,人需要协作,注定计算机之间要协作
所以网络的产生是必然的,从局部开始产生,再发展到整体
网络发展:
美国军方创建阿帕网,90年代公开后,组件了互联网,在世界商业化
随着路由器、交换机这些新网络设备的诞生,许多通信厂商得到发展
比如:华为、诺基亚,生产网络通信设备,进而使运营商也开始发展
比如:联通、电信、移动,进行大量的基础设施建设,比如通信设施
独立模式:
计算机之间相互独立

网络互联:
多台计算机连接在一起,完成数据共享

局域网LAN:
计算机数量更多,通过交换机和路由器连接在一起

广域网WAN:
将远隔千里的计算机连在一起

二、网络协议
2.1.协议初识
协议的本质:一种约定,减少通信的成本,用于快速形成共识
计算机之间的传播媒介是光信号和电信号
通过"频率"或''强弱"来表示0和1这样的信息

完善的协议需要更多更细致的规定,并且让参与的人都要遵守
计算机的生产厂商、计算机的操作系统、计算机的网络设备
如何让这些不同厂商之间生产的计算机能够相互顺畅地通信
就需要约定一个共同的标准,让各厂商遵守,就是网络协议
网络协议的标准:多种局域网通信标准+一种广域网通信标准
ISO(国际标准化组织):OSI模型定义了网络通信的七层协议结构,只生产标准,不实现代码
2.2.协议分层
协议也是软件,在设计上为了更好地模块化,解耦合,也是层状结构
分层之后可以无障碍地替换任意一层,实现分层解耦,增强可维护性
- 普通用户视角:
两个人之间在直接通信,两个电话之间在直接通信
在用户层的视角下,只有同层之间才能够之间通信
- 工程师视角:
将人说的话交给电话机,电话机将声音采集,压缩,加密后
通过特定的协议方式,将声音信息发送到另一个人的电话机
对方通过解密,解压,通过听筒将声音播放,获取声音信息

2.3.OSI七层模型
OSI(Open System Interconnection):开放系统互联

2.4.TCP/IP五层模型
五层模型:物理层(不关注)、数据链路层、网络层、传输层、应用层(包含表示层和会话层)
物理层:负责光电信号的传递方式,决定了最大传输速率、传输距离、抗干扰性,是集线器的工作
数据链路层:负责设备之间数据帧的传输和识别,网卡驱动、帧同步、冲突检测,是交换机的工作
网络层:负责地址管理和路由选择,通过IP地址表示主机,通过路由表规划线路,是路由器的工作
传输层:负责两台主机的数据传输,通过TCP传输控制协议,使数据可靠的从主机发送到目标主机
应用层:负责应用程序之间的沟通,比如:电子邮件传输、文件传输协议、网路远程访问协议

2.5.TCP/IP协议的诞生
本地通信:所有的计算机设备通过线连接起来(I/O总线、系统总线)
计算机中的冯诺依曼架构,本身就是一个通过总线连接的网络架构
通过内部的硬件协议(内存与其他设备、磁盘与其他设备)来通信
网络通信:多台主机通过网络通信,其本质也是从设备到设备
与本地通信的唯一区别在于线变长了,主机间的距离变远了,就会有新的问题产生
- 问题1:如何处理收到的数据呢 —— 应用层
- 问题2:在传输时数据丢失问题 —— 传输层
- 问题3:如何定位目标主机问题 —— 互联网层
- 问题4:如何确定当下要去哪里 —— 网卡层
TCP/IP协议的本质:一种网络长距离通信的解决方案


2.6.TCP/IP与操作系统

操作系统中存在许多协议,网络中还有报文,报文中存在许多协议字段
操作系统需要对协议与报文进行管理,先描述,再组织
协议的朴素理解:通信双方都认识的结构化的数据类型
结构体是协议约定的计算机表达,通过结构体对象来建立共识

快递单用C语言表示就是一个struct结构体
快递单就是收发双方的一种协议

三、网络传输基本流程
3.1.局域网通信原理
局域网通信的标准
- 以太网(Ethernet)
- 令牌环网
- 无线LAN(WiFi)
每台主机在局域网中,都要有一个唯一的网卡标识符来确保主机唯一性:MAC地址
MAC地址用来识别数据链路层中相连的节点,长度为6个字节
MAC地址在网卡出厂时就确定了,不能修改,通常是唯一的

在同一个局域网的两台主机能够直接通信
一台主机向局域网内所有主机发送含有目标主机的信息,只有目标主机处理,其他主机抛弃
以太假说:以前物理学家猜测宇宙充满一种叫"以太"的介质,认为光必须靠以太传播
(迈克尔逊-莫雷实验否定了以太的存在)

以太网中,任何时刻只允许一台机器向网络发送数据
当多台同时发送,会发生数据干扰,称之为数据碰撞
在没有交换机的情况下,一个以太网就是一个碰撞域
所有发送数据的主机要进行碰撞检测和碰撞避免(碰撞避免算法)
以太网的本质是共享的资源,即临界资源,通过碰撞检测和碰撞避免维持互斥属性
3.2.网络协议栈
主机之间通信本质:两个网络协议栈在通信,数据发送的原始动力主要是用户
网络协议栈的每一层都要有对应的协议,协议信息被称为协议报头(结构体变量)

报文:协议报头 + 有效载荷
用户发送的数据,必须贯穿网络协议栈(操作系统是网卡的管理者),由网卡发送给目标主机
发送端自顶向下封装报文(入栈),接收端同层解包,将报头和有效载荷进行分离(出栈)
同层之间都认为自己在和对方同层协议在直接通信

不考虑应用层协议,任何协议都包含了两种字段
- 报头必须要做到能和有效载荷进行分离的能力
- 报头必须要将自己的有效载荷交付给上层的一个具体的协议
底层收到的报文如果不是发给该主机,主机在数据链路层就会将报文丢弃
- 应用层:请求与应答
- 传输层:数据段
- 网络层:数据报
- 数据链路层:数据帧
网卡的驱动程序默认只把发送给目标主机的报文向上交付
但网卡的混杂模式会无脑地将收到的报文向上交付(抓包工具原理)
- 整体框图

- 数据封装

- 数据分用

3.3.网络中的地址管理
IP协议:IPv4(4字节)和IPv6(16个字节)版本,默认指IPv4
IP地址用来标识全球范围内主机的唯一性
IPv4协议的IP地址是一个4字节的32位整数
点分十进制的字符串表示IP地址,每一个数字表示一个字节(0 ~ 255)
例如:192.168.0.1

下图的路由器含有IP地址和两张网卡,分别连接以太网和令牌环网这两个子网
同一个子网,它的IP地址的前几位是类似的,只要有网络层,就会有路由功能

源IP为198开头的主机A并不知道上层交付的目标IP为172开头的主机B在哪里
但主机A一定能确定,报文绝对不是发给本地网络的主机的,因为IP开头不同
所以主机A一定会把报文发送给路由器,路由过程中,IP地址不变、MAC地址
一直在变,MAC地址只会在本地局域网中有效
网络层 + IP的本质意义:给网络封装一个虚拟层,让世界所有网络都叫做IP网络
(网络的底层可以是以太网、无线LAN、令牌环,而从网络层往上都只有IP网络)


四、socket编程基础
4.1.源IP与目的IP地址
数据传输到目标主机不是目的,用户使用数据才是目的
比如:QQ聊天是用户在聊,浏览器网页是用户在看
用户通过启动QQ、浏览器进程,看到聊天信息、网页信息
进程是用户在系统中的代表,进程获取数据相当于用户获取数据
所以数据传到主机是手段,数据交给主机内的进程才是最终目的

上网只有两种行为
- 从远端服务器获取数据下载
- 将本地数据上传远端服务器
进程(内存)<=> 网卡 <=> 网络
网络通信的本质:两个不同主机的进程进行数据交互(I/O),即进程间通信(IPC)
让不同的进程看到同一份资源:网络
4.2.端口号
端口号(port):传输协议层的内容,为2个字节的16位整数
作用:用来标识一个进程,告诉OS当前的数据要交给哪个进程处理
- 0 ~ 1023:知名端口号,比如HTTP,FTP,SSH等应用层协议,它们的端口号固定
- 1024 ~ 65535:操作系统动态分配的端口号,客户端程序的端口号


4.3.端口号 VS PID
不是所有的进程都要进行网络通信
PID是一个系统的概念,如果将来在系统层发生变化,那么在网络层也要改变
设计端口号,就可以将进程标识在系统层与网络层进行解耦合
一个进程PID可以绑定多个Port端口号,但一个Port端口号只能标识唯一的进程
4.4.socket套接字
网络通信:互联网内唯二的两个进程在进行进程间通信,使用IP + port标识唯一性
IP地址+端口号:表示互联网中某一台主机的某一个网络进程
{srcIP,srcPort,dstIP,dstPort}:这样的4元组表示互联网内唯二的两个进程
socket套接字: IP地址 + port端口号
4.5.传输层的典型代表
传输层是属于操作系统内核的
如果通过网络协议栈进行通信
要调用传输层提供的系统调用
TCP协议(Transmission Control Protocol):传输控制协议
特点:有连接(电话)、可靠传输(丢了、超时了会重传)、面向字节流(接自来水)
做更多工作,复杂且占用资源多,使用场景:支付交易
UDP协议(User Datagram Protocol):用户数据报协议
特点:无连接(对讲机)、不可靠传输(丢了、超时了不管)、面向数据报(快递、信封)
多更少工作,简单且维护性强,使用场景:直播流媒体

4.6.网络字节序
内存中的多字节数据相对于内存地址有大小端之分
磁盘文件中的多字节数据相对于文件中的偏移地址有大小端之分
网络数据流也有大小端之分


发送主机将缓冲区的数据按内存地址从低到高发出
接收主机将字节按内存地址从低到高保存到缓冲区
网络数据流规定:先发出的数据是低地址,后发出的数据是高地址
TCP/IP协议规定,网络数据流采用大端字节序,所有发送到网络上的数据都必须是大端的
为了使网络程序具有可移植性,同样的C代码在大端和小端计算机都能允许,可调用库函数做
网络字节序和主机字节序的转换

h表示host主机,n表示net网络,l表示32位长整数,s表示16位短整数
htonl:将32位长整数从主机字节序转为网络字节序
主机为小端,将参数做相应大小端转换后返回
主机为大端,将参数原封不动地返回,不转换
五、socket编程接口
5.1.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);
5.2.sockaddr结构
System V标准:本地进程间通信
POSIX标准:网络进程间通信(也能进行本地通信)
socket会有很多的种类来满足不同的应用场景
- 网络socket
- 本地socket(Unix域间通信)
- 原始socket
而socket的设计者指向提供一种通信接口
如果address→sin_family == AF_INET,则为网络通信
如果address→sin_family == AF_UNIX,则为本地通信
本质就是:继承 + 多态

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)