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

网络知识介绍

一、TCP

传输控制协议,Transmission Control Protocol
面向广域网的通信协议,跨域多个网络通信时,为两个通信端点之间提供一条具有如下特点的通信方式:
基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带来的带宽开销、不考虑中间网段和节点。

三次握手 : 建立连接
1)客户端发送SYN(SEQ=x)报文给服务端,进入SYN_SENT状态。
2)服务端收到SYN,回应一个SYN(SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态;
3)客户端收到服务端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态;
SYN:同步序列编号(Synchronize Sequence Numbers),TCP/IP建立连接时使用的握手信号。
ACK:确认字符(Acknowlegement character),接收端发给发送端的一种传输类控制字符。

四次挥手:终止连接
1)某个应用进程首先调用Close,称该端执行“主动关闭”。该端TCP发送一个FIN分节,表示数据发送完毕。
2)接收到这个FIN的对端执行“被动关闭”,这个FIN由TCP确认。
3)一段时间后,接收到文件结束符的应用进程将调用Close关闭它的套接字。它的TCP也发送一个FIN。/
4)接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
通常由客户端执行主动关闭,但是某些协议例如HTTP/1.0由服务端执行主动关闭。

协议规定:
1)数据分片:发送端对数据进行分片,接收端进行重组,由TCP确定分片大小并控制分片和重组;
2)到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
3)超时重发:发送发在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
4)滑动窗口:TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
5)失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
6)重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
7)数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验和有差错,TCP将丢弃这个分片,并不确认收到此报文段,导致对端超时并重发。
在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。

粘包/半包问题
发送端连续给对端发送两个及以上的数据包,对端在一次收取中可能收到的数据包大于1个,可能是几个包加上某个包的部分,或者就是几个完整的包在一起,这个叫粘包。
当然,也可能收取到的只是一个包的一部分,这个叫半包。
如何解决?
1)固定包长的数据包。比如规定每个协议包大小为64字节,每次收满64字节就取出解析,如果不够,就先存起来。这种格式简单但灵活性差。如果包内容不足指定字节数,剩余空间需要填充特殊信息,如\0;包内容超过指定字节数,又得分包分片,需要额外处理逻辑。
2)以指定字符(串)为包的结束标志。 这种协议包较常见,即字节流中遇到特殊符号值时就认为到了一个包的末尾。例如:FTP协议、发邮件的SMTP协议,一个命令或者一段数据后加上"\r\n"(即CRLF)表示一个包的结束。不足之处是如果协议数据包内容部分需要使用包结束标志字符,就需要对这些字符做转码或者转义操作,避免误解析。
3)包头+包体格式。 包头是固定大小的,且包头中必须含有一个字段来说明包体大小。如果是bodySize,对端先收取包头大小字节,如果不够先缓存直到收够为止,然后解析包头中的bodySize字段,根据包体大小来收取包体大小字节;如果是packageSize,则表示整包大小,需要用packageSize减去包头大小,就能算出包体的大小。
解包处理
在这里插入图片描述

二、UDP

用户数据报协议,User Datagram Protocol
一种无需建立连接就可以发送封装的IP数据报的方法。

丢包问题 不考虑IP层分片丢失,CRC校验包不完整
1)接收端处理时间过长 调用recv方法接收到数据后,处理数据花了一些时间,处理完后再次调用recv,在这两次调用间隔里,发过来的包可能丢失。修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
2)ARP缓存过期 ARP缓存时间约10分钟,如果缓存列表没有对方MAC地址或缓存过期,会发送请求获取MAC地址,未获取地址之前,用户发送的数据包会被内核缓存到arp_queue这个队列,默认最多缓存3个包,多余的数据包会被丢弃。
3)缓冲区过小或文件过大 如果报文很大,而缓冲区过小,则无法容纳该报文,那么报文就会丢失。增大缓冲区。
4)缓冲区满 如果socket缓冲区满了,应用未及时处理缓冲区中的包,那么后续的包会被内核丢弃,造成丢包。通过增大缓冲区来缓解丢包,但是如果服务已经过载,简单增大缓冲去并不能解决问题,反而会造成请求全部超时,服务不可用。
5)发送的包巨大 即使send方法会做大包切割成小包发送,但是包太大也不行。巨大的包需要切割为小包再逐个send。
6)发包频率太快 连续发包不sleep。虽然有时可以通过设置接收缓冲解决,但是最好还是sleep一下。
7)局域网内不丢包,公网丢包 切割小包并sleep发送,如果流量过大可能也不灵。
支持一对一、一对多、多对一、多对多交互通信。

包无序问题 在应用层实现如下功能:
1)发送:包的分片、包的确认、包的重发;
2)接收:包的调序、包的序号确认;

