linux学习之网络编程
一、两个模型及其对应关系
OSI七层模型 TCP/IP 四层模型
--------------------------------------------------------------------------
应用层
表示层 ----> 应用层
会话层
传输层 ----> 传输层
网络层 ----> 网络层
数据链路层 ----> 网络接口层
物理层
-
物理层
- 功能:主要负责处理物理介质上的信号传输,包括电缆、光纤、无线等传输介质。它定义了物理设备的电气、机械、功能和规程特性,确保数据能够在物理介质上正确地发送和接收。比如,规定了网线的接口形状、引脚定义、信号的电压等级、传输速率等。
- 设备:常见的物理层设备有集线器、中继器等。
-
数据链路层
- 功能:负责将物理层接收到的原始比特流转换为数据帧,并进行差错检测和纠正,同时还负责数据的成帧、MAC 地址寻址等功能。它通过在数据中添加帧头和帧尾等信息,使数据能够以帧为单位在物理链路上传输,并确保数据帧的正确传输和接收。
- 设备:数据链路层的设备主要有交换机、网桥等。
-
网络层
- 功能:主要负责网络中的寻址和路由选择,使数据能够在不同的网络之间进行传输。它为数据包添加源 IP 地址和目的 IP 地址等信息,通过路由算法确定数据传输的最佳路径。
- 设备:网络层的主要设备是路由器。
-
传输层
- 功能:主要负责在不同主机上的应用程序之间提供可靠或不可靠的端到端通信。它通过端口号来标识不同的应用程序进程,实现数据的分段和重组,确保数据的可靠传输。常见的传输层协议有 TCP(传输控制协议)和 UDP(用户数据报协议)。
- 协议:TCP 提供面向连接的、可靠的字节流服务;UDP 提供无连接的、不可靠的数据包服务。
-
会话层
- 功能:主要负责建立、维护和管理会话连接。它可以在不同主机的应用程序之间建立会话,协调数据的传输顺序,以及在会话结束时进行连接的释放等操作。
- 应用:比如在 Web 应用中,用户登录到网站后,会话层会建立一个会话,用于跟踪用户的操作和状态,直到用户退出登录或会话超时。
-
表示层
- 功能:主要负责处理数据的表示和转换,包括数据的加密和解密、压缩和解压缩、字符编码转换等。它确保不同系统之间能够正确地理解和处理数据。
- 应用:当用户从网络上下载一个压缩文件时,在接收端,表示层会对文件进行解压缩操作,以便应用层能够正确地读取和处理文件内容。
-
应用层
- 功能:是直接为用户提供服务的一层,它包含了各种网络应用协议和服务,如 HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)等,用户通过应用层的应用程序来访问网络资源和服务。
- 应用:用户使用浏览器访问网站时,就是通过应用层的 HTTP 协议与服务器进行通信,获取网页内容等信息。
二、UDP协议(用户数据报)和TCP传输控制协议
连接特性
- UDP:是无连接的协议,发送数据前不需要先建立连接,就像邮寄信件一样,只管把数据报发送出去,不关心对方是否准备好接收,也不确认对方是否成功收到。
- TCP:是面向连接的协议,在发送数据前,需要先在发送方和接收方之间建立连接,就像打电话,双方要先接通,确认可以通信后才开始说话。
可靠性
- UDP:不保证数据的可靠传输,数据报可能会丢失、重复或乱序到达。
- TCP:提供可靠的传输服务,通过序列号、确认应答、重传机制等保证数据无差错、不丢失、不重复且按序到达。
传输效率
- UDP:没有连接建立和维护的开销,也没有复杂的确认和重传机制,传输速度快,效率高,适合对实时性要求高但对数据准确性要求相对较低的场景。
- TCP:由于要保证数据的可靠性,有较多的控制机制,会带来一定的开销,传输效率相对 UDP 低一些,但在对数据准确性要求高的场景中是必要的。
数据格式
- UDP:数据报格式简单,首部只有 8 个字节,包括源端口、目的端口、长度和校验和,数据部分就是应用层传递下来的数据。
- TCP:首部一般为 20 字节,包含源端口、目的端口、序列号、确认号、数据偏移、保留、控制位、窗口、校验和、紧急指针等字段,比 UDP 复杂,能提供更多的控制信息。
应用场景
- UDP:常用于实时性要求高的应用,如视频会议、实时监控、DNS(域名系统)查询等。在这些场景中,少量数据的丢失或延迟可以接受,关键是要保证数据的实时传输。
- TCP:适用于对数据准确性和完整性要求严格的应用,如网页浏览、文件传输、电子邮件等。这些应用需要确保数据完整无误地到达目的地。
三、三次握手四次挥手
三次握手
- 第一次:客户端发 SYN 包,含初始序列号 seq=x,向服务器请求建立连接,此时客户端进入 SYN_SENT 状态。
- 第二次:服务器收到 SYN 包后,发 SYN+ACK 包,确认号 ack=x + 1,自己的序列号 seq=y,服务器进入 SYN_RCVD 状态。
- 第三次:客户端收到 SYN+ACK 包后,发 ACK 包,确认号 ack=y + 1,序列号 seq=x + 1,双方进入 ESTABLISHED 状态,连接建立成功。

