自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TCP面试问题

等再次收到前面被网络延迟的数据包时,会判断乱序队列有没有数据,然后会检测乱序队列中是否有可用的数据,如果能在乱序队列中找到与当前报文的序列号保持的顺序的报文,就会看该报文是否有 FIN 标志,如果发现有 FIN 标志,这时才会进入 TIME_WAIT 状态。所以,即使没有开启 TCP keepalive,且双方也没有数据交互的情况下,如果其中一方的进程发生了崩溃,这个过程操作系统是可以感知的到的,于是就会发送 FIN 报文给对方,然后与对方进行 TCP 四次挥手。所以,我们可以得知一个点。

2023-10-16 16:08:11 133

原创 TCP如何优化

当服务端 SYN 半连接队列溢出后,会导致后续连接被丢弃,可以通过 netstat -s 观察半连接队列溢出的情况,如果 SYN 半连接队列溢出情况比较严重,可以通过 tcp_max_syn_backlog、somaxconn、backlog 参数来调整 SYN 半连接队列的大小。可是,默认的滑动窗口最大值只有 64 KB,不满足当今的高速网络的要求,要想提升发送速度必须提升滑动窗口的上限,在 Linux 下是通过设置 tcp_window_scaling 为 1 做到的,此时最大值可高达 1GB。

2023-10-15 19:45:25 182

原创 RPC和WebSocket

既然有 HTTP 协议,为什么还要有 RPC纯裸 TCP 是能收发数据,但它是个无边界的数据流,上层需要定义消息格式用于定义消息边界。于是就有了各种协议,HTTP 和各类 RPC 协议就是在 TCP 之上定义的应用层协议。RPC 本质上不算是协议,而是一种调用方式,而像 gRPC 和 Thrift 这样的具体实现,才是协议,它们是实现了 RPC 调用的协议。目的是希望程序员能像调用本地方法那样去调用远端的服务方法。同时 RPC 有很多种实现方式,不一定非得基于 TCP 协议。从发展历史来说,HTTP

2023-10-13 15:40:20 261 1

原创 3.7 HTTP3 强势来袭

队头阻塞,HTTP/2 多个请求跑在一个 TCP 连接中,如果序列号较低的 TCP 段在网络传输中丢失了,即使序列号较高的 TCP 段已经被接收了,应用层也无法从内核中读取到这部分数据,从 HTTP 视角看,就是多个请求被阻塞了;TCP 和 TLS 握手时延,TCP 三次握手和 TLS 四次握手,共有 3-RTT 的时延;

2023-10-12 16:44:28 405

原创 3.6 HTTP/2提升性能的几个方向

HTTP/2 通过 Stream 的并发能力,解决了 HTTP/1 队头阻塞的问题,看似很完美了,但是 HTTP/2 还是存在“队头阻塞”的问题,只不过问题不是在 HTTP 这一层面,而是在 TCP 这一层。不过,动态表并非可以无限增大, 因为动态表是会占用内存的,动态表越大,内存也越大,容易影响服务器总体的并发能力,因此服务器需要限制 HTTP/2 连接时长或者请求次数。有没有什么解决方案呢?的方式,将体积压缩了近一半,而且针对后续的请求头部,还可以建立。第一点,对于常见的 HTTP 头部通过。

2023-10-12 16:22:51 144

原创 3.5 HTTPS 如何优化

对于软件优化的方向,如果可以,把软件升级成较新的版本,比如将 Linux 内核 2.X 升级成 4.X,将 openssl 1.0.1 升级到 1.1.1,因为新版本的软件不仅会提供新的特性,而且还会修复老版本的问题。这些会话重用技术虽然好用,但是存在一定的安全风险,它们不仅不具备前向安全,而且有重放攻击的风险,所以应当对会话密钥设定一个合理的过期时间。对于硬件优化的方向,因为 HTTPS 是属于计算密集型,应该选择计算力更强的 CPU,而且最好选择。

2023-10-12 15:30:09 33

原创 HTTPS ECDHE 握手解析

