自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(248)
  • 收藏
  • 关注

原创 HTTP性能优化

HTTP性能优化HTTP性能优化主要有以下几个重点:启用长连接。TCP 和 SSL 建立新连接的成本是非常高的,有可能会占到客户端总延迟的一半以上。长连接虽然不能优化连接握手,但可以把成本“均摊”到多次请求里,这样只有第一次请求会有延迟,之后的请求就不会有连接延迟,总体的延迟也就降低了。在现代操作系统上启用 TCP 的新特性“TCP Fast Open”(Win10、iOS9、Linux 4.1),它的效果类似 TLS 的“False Start”,可以在初次握手的时候就传输数据,也就是 0-

2022-05-01 22:31:04 1287

原创 TLS连接

TLS连接在TCP三次握手后,TLS握手要经历2个RTT:客户端:​ Client Hello​ - 随机数C,客户端的TLS版本号,密码套件列表,扩展列表服务器:​ Server Hello​ - 随机数S,确认TLS版本号和使用的密码套件(ECDHE)​ - 服务器使用的证书(Server Certificate)​ - Server Key Exchange 密钥交换算法参数(ECDHE),签名认证第二个RTT:客户端:​ - Client Key Exchange

2022-05-01 22:30:23 1693

原创 HTTPS -- TLS

TLSTLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学技术。机密性即对数据的保密,实现机密性的手段即是加密。主要用的算法可分为对称加密和非对称加密。对称加密指加密和解密时使用的密钥都是同一个,是“对称”的。TLS 里有非常多的对称加密算法可供选择,比如 RC4、DES、3DES、AES、ChaCha20 等,但前三种算法都被认为是不安全的,通常都禁止使用,目前常用的只有 AES 和 ChaCha20。AES

2022-05-01 22:24:13 473

原创 HTTP 内容协商

HTTP 内容协商HTTP报文的结构是 “header+body” 。body数据在到达后,必须要告诉上层应用这是什么数据,即必须有内容协商(字段)。对于告知对端所传输的数据类型的功能,早在 HTTP 协议诞生之前就已经有了针对这种问题的解决方案,不过它是用在电子邮件系统里的,让电子邮件可以发送 ASCII 码以外的任意数据,方案的名字叫做“多用途互联网邮件扩展”(Multipurpose Internet Mail Extensions),简称为 MIME。HTTP 采用MIME type 来标记B

2022-05-01 22:19:41 347

原创 TCP SYN报文什么情况下会被丢弃?

TCP SYN报文什么情况下会被丢弃?SYN 报文被丢弃的两种场景:开启 tcp_tw_recycle 参数,并且在 NAT 环境下,造成 SYN 报文被丢弃accpet 队列满了,造成 SYN 报文被丢弃tcp_tw_recycle我们知道对于TIME_WAIT状态,Linux 操作系统提供了两个可以系统参数来快速回收处于 TIME_WAIT 状态的连接,这两个参数都是默认关闭的:net.ipv4.tcp_tw_reuse,如果开启该选项的话,客户端(连接发起方) 在调用 connec

2022-05-01 22:19:05 768

原创 视频编码原理

视频编码原理视频编码是对一帧帧图像来进行的。一般我们所熟知的彩色图像的格式是 RGB 的,即用红绿蓝三个分量的组合来表示所有颜色。但是,RGB 三个颜色是有相关性的,为了去掉这个相关性,减少需要编码的信息量,我们通常会把 RGB 转换成 YUV,也就是 1 个亮度分量和 2 个色度分量。另外,人眼对于亮度信息更加敏感,而对于色度信息稍弱,所以视频编码是将 Y 分量和 UV 分量分开来编码的。而对于每一帧图像,又是划分成一个个块来进行编码的,这一个个块在 H264 中叫做宏块,而在 VP9、AV1 中称之

2022-05-01 21:56:44 1864

原创 区域和检索——数组不可变

区域和检索——数组不可变给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right实现 NumArray 类:NumArray(int[] nums) 使用数组 nums 初始化对象int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 num

2022-05-01 20:48:40 256

原创 HTTP连接管理

