网络知识介绍

news2024/11/15 19:24:30

一、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)分布式程序的调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/823630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二十三种设计模式第二十三篇--状态模式

状态模式,是一种行为模式,在软件开发过程中,对象按照不同的情况做出不同的行为,我们把这样的对象称为具有状态的对象,而把影响对象行为的一个或者多个动态变化的属性称为状态。 对这种具有状态的对象变成,…

《Java面向对象程序设计》学习笔记——第 1 章 Java入门

专栏:《Java面向对象程序设计》学习笔记

第28天-Kubernetes架构,集群部署,Ingress,项目部署,Dashboard

1.K8S集群部署 1.1.k8s快速入门 1.1.1.简介 Kubernetes简称k8s,是用于自动部署,扩展和管理容器化应用程序的开源系统。 中文官网:https://kubernetes.io/zh/中文社区:https://www.kubernetes.org.cn/官方文档:https…

git管理工具学习(图解使用git工作流程)

目录 GIT 简介一个最简单的GIT操作流程git的工作流程&命令 GIT 简介 git是什么,在维基百科上是这么介绍的:git是一个分布式的版本控制软件 分布式是相对于集中式而言的,分布式即每一个git库都是一个完整的库。 每个库的地位都是平等的&am…

STM32存储左右互搏 I2C总线读写EEPROM ZD24C1MA

STM32存储左右互搏 I2C总线读写EEPROM ZD24C1MA 在较低容量存储领域,EEPROM是常用的存储介质,不同容量的EEPROM的地址对应位数不同,在发送字节的格式上有所区别。EEPROM是非快速访问存储,因为EEPROM按页进行组织,在连…

c 语言解析 时间字符串

#include <iostream> #include <ctime>int main(int argc, char *argv[]) {struct tm timeinfo;char cur_time[] "current time: 2021-09-06 23:50:13";// 解析时间到timeinfo中strptime(cur_time, "current time: %Y-%m-%d %H:%M:%S", &…

数据库管理员知识图谱

初入职场的程序猿&#xff0c;需要为自己做好职业规划&#xff0c;在职场的赛道上&#xff0c;需要保持学习&#xff0c;并不断点亮自己的技能树。  成为一名DBA需要掌握什么技能呢&#xff0c;先让Chat-GPT为我们回答一下&#xff1a; 数据库管理系统 (DBMS)知识&#xff…

加强Web应用程序安全:防止SQL注入

数据库在Web应用程序中存储和组织数据时起着至关重要的作用&#xff0c;它是存储用户信息、内容和其他应用程序数据的中央存储库。而数据库实现了高效的数据检索、操作和管理&#xff0c;使Web应用程序能够向用户提供动态和个性化的内容。然而&#xff0c;数据库和网络应用程序…

微信小程序原生写法传递参数

微信小程序原生写法传递参数 data-xxx 自定义参数名 &#xff0c;接收参数&#xff1a;方法&#xff08;变量名&#xff09; checkVip:function(event) {let that thisconsole.log(event,event)console.log(event.currentTarget.dataset.idx,index)let index Number(eve…

SpringBoot复习:(13)Banner是怎么打印出来的?

SpringApplication的run方法代码&#xff1a; public ConfigurableApplicationContext run(String... args) {long startTime System.nanoTime();DefaultBootstrapContext bootstrapContext createBootstrapContext();ConfigurableApplicationContext context null;configur…

<C++> 三、内存管理

1.C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";const char *pChar3 "abcd";int *ptr1…

重学C++系列之异常

一、什么是异常 异常一般是指程序运行期发生的非正常情况。异常一般是不可预测的&#xff0c;如&#xff1a;内存不足&#xff0c;打开文件失败&#xff0c;数组越界&#xff0c;范围溢出等。 在某段程序发生无法继续正常执行的情况时&#xff0c;C允许程序进行所谓抛出异常&am…

实现Feed流的三种模式:拉模式、推模式和推拉结合模式

在互联网产品中&#xff0c;Feed流是一种常见的功能&#xff0c;它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式&#xff0c;包括拉模式、推模式和推拉结合模式。在本文中&#xff0c;我们将详细介绍这三种模式&#xff0c;并通过Java代码示例来实现…

0801|IO进程线程day4(文件IO函数)

作业1&#xff1a;从终端获取一个文件的路径以及名字 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 以下代码只能跑本目录…

IDEA中修改类头的文档注释信息

IDEA中修改类头的文档注释信息 选择File--Settings--Editor--File and Code Templates--Includes&#xff0c;可以把文档注释写成这种的 /**author: Arbicoralcreate: ${YEAR}-${MONTH}-${DAY} ${TIME}Description: */这样回看就可以很清楚的看到自己创建脚本的时间&#xff…

Vue2 第十三节 使用Vue脚手架(一)

1.初始化脚手架 2.分析脚手架结构 3.修改默认配置 一.初始化脚手架 1.Vue脚手架式Vue官方提供的标准化开发工具 2.具体步骤 ① 如果下载缓慢&#xff0c;需要配置npm淘宝镜像 npm config set registry http://registry.npm.taobao.org ② 全局安装: npm install -g vu…

Jenkins配置流水线

一、新建任务 这个任务名称将会是Jenkins的workspace路径下的一个目录&#xff0c;如我建立了一个test任务&#xff0c;那么Jenkins会生成一个/jenkins_home/workspace/test目录&#xff0c;用来拉取代码编译等。所以请谨慎设置任务名称。

直线模组如何进行精度校准?

直线模组是一种高精度的传动元件&#xff0c;而精度是直线模组的重要指标&#xff0c;在直线模组的使用中&#xff0c;我们应该尽可能的避免直线模组的精度受损&#xff0c;这样才能够有真正的发挥出直线模组的稳定性。 直线模组的精度一般是指重复定位精度和导向精度&#xff…

puppeteer监听response并封装为express服务调用

const express require(express); const puppeteer require(puppeteer); const app express(); let browser; // 声明一个全局变量来存储浏览器实例app.get(/getInfo, async (req, res) > {try {const page_param req.query.page; // 获取名为"page"的查询参数…

汉王人脸考勤管理系统SQL注入RCE

忘掉&#xff01;忘掉温暖&#xff0c;忘掉温柔&#xff0c;忘掉一切享乐&#xff0c;而把饥饿、寒冷、受辱、受苦当做自己的正常生活 漏洞描述 汉王人脸考勤管理系统存在SQL注入漏洞&#xff0c;攻击者可利用该漏洞获取数据库敏感信息并Getshell。 漏洞复现 访问漏洞url&a…