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

1. 网络基础

0.背景

网络互联: 多台计算机连接在一起, 完成数据共享;
局域网 LAN: 计算机数量更多了, 通过交换机和路由器连接在一起
广域网 WAN: 将远隔千里的计算机都连在一起;

1.协议I

• "协议" 是一种约定。完善的协议,需要更多更细致的规定,并让参与的人都要遵守
ISO(国际标准化组织)制定协议

1.1协议分层

• 协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的

1.2 OSI七层模型

OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放
式系统互联参考模型,是一个逻辑上的定义和规范;
• OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型
的主机实现数据传输;
• 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,
理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可
靠的通讯;
• 但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来理解
• 其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议。

1.3 TCP/IP五层(或四层)协议

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

物理层我们考虑的比较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为 TCP/IP 四层模型.
一般而言
• 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
• 对于一台路由器, 它实现了从网络层到物理层;
• 对于一台交换机, 它实现了从数据链路层到物理层;
• 对于集线器, 它只实现了物理层

2.协议II

2.1为什么要有TCP/IP协议

• 首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和
内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:
SATA,IDE,SCSI 等。只不过我们感知不到罢了。而且这些协议都在本地主机各自
的硬件中,通信的成本、问题比较少
• 其次,网络通信最大的 特点就是 主机之间变远了。任何通信特征的变化,一定会
带来新的问题,有问题就得解决问题,所以需要新的协议了。
所以,为什么要有 TCP/IP 协议?本质就是通信主机距离变远了

2.2什么是TCP/IP协议

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

2.3TCP/IP协议与OS的关系(宏观)

问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说,
用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别
对方发来的数据,这不就是约定吗?

 关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型

因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。

3.网络传输基本流程

3.1局部网网络传输流程图

• 两台主机在同一个局域网,是否能够直接通信?是的
• 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址

认识MAC地址

• MAC 地址用来识别数据链路层中相连的节点;
• 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:
08:00:27:03:fb:19)
• 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地
址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).

 IP地址,用来标识,全球范围内,主机的唯一性(公网IP)

从哪来,到哪去 --- 源IP,目标IP地址(长远)

上一站从哪来,下一站去哪里 --- 源MAC,目标MAC地址(近期)

 数据包封装和分用

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

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

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

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

 在网络传输的过程中,数据不是直接发送给对方主机的,而是先要自定向下将数据交 付给下层协议,最后由底层发送,然后由对方主机的底层来进行接受,在自底向上进 行向上交付。

3.2跨网络传输流程图

网络中的地址管理 - 认识 IP 地址

IP 协议有两个版本, IPv4 和 IPv6. 本文中, 凡是提到 IP 协议, 没有特殊说明的, 默认都是指 IPv4
• 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
• 我们通常也使用 "点分十进制" 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或
多个路由器.

 路由过程中,IP地址不变,mac地址一直在变,mac地址只会在本局域网内有效!!

网络层+IP的本质意义:给网络提供了一层虚拟化层,让世界上所有的网络,都叫做IP网络!!

对比 IP 地址和 Mac 地址的区别• IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)
• Mac 地址一直在变
• 目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依
据,mac 地址是局域网转发的重要依据

4.Socket编程预备

4.1理解源 IP 地址和目的 IP 地址

• IP 在网络中,用来标识主机的唯一性

进程是人在系统中的代表,只要把数据给进程,人就相当于拿到了数据

数据传输到主机不是目的,而是手段。到达主机内部,再交给主机内的进程,才是目的。

但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识主机的唯一性

上网只有两种行为
1.从远端服务器,获取数据
2.本地数据,上传到远端服务器

4.2认识端口号(port)

端口号,可以用来标识系统中唯一的一个网络进程

端口号(port)是传输层协议的内容
• 端口号是一个 2 字节 16 位的整数; 
• 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来
处理; 
• IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程; 
• 一个端口号只能被一个进程占用

 端口号范围划分

• 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的
端口号都是固定的. 
• 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作
系统从这个范围分配的.

 理解 "端口号" "进程 ID"

