东风草堂博客

公众号:开发者来风

参考文章:
https://www.geeksforgeeks.org/tcp-3-way-handshake-process/
https://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml

传输控制协议中的TCP三向握手(也称为TCP握手;三消息握手和/或SYN-SYN-ACK)是TCP通过基于Internet协议的网络建立TCP / IP连接的方法。 TCP的三向握手技术通常称为“ SYN-SYN-ACK”(或更准确地说是SYN,SYN-ACK,ACK),因为TCP传输了三种消息来协商和启动两台计算机之间的TCP会话。 TCP握手机制经过设计,因此,尝试进行通信的两台计算机可以在传输SSH和HTTP Web浏览器请求之类的数据之前,协商网络TCP套接字连接的参数。

这也可以看作是建立TCP连接的一种方式。 在进入细节之前,让我们看一些基础知识。 TCP代表传输控制协议,该协议表示它做了一些事情以可靠的方式控制数据的传输。

互联网上设备之间的通信过程根据当前的TCP/IP套件模型(OSI参考模型的精简版)进行。 应用程序层是TCP/IP模型的顶层堆栈,在该层中,网络引用的应用程序(如客户端上的Web浏览器)与服务器建立连接。 信息从应用程序层传输到传输层,在这里我们的主题成为现实。 该层的两个重要协议是TCP,UDP(用户数据报协议),而TCP在其中很普遍(因为它为建立的连接提供了可靠性)。 但是,您可以在查询DNS服务器中找到UDP的应用程序,以获取与该网站使用的域名的二进制等效项。

TCP通过称为“带重传的肯定确认”(PAR)的方式提供可靠的通信。 传输层的协议数据单元(PDU)称为段。 现在,使用PAR的设备重新发送数据单元,直到它收到确认为止。 如果在接收器端接收的数据单元已损坏(它使用用于错误检测的传输层的校验和功能检查数据),则接收器将丢弃该段。 因此,发送方必须重新发送未收到肯定确认的数据单元。 通过上述机制,您可以实现在发送方(客户端)和接收方(服务器)之间交换三个段,以建立可靠的TCP连接。 让我们研究一下这种机制是如何工作的:
TCP-connection
3-way-handshake

阅读全文 »

动态规划是一种解决问题的算法策略,它通常用于解决涉及最优化问题的情况,比如找到最短路径、最大价值等等。动态规划算法的核心思想是将一个大问题分解成一系列小问题,并记住已经解决的小问题的答案,以避免重复计算。这种方法有助于提高计算效率。

动态规划的一般步骤如下:

  1. 定义问题: 首先,将大问题分解成小问题,并明确定义每个小问题的状态。这些状态是问题的不同方面,通常与问题的输入相关。
  2. 找到递推关系: 接下来,确定每个状态如何与其他状态相关联。这通常通过递推关系或方程式来完成,它们描述了一个状态如何由一个或多个先前状态计算得出。
  3. 初始化: 对于问题中的一些状态,需要初始化其初始值,以便递推关系可以开始工作。
  4. 计算和记忆: 使用递推关系,从最小的状态开始,逐步计算并记住每个状态的值。这些值可以保存在表格、数组或字典中,以便后续使用。
  5. 解决大问题: 通过计算小问题的值,最终可以解决整个大问题。这通常是在表格中找到最终状态的值,然后根据需要提取答案。
  6. 优化: 可能需要进一步优化算法以减少内存和时间的消耗。

买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

阅读全文 »

Table的管理

在Pegasus里,table相当于一个namespace,不同的table下可以有相同的(HashKey, SortKey)序对。在使用table前,需要在向MetaServer先发起建表的申请。

MetaServer在建表的时候,首先对表名以及选项做一些合法性的检查。如果检查通过,会把表的元信息持久化存储到Zookeeper上。在持久化完成后,MetaServer会为表中的每个分片都创建一条记录,叫做PartitionConfiguration。该记录里最主要的内容就是当前分片的version以及分片的composition(即Primary和Secondary分别位于哪个ReplicaServer)。