四次挥手
- 第一次:主动关闭方发 FIN 包,含序列号 seq=u,请求关闭连接,进入 FIN_WAIT_1 状态。
- 第二次:被动关闭方收到 FIN 包后,发 ACK 包,确认号 ack=u + 1,自己的序列号 seq=v,主动关闭方进入 FIN_WAIT_2 状态,被动关闭方进入 CLOSE_WAIT 状态。
- 第三次:被动关闭方没有数据要发送时,发 FIN 包,序列号 seq=w,确认号 ack=u + 1,进入 LAST_ACK 状态。
- 第四次:主动关闭方收到 FIN 包后,发 ACK 包,确认号 ack=w + 1,序列号 seq=u + 1,进入 TIME_WAIT 状态,一段时间后进入 CLOSED 状态。被动关闭方收到 ACK 包后,也进入 CLOSED 状态。

五、C/S 模型(客户端 / 服务器模型)、B/S 模型(浏览器 / 服务器模型)和 P2P 模型(对等网络模型五
1、B/S http
C/S 标准协议 自定义协议
2、B/S 客户端通用
C/S client专用客户
3、CS 功能复杂
BS 功能简单
4、BS 资源从s到c
CS 发送必要资源
六、相关函数
1、inet_addr(const char *IP)
把点分十进制IP转化为大端的uint32
2、htons(50000)
网络转主机,转成大端
3、sockfd = socket(AF_INET,SOCK_DGRAM(数据报)|SOCK_STREAM(TCP传输控制协议),0)
提供了一个编程接口,使得不同主机上的进程能够通过网络进行通信
4、bind(sockfd,(SA)&ser,sizeof(ser))
将一个套接字(socket)与特定的 IP 地址和端口号进行绑定
5、accept(listfd, (SA)&cli, &len)
从监听套接字的已完成连接队列中取出一个连接,如果该队列中没有已完成的连接,accept 函数会进入阻塞状态,直到有新的客户端连接请求到来。一旦成功取出连接,它会返回一个新的套接字描述符,这个新套接字专门用于和对应的客户端进行数据通信,而原来的监听套接字则继续监听其他新的客户端连接请求。
6、connect(sockfd, (SA)&ser, sizeof(ser))
让客户端套接字尝试与指定的服务器地址和端口建立连接。一旦连接成功建立,客户端和服务器端之间就可以进行数据的双向传输。
相关文章:
linux学习之网络编程
一、两个模型及其对应关系 OSI七层模型 TCP/IP 四层模型 -------------------------------------------------------------------------- 应用层 表示层 ----> …...
scrol家族 offset家族 client家族学习
Scroll 系列属性 scrollTop & scrollLeft scrollTop: 返回元素的内容已向上滚动的部分的高度。scrollLeft: 返回元素的内容已向左滚动的部分的宽度。 scrollHeight & scrollWidth scrollHeight: 返回元素的实际高度,包括由于溢出而在屏幕上不可见的内容…...
css-background-color(transparent)
1.前言 在 CSS 中,background-color 属性用于设置元素的背景颜色。除了基本的颜色值(如 red、blue 等)和十六进制颜色值(如 #FF0000、#0000FF 等),还有一些特殊的属性值可以用来设置背景颜色。 2.backgrou…...
如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt
文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格,并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码(部分) 本文测试代码已上传,路径如下ÿ…...
【Samba】Ubuntu20.04 Windows 共享文件夹
【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…...
gradle和maven的区别以及怎么选择使用它们
目录 区别 1. 配置方式 2. 依赖管理 3. 构建性能 4. 灵活性和扩展性 5. 多项目构建 如何选择使用 选择 Maven 的场景 选择 Gradle 的场景 区别 1. 配置方式 Maven: 使用基于 XML 的 pom.xml 文件进行配置。所有的项目信息、依赖管理、构建插件等都在这个文…...
360大数据面试题及参考答案
数据清理有哪些方法? 数据清理是指发现并纠正数据文件中可识别的错误,包括检查数据一致性,处理无效值和缺失值等。常见的数据清理方法有以下几种: 去重处理:数据中可能存在重复的记录,这不仅会占用存储空间,还可能影响分析结果。通过对比每条记录的关键属性,若所有关键…...
Myeclipse最新版本 C1 2019.4.0
Myeclipse C1 2019.4.0下载地址:链接: https://pan.baidu.com/s/1MbOMLewvAdemoQ4FNfL9pQ 提取码: tmf6 1.1、什么是集成开发环境? ★集成开发环境讲究-站式开发,使用这个工具即可。有提示功能,有自动纠错功能。 ★集成开发环境可以让软件开…...
MySQL 9.2.0 的功能
MySQL 9.2.0 的功能 MySQL 9.2.0 的功能新增、弃用和删除内容如下: 新增功能 权限新增12:引入了CREATE_SPATIAL_REFERENCE_SYSTEM权限,拥有该权限的用户可执行CREATE SPATIAL REFERENCE SYSTEM、CREATE OR REPLACE SPATIAL REFERENCE SYSTEM…...
接口 V2 完善:分布式环境下的 WebSocket 实现与 Token 校验
🎯 本文档详细介绍了如何使用WebSocket协议优化客户端与服务端之间的通信,特别是在处理异步订单创建通知的场景中。通过引入WebSocket代替传统的HTTP请求-响应模式,实现了服务器主动向客户端推送数据的功能,极大地提高了实时性和效…...
微前端架构在前端开发中的实践与挑战
随着单页面应用(SPA)和前端框架如 React、Vue、Angular 的快速发展,现代前端应用的复杂度日益提升。尤其是当应用规模逐渐增大时,单一的代码库往往难以应对不同团队的协作和版本管理问题。为了应对这一挑战,微前端架构…...
【自学嵌入式(6)天气时钟:软硬件准备、串口模块开发】
天气时钟:软硬件准备、串口模块开发 软硬件准备接线及模块划分ESP8266开发板引脚图软件准备 串口模块编写串口介绍Serial库介绍 近期跟着网上一些教学视频,编写了一个天气时钟,本篇及往后数篇都将围绕天气时钟的制作过程展开。本文先解决硬件…...
macbook安装go语言
通过brew来安装go语言 使用brew命令时,一般都会通过brew search看看有哪些版本 brew search go执行后,返回了一堆内容,最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…...
代码随想录算法训练营第三十八天-动态规划-完全背包-322. 零钱兑换
太难了 但听了前面再听这道题感觉递推公式也不是不难理解 动规五部曲 dp[j]代表装满容量为j(也就是目标值)的背包最少物品数量递推公式:dp[j] std::min(dp[j], dp[j - coins[i]] 1)当使用coins[i]这张纸币时,要向前找到容量为…...
小阿卡纳牌
小阿卡纳牌 风:热湿 火:热干 水:冷湿 土:冷干 火风:温度相同,但是湿度不同,二人可能会在短期内十分热情,但是等待热情消退之后,会趋于平淡。 湿度相同、温度不同&#x…...
DDD 和 TDD
领域驱动设计(DDD) DDD 是一种软件开发方法,强调通过与领域专家的密切合作来构建一个反映业务逻辑的模型。其核心思想是将业务逻辑和技术实现紧密结合,以便更好地解决复杂的业务问题。 DDD 的关键概念: 1. 领域模型 …...
Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)
JDBC插入记录语法及案例 一、JDBC插入记录语法 在JDBC中,插入记录主要通过执行SQL的INSERT语句来实现。其基本语法如下: INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名:需要插入记录的表的名称。列1, 列2, …,…...
Linux文件基本操作
Linux 的设计哲学 在 Linux 中,一切皆文件! 什么是文件? 文件是具有永久存储性,按特定字节顺序组成的命名数据集 文件可分为:文本文件,二进制文件 文本文件:每个文件存放一个 ASCII 码 存储…...
React 路由导航与传参详解
随着单页面应用(SPA)已经成为主流。React 作为最流行的前端框架之一,提供了强大的路由管理工具 react-router-dom,帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的…...
C#面试常考随笔6:ArrayList和 List的主要区别?
在 C# 中,ArrayList和List<T>(泛型列表)都可用于存储一组对象。推荐优先使用List<T>,因为它具有更好的类型安全性、性能和语法简洁性,并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