利用UDP实现了可靠数据传输的开源:
1)RUDP:可靠用户数据报协议,reliable UDP。提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等,在不干扰协议的实时特性的同时,允许TCP方式下的流控制行为。
2)RTP:实时传输协议,Real-time Transport Protocol。为数据提供了具有实时特性的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。如果底层网络提供组播方式,RTP可以使用该组播表传输数据到多个目的地。
3)UDT 基于UDP的数据传输协议,UDP-based Data Transfer Protocol。一种互联网数据传输协议,主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。UDT引入新的拥塞控制和数据可靠性控制机制,是面向连接的双向的应用层协议,同时支持可靠的数据流传输和部分可靠的数据报传输。也可以应用在点到点技术(P2P)、防火墙穿透、多媒体数据传输等等。

三、KCP

官方仓库
快速可靠协议,A Fast and Reliable ARQ Protocol
比TCP浪费10%-20%带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低3倍的传输效果。纯算法实现,不负责底层协议的收发,需要使用者自己定义下层数据包的发送方式,以callback方式提供给KCP,连时钟都需要外部传递进来,内部不会有任何一次系统调用。

TCP是为流量设计(每秒内可以传输多少KB数据),KCP为流速设计(单个数据包从一端发送到一端需要多少时间)。

TCPKCP对比
RTO翻倍不翻倍提高传输速度
全部重传选择性重传只重传真正丢失的数据包
-快速重传不用等超时,直接重传
延迟ACK非延迟ACK可调节是否延迟发送
UNAACK+UNA-
-非退让流控开着BT都能流畅传输

两种ARQ响应模型:UNA(此编号前所有包已收到);ACK(该编号包已收到)。

四、HTTP

超文本传输协议,Hypertext Transfer Protocol
简单的请求-响应协议,运行在TCP之上,指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出,而消息内容则具有类似MIME的格式。每个请求和响应都是独立的,服务器不会主动推送消息给客户端。

HTTP基于B/S架构进行通信,其服务器实现程序有httpd、nginx等,客户端实现程序主要是web浏览器,客户端命令行工具有elink、curl等。

请求报文格式:
请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体
应答报文格式:
状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

HTTP响应码查看

五、WebSocket

在单个TCP连接上进行全双工通信的协议,允许服务器主动向客户端推送数据。
WebSocket通过HTTP/1.1协议的101状态码握手,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

特性:
1)较少的控制开销 相对于HTTP请求每次都要携带完整的头部信息,此项开销显著减少
2)更强的实时性 相对于HTTP请求需要客户端发起服务器才能响应,延迟明显更少
3)保持连接状态 需要先创建连接,使其成为一种有状态的协议,之后通信可以省略部分状态信息,而HTTP请求可能需要每次都携带状态信息,如:身份认证
4)更好的二进制支持 定义了二进制帧,更轻松处理二进制内容
5)可以支持扩展 用户可以扩展协议,实现部分自定义的子协议,如:部分浏览器支持压缩等
6)更好的压缩效果 相对HTTP压缩,WebSocket在适当扩展支持下,可以沿用之前内容的上下文,传递类似数据时,显著提高压缩率

六、RPC

远程过程调用,Remote Procedure Call
进程间通信(IPC)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术,有两种类型的进程间通信:
1)LPC(本地过程调用)
2)RPC(远程过程调用)

通过IPC和RPC,程序能利用其他程序或计算机处理的进程。客户机执行自己的任务,但靠服务器提供后端文件服务。RPC为客户机提供向后端服务器申请服务的通信机制。

RPC应用场景:
1)分布式操作系统的进程间通讯
2)构造分布式计算的软件环境
3)远程数据库服务
4)分布式应用程序设计
5)分布式程序的调试

相关文章:

网络知识介绍

一、TCP 传输控制协议,Transmission Control Protocol。 面向广域网的通信协议,跨域多个网络通信时,为两个通信端点之间提供一条具有如下特点的通信方式: 基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带…...

MapStruct设置全局的ComponentModel

在mapStruct上边,如果我们要切换成非默认的组件模式,常常要在Mapper注释中添加componentModel "spring",如果类太多的了的话,非常麻烦,有没有更好的方式呢,有的,可以在pom中添加一个…...

LinearAlgebraMIT_6_ColumnSpaceAndNullSpace

这节课的两个重点是column space列空间和null space零空间。 x.1 pre-multiply/left multiply and post-multiply/right multiply 对于pre-multiply/left multiply左乘和post-multiply/right multiply右乘,如果用英文的pre-和post-是比较容易理解的, A…...

出版物经营许可办理 出版物许可地址变更 出版物零售延期

一、出版物零售单位设立所需材料 1、申请书 2、营业执照 3、租赁合同 4、主要负责人身 份证 5、出版物经营许可申请表 二、办理出版物经营许可证所要符合的条件 1、有确定的企业名称和经营范围; 2、有出版物业务的经营场地; 3、有出版物业务的组织机构和发行人员。 三、…...

【LeetCode每日一题】——807.保持城市天际线

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 中等 三【题目编号】 1572.矩阵对角线元素的和 四【题目描述】 给你一…...