在表创建好后,一个分片的composition初始化为空。MetaServer会为空分片分配Primary和Secondary。等一个分片有一主两备后,就可以对外提供读写服务了。假如一张表所有的分片都满足一主两备份,那么这张表就是可以正常工作的。

如果用户不再需要使用一张表,可以调用删除接口对Pegasus的表进行删除。删除的信息也是先做持久化,然后再异步的将删除信息通知到各个ReplicaServer上。等所有相关ReplicaServer都得知表已经删除后,该表就变得不可访问。注意,此时数据并未作物理删除。真正的物理删除,要在一定的时间周期后发生。在此期间,假如用户想撤回删除操作,也是可以调用相关接口将表召回。这个功能称为软删除。

阅读全文 »

稳定性与兼容性

断言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef NDEBUG
#define assert(expr) (static_cast<void>(0))
#else
#endif

#ifndef _COMPLEX_H
#error "Nerver use <bits/cmathcalls.h> directly; include <complex.h> instead."
#endif

// 静态断言的实现
#define assert_static(e) \
do { \
enum { assert_static__ = 1/(e) }; \
} while (0)
// do while这样写可以避免if没有加括号而出现匹配异常的情况

异常

如果noexcept修饰的函数抛出了异常,编译器可用选择直接调用std::terminate()函数来终止程序的运行,如析构函数不应该抛出异常,所以默认是noexcept(true)。在c++98中,使用throw()来声明不抛出异常的函数。

阅读全文 »

精选推荐各类高效办公软件,涵盖文档处理、项目管理、团队协作、云存储等核心场景。分享免费且跨平台的优质工具,帮助提升工作效率,实现远程协作与移动办公的最佳实践。

阅读全文 »

配置

rewrite regex replacement [flag];
rewrite的含义:该指令是实现URL重写的指令。
regex的含义:用于匹配URI的正则表达式。
replacement:将regex正则匹配到的内容替换成 replacement。
flag: flag标记。

flag有如下值:

  • last: 本条规则匹配完成后,继续向下匹配新的location URI 规则。(不常用)
  • break: 本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)。
  • redirect: 返回302临时重定向,浏览器地址会显示跳转新的URL地址。
  • permanent: 返回301永久重定向。浏览器地址会显示跳转新的URL地址。

比如rewrite ^/(.*) http://www.baidu.com/$1 permanent;
说明:

阅读全文 »

git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 更新所有tags:
git fetch --tags
# 查看其中一个tag:
git show V100
# 使用TortoiseGit里面的show log查看各个commit的提交情况。
# 从索引中删除文件。
git rm --cached
git stash pop stash@{1}
git merge master --allow-unrelated-histories
# 运行以下命令来获取远程仓库的最新分支信息
git fetch --all
# 检查已经获取到的所有分支列表
git branch -r
# 针对每个远程分支,在本地创建并切换到对应的分支上:
git checkout -b <本地分支名> <远程分支名>
git tag -a v1.0 abcdef1 -m "Version 1.0 released"
git push origin <tag_name>
# commit信息
git config commit.template .gitmessage

要将一个分支(例如,名为 source_branch)中的提交更改复制到另一个分支(例如,名为 destination_branch),你可以使用 git cherry-pick 命令。这个命令会将指定的提交复制到当前分支。

TortoiseGit

阅读全文 »

算法和数据结构

解题思路:画图、推演、分解。代码编写:代码规范、功能正确、边界问题、异常处理、效率问题。

深度优先搜索

求可能解的问题,而广度优先搜索是求最优解的问题。
解题步骤:按照规则顺序搜索,尽量不重复不遗漏枚举出所有可能分支。使用递归来实现:使用栈、考虑好退出条件、自己调用自己,拆分出类似解。回溯:切换其他可能分支,注意恢复原状态。剪枝:优化搜索性能,去除重复解,发现找不到解可以提前退出。

例子:求一个字符串的所有排列组合,不含重复解,字符串长度小于8。
画递归树:先确定第一个字符,让后面的字符串bc作为一个整体,再让第一个字符a与后面的字符bc分别进行交换,里面的整体bc重复同样的操作。

阅读全文 »
0%