有pid了为什么还要有端口号呢?(身份证和校园卡)
1.不是所有的进程,都要进行网络通信
2.从技术角度,只用pid也是可行的。但是,pid是一个系统概念,若pid含义变化了呢?网络也要跟着变。所以这样是为了:解耦!!!
另外, 一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定

理解 socket

• 综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的
一个网络进程
IP + Port = 全网内唯一的一个进程• IP+Port 就能表示互联网中唯一的一个进程
• 所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp,
srcPort,dstIp,dstPort}这样的 4 元组就能标识互联网中唯二的两个进程
• 所以,网络通信的本质,也是进程间通信
• 我们把 ip+port 叫做套接字 socket

4.3传输层的典型代表

• 如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核
的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来
进行的网络通信。

 认识 TCP 协议

此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识
• 传输层协议
• 有连接
• 可靠传输
• 面向字节流

 认识 UDP 协议

此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识
• 传输层协议
• 无连接
• 不可靠传输
• 面向数据报

4.4网络字节序

内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
• 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出; 
• 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从
低到高的顺序保存; 
• 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高
地址. 
• TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节. 
• 不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来
发送/接收数据; 
• 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即
可;大端 --- 高存低,低存高
小端 --- 高存高,低存低
为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运
行,可以调用以下库函数做网络字节序和主机字节序的转换。
• 这些函数名很好记,h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位
短整数。
• 例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地
址转换后准备发送。
• 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回; 
• 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

4.5 socket编程接口

1. 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);

2.  绑定端口号 (TCP/UDP, 服务器)

int bind(int socket, const struct sockaddr *address, socklen_t address_len);
用于将一个套接字与特定的 IP 地址和端口号绑定

3. 开始监听 socket (TCP, 服务器)

int listen(int socket, int backlog);

listen() 函数用于将主动套接字(由 socket() 创建)转换为被动套接字,使其能够接受客户端的连接请求

4. 接收请求 (TCP, 服务器)

int accept(int socket, struct sockaddr* address, socklen_t* address_len);

accept()函数用于从监听队列中提取一个已建立的连接,并返回一个新的套接字描述符用于与客户端通信

5. 建立连接 (TCP, 客户端)

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

connect()函数用于客户端向服务器发起连接请求。它将主动套接字(由socket()创建)与服务器的地址和端口绑定,建立 TCP 连接或指定 UDP 通信的默认目标地址

sockaddr 结构

socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、IPv6,以及 后面要讲的 UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.

• 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 结构体指针做为参数;

代码实现 

makefile:

 UdpServer.hpp:

 UdpClient.cc:

UdpServer.cc: 

Mutex.hpp:

 Log.hpp:

附录:

p45

p60  

 

 

p79

 

http://www.xdnf.cn/news/969193.html

相关文章:

  • 带eachers的html转word
  • 渲染学进阶内容——joml库
  • 深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
  • cell properties修改参数
  • 突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
  • Vue 指令详解:概念与作用
  • 渲染学进阶内容——模型
  • ssc377d修改flash分区大小
  • 86壳温湿度传感器:高温下工业生产的安全防线
  • Elasticsearch增删改查语句
  • GAMES202-高质量实时渲染(Real-Time Ray-Tracing)
  • Minktec 柔性弯曲传感器应用:3D 脊柱姿势追踪与人体活动识别
  • 半加器和全加器
  • React19源码系列之 事件优先级
  • Netty从入门到进阶(三)
  • 淘宝SKU与视频详情API接口使用指南
  • 6月10日day50打卡
  • 鹰盾播放器禁止录屏操作的深度技术解析与全栈实现方案
  • AI写实数字人实时交互系统本地私有化部署方案
  • Java TCP网络编程核心指南
  • 服务器硬防的应用场景都有哪些?
  • V837s-sdk buildroot文件系统设置串口登录密码
  • Docker 创建及部署完整流程
  • spring jms使用
  • pnpm install 和 npm install 的区别
  • 力扣HOT100之堆:347. 前 K 个高频元素
  • 基于51单片机的三位电子密码锁
  • LDPC码的编码算法
  • 【2025CVPR】花粉识别新标杆:HieraEdgeNet多尺度边缘增强框架详解
  • C++中变量赋值有几种形式