RSA 密钥协商算法「不支持」前向保密,ECDHE 密钥协商算法「支持」前向保密;使用了 RSA 密钥协商算法,TLS 完成四次握手后,才能进行应用数据传输,而对于 ECDHE 算法,客户端可以不用等服务端的最后一次 TLS 握手,就可以提前发出加密的 HTTP 数据,节省了一个消息的往返时间;使用 ECDHE, 在 TLS 第 2 次握手中,会出现服务器端发出的「Server Key Exchange」消息,而 RSA 握手过程没有该消息;

2023-10-12 14:34:18 129

原创 HTTPS RSA 握手解析

, 一般 WITH 单词前面有两个单词,第一个单词是约定密钥交换的算法,第二个单词是约定证书的验证算法。

2023-10-11 21:08:13 35

原创 3.2 HTTP1.1 如何优化

这次主要从 3 个方面介绍了优化 HTTP/1.1 协议的思路。第一个思路是,通过缓存技术来避免发送 HTTP 请求。客户端收到第一个请求的响应后,可以将其缓存在本地磁盘,下次请求的时候,如果缓存没过期,就直接读取本地缓存的响应数据。如果缓存过期,客户端发送请求的时候带上响应数据的摘要,服务器比对后发现资源没有变化,就发出不带包体的 304 响应,告诉客户端缓存的响应仍然有效。将原本由客户端处理的重定向请求,交给代理服务器处理,这样可以减少重定向请求的次数;

2023-10-11 20:09:39 35

原创 HTTP面试问题3

图中发送方发送了很多个 packet,每个 packet 都有自己的序号,你可以认为是 TCP 的序列号,其中 packet 3 在网络中丢失了,即使 packet 4-6 被接收方收到后,由于内核中的 TCP 数据不是连续的,于是接收方的应用层就无法从内核中读取到,只有等到 packet 3 重传后,接收方的应用层才可以从内核中读取到数据,这就是 HTTP/2 的队头阻塞问题,是在 TCP 层面发生的。UDP 发送是不管顺序,也不管丢包的,所以不会出现像 HTTP/2 队头阻塞的问题。

2023-10-11 19:41:10 25

原创 HTTP常见面试题2

也就是内容的「指纹」,这个。

2023-10-11 16:25:26 25

原创 计算机网络面试问题1

三次握手的目的是确保双方都能够收到对方的请求和确认,并且双方都同意建立连接。同时,三次握手也能够防止已经失效的连接请求报文段在网络中重新出现,避免了资源的浪费。5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。完成了这三次握手后,TCP连接就建立起来了,双方可以开始进行数据的传输。4xx:客户端错误状态码,表示客户端的请求有非法内容。3xx:重定向状态码,表示服务器要求客户端重定向。

2023-10-10 22:07:10 225

原创 HTTP 常见面试题1

强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。如下图中,返回的是 200 状态码,但在 size 项中标识的是 from disk cache,就是使用了强制缓存。, 是一个相对时间;Expires,是一个绝对时间;如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires。

2023-10-10 16:40:31 28

原创 键入网址到网页显示,期间发生了什么

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。的 MAC 地址就有点复杂了,只要告诉以太网对方的 MAC 的地址,以太网就会帮我们把包发送过去,那么很显然这里应该填写对方的 MAC 地址。

2023-10-10 15:02:07 174

原创 2.3 Linux 系统是如何收发网络包的

电脑与电脑之间通常都是通过网卡、交换机、路由器等网络设备连接到一起,那由于网络设备的异构性,国际标准化组织定义了一个七层的 OSI 网络模型,但是这个模型由于比较复杂,实际应用中并没有采用,而是采用了更为简化的 TCP/IP 模型,Linux 网络协议栈就是按照了该模型来实现的。TCP/IP 模型主要分为应用层、传输层、网络层、网络接口层四层,每一层负责的职责都不同,这也是 Linux 网络协议栈主要构成部分。

2023-10-09 22:14:06 185

