linux--网络协议初识
linux–网络协议初识
事实: 通信的主机之间距离变长了---->引发出新的通信问题?
- 如何使用数据问题(应用层)
- 可靠性问题(传输层)
- 主机定位问题(网络层)
- 数据报局域网转发问题(数据链路层)
人提出网络协议解决方案—方案有好有坏–为了方便扩展,替换或维护–故将网络协议设置为分层结构
层和层之间松耦合,可以随时替换或维护.

-
为什么是协议? 为什么? 怎么办?
- “协议是一种约定”–计算机协议就是计算机和计算机之间的约定
- 为什么—通信主机之间距离变远了, 减少通信成本;沟通成本
- 制定协议规则
-
什么是TCP/IP协议?
- TCP/IP协议本质是一种解决方案
- TCP/IP协议能分层,前提是问题们本身可以分层
-
网络分层(why?what?how?)
- why? 层和层降低耦合,方便维护.
- what? how?

TCP/IP五层模型
- 物理层:负责光电信号的传递方式,比如现在的网线(双绞线).光纤,物理层的能力决定了最大传输速率,传输距离,抗干扰能力等, 集线器(放大信号)工作在物理层
- 数据链路层:负责设备之间的数据帧的传送和识别,如: 网卡设别的驱动,帧同步, 冲突检测,数据差错效验等 有以太网 ,令牌环网, 无线LAN等标准,交换机工作在数据链路层.
- 网络层: 负责地址管理和路由选择,例如在IP协议中,通过IP地址标识一台主机,并通过路由表的方式规划处两台主句之间的数据传输的线路(路由),路由器工作网络层.
- 传输层: 负责两台主机之间的数据传输,如传输控制协议(TCP),能够保证数据可靠的从源主机发送到目标主句.
- 应用层: 负责应用程序之间的沟通, 如:简单的电子邮件传输(SMTP), 文件传输协议(FTP),网络远程访问协议(Telent), 网络编程主要针对应用层.
操作系统和网络协议栈之间的关系?

- 朴素的理解协议, 站在语言角度,重新理解协议

问题:主机B可以识别data,并准确提取 a = 10, b = 20, c = 30吗?
可以! 因为双方都有相同的结构体类型struct protocol,也就是说使用相同的代码实现协议,用相同的自定义类型,天然就具有"共识",能识别对方发来的数据.这就是约定.
协议即 -- 通信双方都可以认识的结构化的数据类型
因为协议是分层的,所以每层双方都有协议,同层之间,互相可以认识对方的协议.
网络传输基本原理
- 局域网传输基本原理
- 两台主机在一个局域网上,可以直接通信.
- 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac地址
- mac地址用来识别数据链路层中相连的节点
- 长为48位,即6个字节,例如:08:00:27:03:fb:19
- 在出厂时就确定了,不能修改,mac地址通常是唯一的

- 在以太网(局域网中的一种类型)中任何时刻,只允许一台主机向网络中发送数据.
- 如果有多台主机同时发送数据,会发送数据干扰,我们成为数据碰撞,因此局域网也成为碰撞域.
- 所有发送数据的主机都要进行碰撞避免和碰撞检测.
- 没有交换机的情况下,一个以太网就是一个碰撞域.
- 在局域网通信过程中,主机对收到的报文确认是否是发送给自己的,通过mac地址确定.
- 以太网发送数据碰撞时,处理方案是:过一会再发送数据, 令牌环网的处理方案是: 谁拿令牌谁才可以向网络中发送数据.
- 局域网本质:一个临界资源.
同一个网段内的两台主机进行发信息的过程.

而其中每层都有协议(本质就是结构体),所以当我进行进行上述传输流程的时候,要进行封装和解包


- 报头部分,对应协议层的结构体字段,叫报头
- 处理报头,剩下的叫有效载荷.
- 故:报文 = 报头 + 有效载荷.
- 首部信息中包含首部多长,载荷多长,上层协议是什么等信息.
不同层的完成报文叫法:
- 传输层:段
- 网络层: 数据报
- 链路层:帧

数据的包装和分用:

**解包: 将报头和有效载荷分离 **— 双方协议相同, 互相认识都认识结构化报头,固定长度的报头
分用: 将自己的有效载荷交给上层哪一个协议?(在报头中有上层协议)

我们学习任何协议,都要在宏观是建立这样的认识:
- 要学习的协议,是如何做到解包的? 只有明确解包,封装也就可以理解
- 将自己的报头和有效载荷分离(解包) 2. 将自己的有效载荷交给上层协议(分用)
- 要学习的协议,是如何将自己的有效载荷,交付给上一层协议的?
跨网络传输流程图(唐僧的故事去西天取经)
认识IP地址:IP地址用来标识网络中不同的主机地址
数据报文中一般都有: 源IP地址和目的IP地址 源MAC地址 和 目的MAC地址