JavaScript--Date(日期)对象

介绍和说明 创建一个Date对象并获取当前日期和时间: 使用new Date()语句可以创建一个表示当前日期和时间的Date对象。它将使用客户端设备上的当前日期和时间。例如:const currentDate new Date(); 获取特定日期的年、月、日、小时、分钟、秒&#xff1…...

一文讲清多线程与多线程同步

1 多线程 1.1 线程的概念 十多年前,主流观点主张在可能的情况下优先选择多进程而非多线程,如今,多线程编程已经成为编程领域的事实标准。多线程技术在很大程度上改善了程序的性能和响应能力,使其能够更加高效地利用系统资源&…...

《Java-SE-第二十六章》之线程池

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…...

【数据库】将excel数据导入mysql数据库

环境:Windows10 mysql8以上 将你要导入的excel表另存为txt格式 打开txt格式文件,删除表头行并另存为并更改编码方式(由于与数据库的编码不同,会导致导入报错) 通过命令行登录数据库 winr cmd进入 进入装mysql的目录位…...

无涯教程-Lua - repeat...until 语句函数

与 for 和 while 循环(它们在循环顶部测试循环条件)不同,Lua编程中的 repeat ... until 循环语言在循环的底部检查其条件。 repeat ... until 循环与while循环相似,不同之处在于,保证do ... while循环至少执行一次。 repeat...until loop - …...

环形链表 LeetCode热题100

题目 给你一个链表的头节点 head ,判断链表中是否有环。 思路 快慢指针。开始快指针在慢指针前面,当快指针等于慢指针时说明有环,如果快指针指向null时说明无环。 代码 /*** Definition for singly-linked list.* struct ListNode {* …...

使用python将每组两行数据合并一行

1、使用场景 将有规律的每组(一组2行)的单数行和双数行合并为一行,以空格分割。 比如使用pssh批量得出的结果,想让ip行和结果行合并为一行(前提如上所述) [rootk8s-master1 tmp]# pssh -h iplist -i hostname [1] 18:12:42 [SU…...

14-1_Qt 5.9 C++开发指南_网络编程及主机信息查询_HostInfo

Qt 网络模块提供了用于编写 TCP/IP 客户端和服务器端程序的各种类,如用于 TCP 通信的QTcpSocket 和 QTcpServer,用于 UDP 通信的 QUdpSocket,还有用于实现 HTTP、FTP 等普通网络协议的高级类如 QNetworkRequest,QNetworkReply 和Q…...

【iOS】通知原理

我们可以通过看通知的实现机制来了解通知中心是怎么实现对观察者的引用的。由于苹果对Foundation源码是不开源的,我们具体就参考一下GNUStep的源码实现。GNUStep的源码地址为:GNUStep源码GitHub下载地址, 具体源码可以进行查看。 通知的主要流程 通知全…...

创建邮件服务器(小微企业)

这里写自定义目录标题 目的硬件选型:软件选型:coremail (商业版本)postfixumail免费开源版本新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适…...

android app控制ros机器人四(调整界面布局)

半吊子改安卓,记录页面布局调整: 在ros-mobile基础上顶端增加一行,用于显示app名称和logo图像;修改标签页。 添加文字简单,但是替换图标长知识了,开始只是简单的把mipmap各个文件夹下的图片进行替换&…...

稍微深度踩坑haystack + whoosh + jieba

说到django的全文检索,网上基本推荐的都是 haystack whoosh jieba 的方案。 由于我的需求对搜索时间敏感度较低,但是要求不能有数据的错漏。 但是没有调试的情况下,搜索质量真的很差,搞得我都想直接用Like搜索数据库算了。 但是…...

微信小程序(van-tabs) 去除横向滚动条样式(附加源码解决方案+报错图)

问题描述 今天第一次接触vant组件库。 ant官网地址适用于Vue3 支持Vue2、Vue3、微信小程序等 我在使用van-tabs组件时遇到了一个问题,如下图所示: 从图片上可以看到有个灰色的横向滚动条,一开始领导给我说这个问题,我反反复复都…...

激光切割机所发出的辐射是否会对人体产生危害呢

激光切割设备所发出的激光作为一种特殊的能量光源,在一定程度上是存在辐射的。由于光纤激光器的功率通常大于半导体激光器,因此其辐射安全性也受到我们的关注。那么这种辐射的危害究竟有多大呢? 第一级:在正常操作下,不会发出对人…...

Redis 高可用:主从复制、哨兵模式、集群模式

文章目录 一、redis高可用性概述二、主从复制2.1 主从复制2.2 数据同步的方式2.2.1 全量数据同步2.2.2 增量数据同步 2.3 实现原理2.3.1 服务器 RUN ID2.3.2 复制偏移量 offset2.3.3 环形缓冲区 三、哨兵模式3.1 原理3.2 配置3.3 流程3.4 使用3.5 缺点 四、cluster集群4.1 原理…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...