原创 TCP/IP 网络模型有哪几层

综上所述,TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。每一层的封装格式:网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。

2023-10-09 16:26:10 151

原创 实现 Trie (前缀树)

坏处是使用的空间通常是「TrieNode」方式的数倍,而且由于通常对行的估算会很大,导致使用的二维数组开得很大,如果这时候每次创建Trie对象时都去创建数组的话,会比较慢,而且当样例多的时候甚至会触发 GC(因为OJ每测试一个样例会创建一个Trie对象)。Trie 树(又叫「前缀树」或「字典树」)是一种用于快速查询「某个字符串/字符前缀」是否存在的数据结构。其核心是使用「边」来代表有无字符,使用「点」来记录是否为「单词结尾」以及「其后续字符串的字符是什么」。

2023-10-05 19:49:12 43

原创 02 REST风格

02 REST风格

2023-10-04 19:42:37 25

原创 1 SpringBoot入门案例

1 入门案例IDEA创建官网创建阿里云版手工创建隐藏文件和文件夹parent

2023-10-04 15:38:55 139

原创 并查集理论基础

在第一次查询的时候,相当于是n叉树上从叶子节点到根节点的查询过程,时间复杂度是logn,但路径压缩后,后面的查询操作都是O(1),而 join 函数 和 isSame函数 里涉及的查询操作也是一样的过程。因为 find 函数向上寻找根节点,father[u] 表述 u 的父节点,那么让 father[u] 直接获取 find函数 返回的根节点,这样就让节点 u 的父节点 变成根节点。我们需要 father[C] = C,即C的根也为C,这样就方便表示 A,B,C 都在同一个集合里了。

2023-09-22 09:44:26 38

原创 广度优先搜索理论基础

我们从图中可以看出,从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。我们用一个方格地图,假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步。在第五步,第六步 我只把关键的节点染色了,其他方向周边没有去染色,大家只要关注关键地方染色的逻辑就可以。因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。

2023-09-20 11:28:50 48

原创 深度优先搜索理论基础

又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图五,路径6撤销(回溯的过程),改为路径7,路径8 和 路径7,路径9, 结果发现死路一条,都走到了自己走过的节点。那么节点2所连接路径和节点3所链接的路径 都走过了,撤销路径只能向上回退,去选择撤销当初节点4的选择,也就是撤销路径5,改为路径10。又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。此时我们找到了节点6,(遇到黄河了,是不是应该回头了),那么应该再去搜索其他方向了。

2023-09-20 10:59:17 35

原创 71 简化路径

