之前的文章集合:
一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客
一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合5_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合6_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合7_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合8_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合9_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合10_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合11_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合12_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合13_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合14_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合15-CSDN博客
20240226
任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员可以编写人类可以理解的代码。
我相信这句话可以作为评估优秀代码的起点:它必须可读、可理解且清晰。编写优秀代码的首要原则是将人类读者放在第一位。
微服务架构区别于其他概念的本质在于,将大型单体分解为独立的微服务后,不同模块之间的界限更加清晰。与维护单一系统的数百人的大型团队相比,许多各自维护自己的微服务的小型组织可以更高效地运营。
在没有特定组织规模(即“人”)的情况下谈论微服务的各种技术优势和奇特功能是本末倒置。
Focusing on the cost-effectiveness of learning
注重学习的成本效益
下图显示了学习成果与投入的努力之间的关系。
学习成果与投资图表,x 轴为学习努力,y 轴为绩效
该图表明,在学习的初始阶段,相对较小的投资回报会迅速增长。然而,一旦结果超过一定阈值,继续改进所需的投资就会呈指数级增长。
因此,我建议,每当你开始学习新东西时,首先在脑海中弄清楚这个问题:“我应该在图表的哪个点停止?”而不是坚持不懈地学习。
知识的海洋是无边无际的。有些事情需要多年的不断学习和完善,而另一些事情只需要摸一摸就能获得足够的理解。准确评估和分配你有限的学习精力有时甚至比努力学习本身更重要。
After 14 years in the industry, I still find programming difficult | Pigleipiglei's bloghttps://www.piglei.com/articles/en-programming-is-still-hard-after-14-years/
需要 TIME-WAIT 状态,主要是两个原因:
- 防止历史连接中的数据,被后面相同四元组的连接错误的接收;
- 保证「被动关闭连接」的一方,能被正确的关闭;
原因一:防止历史连接中的数据,被后面相同四元组的连接错误的接收
为了能更好的理解这个原因,我们先来了解序列号(SEQ)和初始序列号(ISN)。
- 序列号,是 TCP 一个头部字段,标识了 TCP 发送端到 TCP 接收端的数据流的一个字节,因为 TCP 是面向字节流的可靠协议,为了保证消息的顺序性和可靠性,TCP 为每个传输方向上的每个字节都赋予了一个编号,以便于传输成功后确认、丢失后重传以及在接收端保证不会乱序。序列号是一个 32 位的无符号数,因此在到达 4G 之后再循环回到 0。
- 初始序列号,在 TCP 建立连接的时候,客户端和服务端都会各自生成一个初始序列号,它是基于时钟生成的一个随机数,来保证每个连接都拥有不同的初始序列号。初始化序列号可被视为一个 32 位的计数器,该计数器的数值每 4 微秒加 1,循环一次需要 4.55 小时。
给大家抓了一个包,下图中的 Seq 就是序列号,其中红色框住的分别是客户端和服务端各自生成的初始序列号。
通过前面我们知道,序列号和初始化序列号并不是无限递增的,会发生回绕为初始值的情况,这意味着无法根据序列号来判断新老数据。
假设 TIME-WAIT 没有等待时间或时间过短,被延迟的数据包抵达后会发生什么呢?
- 服务端在关闭连接之前发送的
SEQ = 301
报文,被网络延迟了。 - 接着,服务端以相同的四元组重新打开了新连接,前面被延迟的
SEQ = 301
这时抵达了客户端,而且该数据报文的序列号刚好在客户端接收窗口内,因此客户端会正常接收这个数据报文,但是这个数据报文是上一个连接残留下来的,这样就产生数据错乱等严重的问题。
为了防止历史连接中的数据,被后面相同四元组的连接错误的接收,因此 TCP 设计了 TIME_WAIT 状态,状态会持续 2MSL
时长,这个时间足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。
原因二:保证「被动关闭连接」的一方,能被正确的关闭
在 RFC 793 指出 TIME-WAIT 另一个重要的作用是:
TIME-WAIT - represents waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request.
也就是说,TIME-WAIT 作用是等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。
如果客户端(主动关闭方)最后一次 ACK 报文(第四次挥手)在网络中丢失了,那么按照 TCP 可靠性原则,服务端(被动关闭方)会重发 FIN 报文。
假设客户端没有 TIME_WAIT 状态,而是在发完最后一次回 ACK 报文就直接进入 CLOSE 状态,如果该 ACK 报文丢失了,服务端则重传的 FIN 报文,而这时客户端已经进入到关闭状态了,在收到服务端重传的 FIN 报文后,就会回 RST 报文。
服务端收到这个 RST 并将其解释为一个错误(Connection reset by peer),这对于一个可靠的协议来说不是一个优雅的终止方式。
为了防止这种情况出现,客户端必须等待足够长的时间,确保服务端能够收到 ACK,如果服务端没有收到 ACK,那么就会触发 TCP 重传机制,服务端会重新发送一个 FIN,这样一去一来刚好两个 MSL 的时间。
客户端在收到服务端重传的 FIN 报文时,TIME_WAIT 状态的等待时间,会重置回 2MSL
为什么需要 TIME_WAIT 状态? - 知乎主动发起关闭连接的一方,才会有 TIME-WAIT 状态。需要 TIME-WAIT 状态,主要是两个原因: 防止历史连接中的数据,被后面相同四元组的连接错误的接收;保证「被动关闭连接」的一方,能被正确的关闭; 原因一:防止…https://zhuanlan.zhihu.com/p/682680784
20240223
每个操作系统都附带一些内置的标准 C 库,这些库大约是 C 可执行文件“免费”获得的 30MB 代码,例如一个小的“Hello World” C 可执行文件实际上无法打印任何内容,它只调用操作系统附带的 printf
。 Rust 不能指望操作系统内置 Rust 标准库,因此 Rust 可执行文件捆绑了自己的标准库(300KB 或更多)。幸运的是,这是一次性开销并且可以减少。对于嵌入式开发,可以关闭标准库,Rust 将生成“裸”代码。
Speed of Rust vs C
MySQL 索引原理以及 SQL 优化-CSDN博客文章浏览阅读969次,点赞9次,收藏19次。【代码】MySQL 索引原理以及 SQL 优化。https://blog.csdn.net/weixin_44585214/article/details/136197000
SVG Tutorial - Learn how to code images in HTML with SVGLearn the fundamentals of Scalable Vector Graphics (SVG) from the basics up to advanced concepts like animation and interactivity.https://svg-tutorial.com/
音标练习
爱发音美式音标发音教学、英式音标发音教学https://fayin.love/
Web 终极拦截技巧(全是骚操作) | 风痕 · 術&思拦截的价值> 计算机科学领域的任何问题都可以通过增加一个中间层来解决。 —— Butler Lampson如果系统的控制权、代码完全被掌控,很容易添加中间层;现实情况我们往往无法控制系统的所有细节,所以需要使用一些 “非常规”(拦截) 手段来增加中间层。拦截的方法拦截/覆写 浏览器 API最常见的场景有通过拦截 console ...https://hughfenghen.github.io/posts/2023/12/23/web-spy/https://hughfenghen.github.io/WebAV/demo
https://hughfenghen.github.io/WebAV/demo