IP地址的意义:
- 为什么要去目标主机要先走路由器?
- 目的IP的意义? 路径规划的依据.

结合封装和解包,体现路由器解包和封装的特点

对比IP地址和MAC地址的区别?
- IP地址在整个路由过程中,一直不变
- Mac地址一直在改变
- 目的IP是一种长远目标,Mac地址是下一阶段的目标,目的IP是路径选择的重要依据,Mac地址是局域网转发的重要依据
IP网络的意义和网络通信的宏观流程

IP网络层存在的意义:提供网络虚拟层,让世界所有网络都是IP网络,屏蔽最底层网络差异.
Socket编程预备
- 理解源IP地址和目的IP地址
- IP在网络中,用来标识主机的唯一性.
思考数据传输到主机是目的吗?
不是,因为数据是给人用到,如:聊天是人在聊天,下载是人在下载,浏览网页是人在浏览.但是人是怎样看到聊天信息的呢?如恶化执行下载任务?如何浏览网页信息?通过启动进程qq 迅雷 浏览器.
而启动的进程是人的代表,进程是人在系统中的代表,只要将数据交给进程, 人就相当于拿到数据.
所以:数据传输到主机不是目的,而是手段,到达目标主机内部,再交给主机内的进程此时目的.
但是系统中,同时会存在多个进程,当数据到达目标主机之后,如何转发给进程?

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