存在多个连续斜杠的情况需要去除,且不便于返回上级目录(弹出栈顶元素),故不存储!) 表示将目录切换到上一级(指向父目录);任意多个连续的斜杠(即,当遇到两个点时,需返回上级目录,类似于栈弹出栈顶元素的操作,因此想到使用栈!,表示指向某一文件或目录的 Unix 风格。遇到非斜杠,统计两斜杠间的字符串,再进行判断!开头),请你将其转化为更加简洁的规范路径。对于此问题,任何其他格式的点(例如,在 Unix 风格的文件系统中,一个点(: 用一个栈维护路径中的 文件/目录名。,直接跳过,不做操作。

2023-09-13 22:26:03 21

原创 455 分发饼干

if 里的 index 指向 胃口 10, for 里的 i 指向饼干 9,因为 饼干 9 满足不了 胃口 10,所以 i 持续向前移动,而 index 走不到。外面的 for 是里的下标 i 是固定移动的,而 if 里面的下标 index 是符合条件才移动的。的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢?

2023-08-21 14:19:52 27

原创 37 解数独

因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值。递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满当然好了,说明找到结果了),所以不需要终止条件!N皇后问题是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!编写一个程序,通过填充空格来解决数独问题。

2023-08-21 13:35:49 33

原创 51 N皇后

递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。因为在单层搜索的过程中,每一层递归,只会选for循环(也就是同一行)里的一个元素,所以不用去重了。从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。可以看出,除了验证棋盘合法性的代码,省下来部分就是按照回溯法模板来的。那么用皇后们的约束条件,来回溯搜索这棵树,

2023-08-21 11:28:22 33

原创 40 组合总和II

可能有的录友想,为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。要去重的是“同一树层上的使用过”,如何判断同一树层上元素(相同的元素)是否使用过了呢。**注意:**解集不能包含重复的组合。

2023-07-17 16:30:51 37

原创 47 全排列 II

树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。给定一个可包含重复数字的序列。这道题目和46全排列的区别在与。如果要对树层中前一位去重,就用。[1,1,1] 来举一个例子。返回所有不重复的全排列。,如果要对树枝前一位去重用。去重最为关键的代码为。

2023-07-07 14:01:37 29

原创 46 全排列

可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。可以看出叶子节点,就是收割结果的地方。那么什么时候,算是到达叶子节点呢?给定一个不含重复数字的数组。

2023-07-07 11:16:40 35

原创 491 递增子序列

给你一个整数数组 ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:示例 2:思路这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑!本题给出的示例,还是一个有序数组 [4, 6, 7, 7],这更容易误导大家按照排序的思路去做了。为了

2023-07-07 10:21:06 31

原创 90 子集II

从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!这道题目和78 子集区别就是集合里有重复元素了,而且求取的子集要去重。,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。用示例中的[1, 2, 2] 来举例,如图所示: (返回的解集中,子集可以按。使用set去重的版本。

2023-07-07 09:31:54 23

原创 78 子集

全局变量数组path为子集收集元素,二维数组result存放子集组合。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,递归函数参数在上面讲到了,需要startIndex。但是要清楚子集问题和组合问题、分割问题的的区别,返回该数组所有可能的子集(幂集)。剩余集合为空的时候,就是叶子节点。从图中红线部分,可以看出。

2023-07-06 16:08:14 28

原创 93 复原IP地址

题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。,和刚做过的131分割回文串就十分类似了。回溯的时候,就将刚刚加入的分隔符。

2023-07-05 16:13:09 31

原创 131 分割回文串

在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。

2023-07-05 15:28:03 23

原创 40 组合总和II

为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。要去重的是“同一树层上的使用过”,如何判断同一树层上元素(相同的元素)是否使用过了呢。这个集合去重的重任就是used来完成的。

2023-07-05 14:52:36 29

原创 39 组合总和

此外我还定义了int型的sum变量来统计单一结果path里的总和,其实这个sum也可以不用,用target做相应的减法就可以了,最后如何target==0就说明找到符合的结果了,但为了代码逻辑清晰,我依然用了sum。注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!于sum已经大于target的情况,其实是依然进入了下一层递归,只是下一层递归结束判断的时候,会判断sum > target的话就返回。

2023-07-02 16:47:27 23

原创 17 电话号码的字母组合

图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]。一些写法,是把回溯的过程放在递归函数里了,例如如下代码,我可以写成这样:(注意注释中不一样的地方)从示例上来说,输入"23",最直接的想法就是两层for循环遍历了吧,正好把组合的情况都输出了。例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。然后收集结果,结束本层递归。

2023-07-02 15:57:08 50

原创 216 组合总和III

其实这里sum这个参数也可以省略,每次targetSum减去选取的元素数值,然后判断如果targetSum为0了,说明收集到符合条件的结果了,我这里为了直观便于理解,还是加一个sum参数。例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。在上面已经说了,k其实就已经限制树的深度,因为就取k个元素,树再往下深了没有意义。

2023-07-02 15:24:23 31

原创 77 组合

从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。此时递归的层数大家应该知道了,例如:n为100,k为50的情况下,就是递归50层。

2023-06-28 16:47:56 29

原创 回溯法理论基础

例如:{1, 2} 和 {2, 1} 在组合上,就是一个集合,因为不强调顺序,而要是排列的话,{1, 2} 和 {2, 1} 就是两个集合了。再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

2023-06-06 17:19:47 46 1

空空如也

空空如也

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

TA关注的人

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