HTTP常见状态码:状态码 原因短语 含义100 Continue 说明收到了请求的初始部分,请客户端继续,发送了这个状态码之后,服务器在收到请求之后必须进行响应。101 Switching Protocols 说明服务器正在根据客户端的指定,将协议切换成Update首部所列的协议200 OK 请求没问题,实体的主体部分包含了所请求的资源201 Created 用于创建服务器对象的请求(比如,PUT)。响应的实体主体

2022-05-01 20:42:24 195

原创 滑动窗口最大值

滑动窗口最大值给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7

2022-04-30 14:15:05 92

原创 单调栈——每日温度

每日温度请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例 1:输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]class Solution {public: vector<int> dailyTemperatures(vector<int>& temperatures

2022-04-30 14:14:38 556

原创 下一个更大元素II

下一个更大元素II给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。与下一个更大元素相似,现在给定的数组是个环

2022-04-30 14:13:39 91

原创 下一个更大元素

下一个更大元素nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是

2022-04-30 14:12:53 306

原创 数据流的中位数

数据流的中位数中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1)addNum(2)findMedian() -> 1.5addNum(3) fin

2022-04-30 14:12:12 145

原创 最大频率栈

最大频率栈设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。实现 FreqStack 类:FreqStack() 构造一个空的堆栈。void push(int val) 将一个整数 val 压入栈顶。int pop() 删除并返回堆栈中出现频率最高的元素。如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。class FreqStack {public: FreqStack() { } void p

2022-04-30 14:11:41 295

原创 Linux 系统监测 —— sysstat

Linux 系统监测 —— sysstatsysstat 是Linux系统服务器中常用的软件工具包,可以用来监控服务器的性能。主要包含的工具:iostat 工具提供CPU使用率及硬盘吞吐效率的数据; #比较核心的工具mpstat 工具提供单个处理器或多个处理器相关数据;pidstat: 关于运行中的进程/任务、CPU、内存等的统计信息sar 工具负责收集、报告并存储系统活跃的信息; #统计数据的核心工具sa1 工具负责收集并存储每天系统动态信息到一个二进制的文件中。它是通过计划任务工具cro

2022-04-30 14:11:03 990

原创 性能监控与优化

性能优化——CPU性能指标:吞吐、延时(应用负载视角)CPU、内存(资源视角)性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利用系统资源处理更多的请求。这包含了一系列的步骤,比如下面这六个步骤:选择指标评估应用程序和系统的性能;为应用程序和系统设置性能目标;进行性能基准测试;性能分析定位瓶颈;优化系统和应用程序;性能监控和告警。性能工具图谱:平均负载平均负载是指单位时间内,系统处于可运行状态(R 状态)和不可中断状态(D 状态)的平均进程数

2022-04-30 11:15:56 431

原创 数据结构&算法——二叉搜索树

数据结构&算法——二叉搜索树BST 的特性:1、对于 BST 的每一个节点 node,左子树节点的值都比 node 的值要小,右子树节点的值都比 node 的值大。2、对于 BST 的每一个节点 node,它的左侧子树和右侧子树都是 BST。整体上BST也是基于递归的思想和方法,但额外的特性是中序遍历即有序二叉搜索树中第K小的元素给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。/** * Definitio

2022-04-30 11:09:57 452

原创 数据结构&算法——二叉树

数据结构&算法——二叉树很多经典算法都是二叉树的变形。比如说快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历。快速排序的逻辑是,若要对 nums[lo..hi] 进行排序,我们先找一个分界点 p,通过交换元素使得 nums[lo..p-1] 都小于等于 nums[p],且 nums[p+1..hi] 都大于 nums[p],然后递归地去 nums[lo..p-1] 和 nums[p+1..hi] 中寻找新的分界点,最后整个数组就被排序了。快速排序的算法框架:void sort(

2022-04-30 11:09:24 223

原创 利用destructors 避免泄漏资源

利用destructors 避免泄漏资源某些场景下,我们需要用指针来操控局部性资源,例如:class dataHeader;void process(istream& data){ while(data) { dataHeader* = readData(data); dataHeader->processHeader(); delete dataHeader; }}就如上面的代码段,在 process() 函数中,读取data 的header 并且处理消息头,

2022-04-30 11:01:52 142

原创 operator new & operator delete

operator new & operator deletenew operator 和 operator new对于如下代码:string *ps = new string("string construct");代码中使用的new 即为 new operator,这个操作符是由语言内建的,类似sizeof ,不能被改变意义(重载)。不能改变其行为。我们知道 new operator 主要做了两件事:分配足够的内存,用来放置某类型的对象。调用一个constructor,为刚才分配

2022-04-30 11:01:24 132

原创 Protobuf如何提升编码效率

Protobuf如何提升编码效率Protobuf作为网络传输常用的编解码工具,面向多种平台,支持多种语言。使用 Protobuf 编码消息速度很快,消耗的 CPU 计算力也不多,而且编码后的字符流体积远远小于 JSON 等格式,能够大量节约带宽。那protobuf是如何提升编码效率的呢?具体的优化设计有以下几方面:减少编码字段名使用的空间通常消息由多个名、值对组成,对于字段名,Protobuf主要采用了映射表的方法。主要有两种:静态表。在HTTP请求中,对于多达几十字节的 HTTP 头部,HTT

2022-04-30 11:00:31 1051

原创 调整拥塞控制的性能

调整拥塞控制的性能我们都知道经典的拥塞控制算法会经过慢启动、拥塞避免、快速重传、快速恢复等流程,那拥塞控制的性能受哪些因素的影响呢?慢启动阶段理论上,对于TCP流量控制,只要接收方的读缓冲区足够大,就可以通过报文中的接收窗口,要求对方更快地发送数据。网络的传输速度是有限的,它会直接丢弃超过其处理能力的报文。如果网络中的每个连接都按照接收窗口尽可能地发送更多的报文时,就会形成恶性循环,最终超高的网络丢包率会使得每个连接都无法发送数据。所以需要另一种对网络传输速率进行控制的机制,即拥塞控制。首先TCP连

2022-04-30 10:48:54 218

原创 在栈/堆上生成对象

在栈/堆上生成对象c++中,有时我们希望某种类型的对象有“自我析构”的能力,即能够"delete this",这样就要求该类型的对象被分配于堆中。另外还可能在某些场景下必须保证某一类型绝不会发生内存泄漏,即需要没有任何一个该类型的对象从堆中分配出来。在堆中生成对象我们知道非堆对象会在其定义点自动构造,并在其寿命结束时自动析构,所以要保证对象在堆中生成,只要让那些被隐式调用的构造函数和析构函数不合法就可以了。更具体来说,最直接的方法是将构造函数和析构函数都声明为private,但由于一个类可能有许多个

2022-04-30 10:47:36 164

原创 内存池——TCMalloc&JEMalloc

内存池——TCMalloc&JEMalloc在应用层业务代码与内核之间,一般有两层内存池:应用层内存池和C库内存池。当代码申请内存时,首先会到达应用层内存池,如果应用层内存池有足够的可用内存,就会直接返回给业务代码,否则,它会向更底层的 C 库内存池申请内存。比如,如果我们在Apache、Nginx 等服务之上做模块开发,这些服务中就有独立的内存池。C库内存池主要有Google 的 TCMalloc 和 FaceBook 的 JEMalloc,当C库内存池无法满足内存申请时,才会向操作系统申

2022-04-30 10:45:10 989

原创 调整TCP缓冲区

调整TCP缓冲区TCP 连接是由内核维护的,内核为每个连接建立的内存缓冲区,为网络传输服务,也要充当进程与网络间的缓冲桥梁。如果连接的内存配置过小,就无法充分使用网络带宽,TCP 传输速度就会很慢;如果连接的内存配置过大,那么服务器内存会很快用尽,新连接就无法建立成功。本文就对Linux TCP缓冲区的机制及调整方法进行分析。滑动窗口是如何影响传输速度的?我们知道TCP提供了可靠的传输,主要的机制就是在报文发出后,必须收到接收方返回的 ACK 确认报文,如果在RTO内还没收到,就会重新发送这个报文。由

2022-04-30 10:42:01 4521

原创 二叉树中的最大路径和

二叉树中的最大路径和路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr

2022-04-30 10:40:10 266

原创 音视频基础

音视频基础音视频录制原理由麦克风、摄像头采集的帧由编码器进行编码压缩,按一定格式写入某种封装格式。时钟:为了控制音视频同步,需要统一个的时间源。音视频播放原理视频主要概念视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。视频帧率:fps,通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧。帧率越高,给人的视觉就越流畅。视频分辨率:分辨率就是我们常说的640x480分辨率、1920x1080分辨率,

2022-04-30 10:38:27 303

原创 Linux性能优化——DNS解析

Linux性能优化——DNS解析在TCP/IP不同协议层我们所关注的网络性能指标不同,在应用层,我们关注的是应用程序的并发连接数、每秒请求数、处理延迟、错误数等,可以使用 wrk、JMeter 等工具,模拟用户的负载,得到想要的测试结果。而在传输层,我们关注的是 TCP、UDP 等传输层协议的工作状况,比如 TCP 连接数、TCP 重传、TCP 错误数等。此时可以使用 iperf、netperf 等,来测试 TCP 或 UDP 的性能。再向下到网络层,我们关注的则是网络包的处理能力,即 PPS。Linux

2022-04-30 10:31:04 685

原创 Linux网络性能优化

Linux网络性能优化我们知道,Linux 网络根据 TCP/IP 模型,构建其网络协议栈。TCP/IP 模型由应用层、传输层、网络层、网络接口层等四层组成。而本文将对Linux网络相关性能观测及优化进行分析。性能指标我们常用的衡量网络性能的指标有带宽、吞吐量、延时、PPS(Packet Per Second)等带宽,表示链路的最大传输速率,单位通常为b/s(比特/秒)吞吐量,表示单位时间内成功传输的数据量,单位通常为b/s(比特/秒)或者B/s(字节/秒)。吞吐量受带宽限制,而吞吐量/带宽即该

2021-10-08 00:30:17 657

原创 页映射与可执行文件的装载

页映射与可执行文件的装载我们知道可执行文件只有装载到内存之后才能被CPU处理执行,早期的程序装载十分简陋,装载的基本过程就是把程序从外部存储器中读取到内存中的某个位置。随着现代虚拟地址空间及MMU的发展,在多进程、多用户、虚拟存储的操作系统下,可执行文件的装载变得更复杂了。进程的虚拟地址空间每个程序被运行起来后,它将拥有自己独立的虚拟地址空间。这个虚拟地址空间的大小由计算机硬件平台决定,CPU的寻址范围决定了地址空间的理论上限。32位硬件平台决定了虚拟空间的地址为0到2^32-1,即4G虚拟空间大小。

2021-10-08 00:28:40 277

原创 OS--虚拟内存

虚拟内存计算机物理内存的大小是固定的,就是计算机主板内存槽上的实际物理内存,cpu可以直接进行寻址,物理内存的容量是固定的,但是寻址的空间取决于cpu地址线的数量。在32位系统上,线性地址空间可达4G(2^32);这4G一般是按照3:1的比例进行分配,用户进程享有3G的空间,而内核独自享有剩下的1G内存最早的时候,计算机还没有虚拟机制,程序指令所访问的内存地址就是物理内存地址,所以就要将所有程序都加载到内存中,但是我们实际的物理内存只有4G。所以就会出现一些问题:当多个程序需要运行时,必须保证这些程

2021-10-08 00:27:44 137

原创 Valgrind

Valgrind体系结构Valgrind 是一套 Linux 下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个 CPU 环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind 的体系结构如下图所示:Valgrind 包括如下一些工具:Memcheck。这是 valgrind 应用最广泛的工具,

2021-10-08 00:25:27 101

原创 c++ 内存管理 —— delete释放内存的时效性

c++ 内存管理 —— delete释放内存的时效性delete释放之后,内容是立即回收的吗?#include <iostream>using namespace std;int main(){int *map; int i=10; while(i--) { map=new int[20]; map[i]=i; cout << map[i]<<endl;//1 delete [] map; co

2021-10-08 00:16:59 1621

原创 TCP数据流与窗口管理

TCP数据流与窗口管理TCP是基于流的数据传输协议,本文主要对TCP的动态数据传输进行分析,即流量控制及窗口管理。TCP通过动态调节窗口大小来控制发送端的操作,确保接收端不会溢出。当然,流量控制的思想也可扩展应用于其他问题,可以保护接收端免于溢出,还可以处理中间传输网络的拥塞问题。交互式通信我们知道交互式TCP连接需要在客户端和服务器之间传输用户输入信息,交互式数据一般会比较小,可能就只有几十字节。ssh就会产生这样的较小的报文数据,对一个ssh连接,当我们输入一个交互命令后,每个交互按键通常都会生

2021-10-08 00:14:34 457

原创 TCP超时与重传

TCP超时与重传本文主要分析TCP传输的效率与性能。由于IP层不保证传输的可靠性,可能出现丢失、重复或失序丢包等情况,TCP协议提供可靠数据传输,为保证数据传输的正确性,TCP重传其认为已丢失的包。TCP拥有两套独立机制来完成重传,一是基于时间,二是基于确认信息的构成。第二种方法通常比第一种更高效。对于基于时间的重传:TCP在发送数据时会设置一个计时器,若至计时器超时仍未收到数据确认信息,则会引发相应的超时(基于计时器的)重传操作,计时器超时被称为重传超时(RTO)。另一种方式的重传称为快速重传,通

2021-10-08 00:12:05 2349

原创 TCP连接队列

TCP连接队列通常情况下,一个并行的服务器会为每一个客户端分片一个新的进程或线程,并准备着处理下一个到来的连接请求,然而,在侦听服务器繁忙处理连接请求,或者被伪造的连接请求攻击时,TCP应当是如何处理的呢?连接的两种状态在被用于应用程序之前新的连接可能会处于下述两个状态:1.连接尚未完成但是已经接收到SYN(即处于SYN_RCVD状态)。2.连接已经完成了三次握手并且处于ESTABLISHED状态,但还未被应用程序接受。linux对连接的限制现代Linux内核中,使用连接队列来限制完全形成的等

2021-10-07 23:02:28 397

原创 TCP重置报文段(RST)

TCP重置报文段(RST)通常当发现一个到达的报文段对于相关连接而言是不正确的时,TCP就会发送一个重置报文段。总体上来说,重置报文段主要有以下几种场景:1.针对不存端口的连接请求当一个连接请求到达本地却没有相关进程在目的端口侦听时就会产生一个重置报文段。2.终止一条连接通常终止一条连接的正常方法是由通信一方发送一个FIN。这种方法有时也被称为有序释放。(因为FIN是在之前所有排队数据都已经发送后才被发送出去,通常不会出现丢失数据的情况)而在任何时刻,我们都可以通过发送一个重置报文段RST替代F

2021-10-07 23:02:02 6140

原创 TCP连接管理

TCP连接管理TCP作为一种面向连接的单播协议,比 UDP复杂得多,必须在检测并修补所有在IP层(或下面的层)产生的数据传输问题,比如丢包、重复以及错误,以及连接何时建立、正常地终止等问题。即TCP需要对连接状态进行管理。TCP连接的建立与终止一个TCP连接由一个4元组组成:本端IP、本端端口号、对端IP、对端端口号。一个典型的TCP连接的建立与关闭过程是通过三次握手与四次挥手完成的:连接建立的主要步骤有:1.主动连接方(客户端)发送一个SYN报文(Synchronize,同步标志),并指明自

2021-10-07 23:01:05 823

原创 TCP半关闭

TCP半关闭建立一个TCP连接需要三次握手,而关闭一个TCP连接需要四次挥手,我们知道三次握手因为被动开启连接方的ACK与SYN优化为一个报文发送,那么为什么关闭连接的挥手需要四次而不是三次呢?原因就是本文的主题:TCP的半关闭状态。我们知道TCP是一个全双工的连接,任何一方都可以发送数据接收数据,并且都可以发起关闭连接请求,除此之外TCP还支持半关闭操作,即仅关闭一个数据流的一个传输方向,而两个半关闭操作合在一起就能够关闭整个连接,TCP协议规定:通信的任何一方在完成数据发送任务后都能够发送一个FIN

2021-10-07 22:59:10 1482

原创 TCP 传输控制协议

TCP 传输控制协议传输层中最重要的两个协议是TCP和UDP,也是我们接触最多且熟悉的,本文将对TCP协议做一个概括性分析。TCP与UDP的区别我们都知道 IP 包是没有任何可靠性保证的,一旦发出去,不论是否丢失都只能随它去。在IP层之上,UDP作为一种简单、高效的协议继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。但是TCP(Transmission Control Protocol, 传输控制协议)作为一种可靠的,面向连接、基于字节流的协议,在可靠通信的实现方面提供了许多有效的机制。TC

2021-10-07 22:58:34 115

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除