端口号的划分
- 0 - 1023: 知名端口号,HTTP, FTP, SSH 这些广为使用的引用层协议,他们的端口都是固定的.
- 1024 - 65535: 操作系统动态分配的端口号,客户端程序的端口号.
理解"端口号" 和 “进程ID”
-
pid表示唯一一个进程,此处端口号也唯一标识一个进程,二者之间的关系是什么样的?
-
一共进程可以绑定多个端口号,但是一个端口不能被多个进程绑定.
-
进程ID属于系统的概念, 技术上也是唯一性,确实可以用来标识唯一的一个进程,但是这样做,会让进程管理和网络强耦合,实际设计时并没有这样做.
理解源端口和目的端口号
- 传输层协议(TCP和UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号,就是在描述"数据是谁发的,发给谁";
理解socket
-
综上所述:IP地址用来标识互联网中唯一一台主机, 端口号用来标识主机中唯一一个网络进程.
-
IP + Port : 就可以表示互联网中的唯一一个网络进程.
-
所以,通信的时候,本质就是两个互联网那个进程之间的通信;{srcip,srcport,dstip,dstport} 这样的四元组就可以标识互联网中唯二的两个进程.
-
所以通信的本质:进程之间通信
-
我们将 ip + port 叫做套接字socket
传输层的代表
- 传输层属于内核,那么我们通过网络协议栈进程通信,必定调用的是传输层提供的系统调用,来进行网络通信.

认识TCP/UCP协议
TCP(Transmission Control Protocol 传输控制协议)
- 传输层
- 有连接
- 可靠传输
- 面向字节流
UDP(User Datagram Protocol 用户数据包协议)
- 传输层协议
- 无连接
- 不可靠传输
- 面向数据报
网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同时有大端和小端之分,那么如何定义网络数据流的地址?
- 发送主机通常将发送缓冲区中的数据按内存地址从低到高地址的顺序发出.
- 接受主机把从网络上接到的字节依次保存在接受缓冲区中,也是按照内存地址从低到高的顺序保存.
- 因此,网络数据流的地址应该这样规定:先发出的数据是低地址,后发出的地址是高地址.
- TCP/IP协议规定,网络数据流采用大端字节序,即低地址高字节
- 无论主机是大端还是小端机,都会按照TCP/IP规定的网络字节序来发送和接受数据.
使用以下库函数做网络字节序和主机字节序1转换:

- h 表示host, n表示newwork, l 表示32位长整数(IP地址),s 表示16位短整数(端口号).
socket编程接口
socket常见API
//创建socket文件描述符(TCP/UDP, 客户端和服务端)
int socket(in 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 sockaddt* addr, socklen_t addr_len);
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* 类型表示(类似与形参是void*),在使用时候,需要强制类型转换为sockaddr_in,这样的好处是程序的通用性,可以结构IPv4 IPV6等各种类型的sockaddr结构体指针作为参考.
sockaddr结构

sockaddr_in结构

虽然sock api结构是sockaddr,但是我们真正在基于IPv4编程时,使用的数据结构是sockaddr_in,这个结构主要有3个部分信息,地址类型,端口号,IP地址.
in_addr 结构

in_addr 用来表示一个IPv4的IP地址,其实就是一个32位整数.
(完结!!!)
相关文章:
linux--网络协议初识
linux–网络协议初识 事实: 通信的主机之间距离变长了---->引发出新的通信问题? 如何使用数据问题(应用层)可靠性问题(传输层)主机定位问题(网络层)数据报局域网转发问题(数据链路层) 人提出网络协议解决方案—方案有好有坏–为了方便扩展,替换或维护–故将网络协议设置…...
Linux MariaDB部署
1:查看Linux系统版本 cat /etc/os-release#返回结果: NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI…...
window系统下安装elk
Elasticsearch、logstash、kibana 都为8.17.3版本 Elasticsearch 安装流程 # 下载 https://www.elastic.co/cn/downloads/elasticsearch#ga-release elasticsearch-8.17.3-windows-x86_64 # 解压配置 elasticsearch.yml,下个代码块 # bin目录下双击下述文件&…...
uniapp用户登录及获取用户信息(头像昵称)
低版本情况 微信开发者工具的基础库版本要调到2.27版本以下,能够直接申请用户权限获取用户信息,但是会仅限于开发者调试,在真机测试或已上传的小程序在手机上就不能获取以上的原因是微信小程序wx.getUserProfile 和wx.getUserInfo 这两个获取…...
第五周日志-重新学汇编(2)
机器语言 汇编语言(直接在硬件上工作——硬件系统结构): 1.机器语言 每一种微处理器硬件设计和内部结构不同(决定了电信号不同,进而需要不同的机器指令) #早期通过纸带机/卡片机输入计算机,进行运算 2…...
Linux下EC11旋转编码器驱动调试
文章目录 1、前言2、使用gpio-keys驱动2.1、dts配置2.2、识别原理2.3、应用层驱动实现2.4、编译测试 3、使用rotary-encoder驱动3.1、dts配置3.2、app测试程序编写3.3、编译测试 4、总结 1、前言 本来是没有这篇文章的。最近在rk3576下调试ec11旋转编码器时,一直没…...
【无标题】Java的基础准备
一、cmd的常见命令 盘符名称冒号 说明:盘符切换dir 说明:查看当前路径下的内容cd目录 说明:进入单极目录cd.. 说明:回退到上一级目录cd目录1\目录2\... 说明:进入多级目录cd\ …...
【数学建模】(启发式算法)遗传算法:自然选择的计算模型
遗传算法:自然选择的计算模型 文章目录 遗传算法:自然选择的计算模型1. 引言2. 遗传算法的基本原理2.1 基本概念2.2 算法流程 3. 编码方式3.1 二进制编码3.2 实数编码3.3 排列编码 4. 选择操作4.1 轮盘赌选择4.2 锦标赛选择4.3 精英保留策略 5. 交叉操作…...
嵌入式八股,static在Linux驱动编写时的用处
1. 限制作用域 static关键字可以用来限制函数或变量的作用域,使其只能在当前文件内被访问。这有助于避免命名冲突,并提高代码的模块化和可维护性。 只能在当前文件里访问,或调用当前文件里有的函数。 // 文件 A.h static int globalVar 1…...
RCE——回调后门
目录 rce简述 rce漏洞 rce漏洞产生分类 rce漏洞级别 创造tips的秘籍——回调后门 call_user_func 解析 如何执行后门 call_user_func_array array_filter、array_map 解析 如何执行后门 php5.4.8中的assert——二参数的回调函数 uasort uksort array_reduce() …...
JavaScript 调试入门指南
JavaScript 调试入门指南 一、调试准备阶段 1. 必备工具配置 浏览器套件:安装最新Chrome102+,开启实验性功能(地址栏输入chrome://flags/#enable-devtools-experiments)编辑器集成:VS Code安装以下扩展: JavaScript Debugger:支持浏览器与Node.js双端调试Error Lens:实…...
字节真题,问a,b,c指的地址是否相同?
题目: class A{ int a, int d } class B { int b }class C: public A,public B { int b } C* c new C; A* a c; B* b c; 问a,b,c指的地址是否相同? 在 C 中,由于类的继承关系以及内存布局的规则,a、b 和 c 指针的地址可能不…...
2025年03月18日柯莱特(外包宁德)一面前端面试
目录 自我介绍你怎么从0到1搭建项目的webpack 的构建流程手写webpack插件你有什么想问我的吗 2. 你怎么从 0 到 1 搭建项目的 在面试中回答从 0 到 1 搭建前端项目,可按以下详细步骤阐述: 1. 项目前期准备 需求理解与分析 和产品经理、客户等相关人…...
OpenGL ES 2.0与OpenGL ES 3.1的区别
如果硬件支持且需要更高质量的图形效果,推荐3.1;如果兼容性和开发简便更重要,且效果需求不高,2.0更合适。不过现代车载系统可能越来越多支持3.x版本,所以可能倾向于使用3.1,但具体情况还需调查目标平台的硬…...
Unity Shader 学习17:合批渲染
一、基础概念 合批主要是针对这三个概念进行优化减少: ① SetPass Call:一次渲染状态切换,也就是每次切换 材质/Pass 时,就会触发一次SetPass Call ② Draw Call:cpu 调用一次 gpu 绘制函数 ③ Batch:表示…...
带你从入门到精通——自然语言处理(十. BERT)
建议先阅读我之前的博客,掌握一定的自然语言处理前置知识后再阅读本文,链接如下: 带你从入门到精通——自然语言处理(一. 文本的基本预处理方法和张量表示)-CSDN博客 带你从入门到精通——自然语言处理(二…...
vue3 数据监听(watch、watchEffect)
1、watch 1.1基本使用 作用:数据监听 语法: watch(监听的数据, (改变后的数据, 改变前的数据) > { console.log(newVal, oldVal); }) 注意点:watch写法上支持一个或者多个监听源,这些监听源必须只能是getter/effect函数…...
Vue 3中的Teleport:超越组件边界的渲染
Vue 3引入了许多新特性,其中之一便是Teleport。它为开发者提供了一种强有力的方式来控制组件的渲染位置,使得我们可以将组件的内容“传送”到DOM树的任何地方,而不仅仅局限于其父级组件的边界内。这在创建模态框、通知系统或任何需要脱离当前…...
【计算机网络】DHCP工作原理
DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…...
Linux网站搭建(新手必看)
1.宝塔Linux面板的功能 宝塔面板是一款服务器管理软件,可以帮助用户建立网站,一键配置服务器环境,使得用户通过web界面就可以轻松的管理安装所用的服务器软件。 2. 宝塔Linux面板的安装 宝塔官网地址:宝塔面板 - 简单好用的Linu…...
JVM - 年轻代和老年代
通过一些问题来讨论 JVM 中年轻代和老年代的内容 为什么要区分年轻代和老年代?哪些对像会进入老年代?什么时候会进行年轻代GC?什么时候会进行老年代GC? 1. 为什么要区分年轻代和老年代? 年轻代中的对象大部分都是短期…...
【C++初阶】---类和对象(上)
1.类的定义 1.1类的定义格式 • class为定义类的关键字,Data为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。 •…...
【数据库事务、消息队列事务、Redis 事务、Spring 事务 详细分析】
数据库事务、消息队列事务、Redis 事务、Spring 事务** 的详细分析 在分布式系统和应用开发中,事务管理是确保数据一致性和可靠性的关键机制。以下是针对 数据库事务、消息队列事务、Redis 事务、Spring 事务 的详细分析,包括原理、特点、适用场景和对比…...
2-1 基本放大电路
放大的概念 mV →V mA→A 特征:放大功率(电压与电流)。 本质:能量在控制下的转换。(外接供电电源) 必要条件:有源元件(能量控制原件) 前提:不失真 测试的…...
什么是矩阵账号
矩阵账号是指在同一平台或多个平台上,围绕同一品牌或个人,创建的多个相互关联、协同工作的账号组合。这些账号虽然独立,但在内容定位和运营策略上有所区分,同时又相互引流,共同形成一个网络结构,类似于矩阵…...
【Linux】Ubuntu 24.04 LTS 安装 OpenJDK 8
目录 通过 apt-get 直接安装 JDK 1. 更新 apt 软件源 2. 检查 JDK 是否已安装 3. 安装OpenJDK 4. 检查 JDK 是否成功安装 5. 设置 JAVA_HOME 环境变量 找到需要设置的 Java 路径 使用文本编辑器打开/etc/environment文件 添加 Java 安装路径 应用更改和验证配置 通过…...
xcode开发swiftui项目的时候,怎么调试ui占位和ui大小
有时候元素之间可能存在很大的空间间隔,但是又不知道怎么产生的,无奈我又看不懂xcode里面的Debug View Hierarchy功能,只能使用笨方法,就是给不同的块元素设置上不同的背景色,然后看一下间隙区域到底是哪个背景色填充的…...
测试用例的优先级划分规则
测试用例的优先级划分是根据 业务重要性、风险程度、测试资源 等因素,确定测试执行的顺序,以最大化测试效率和风险控制。以下是常见的优先级划分规则和操作方法: 一、优先级划分的核心原则 风险驱动 高风险功能(如核心支付流程&a…...
信息安全的数学本质与工程实践
信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代,信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言,理解信息安全需要超越工具化认知,深入其数学内核与系…...
第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes
优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题(每题至少2个正确答案)二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点:动态内存分配需要调用…...
