Recent Posts
-
2021-05-25
深入浅出TCP中的SYN-Cookies
SYN Flood 攻击TCP连接建立时,客户端通过发送SYN报文发起向处于监听状态的服务器发起连接,服务器为该连接分配一定的资源,并发送SYN+ACK报文。对服务器来说,此时该连接的状态称为半连接(Half-Open),而当其之后收到客户端回复的ACK报文后,连接才算建立完成。在这个过程中,如果服务器一直没有收到ACK报文(比如在链路中丢失了),服务器会在超时后重传SYN+ACK。如果经过多次超时重传后,还没有收到, 那么服务器会回收资源并关闭半连接,仿佛之前最初的SYN报文从来没到过一...
-
2021-04-05
TCP timestamp 选项那点事
TCP 最早在 RFC1323 [] 中引入了 timestamp 选项, 并在后来的 RFC7323 中进行了更新。引入 timestamp 最初有两个目的:1.更精确地估算报文往返时间(round-trip-time, RTT) 2. 防止陈旧的报文干扰正常的连接.本文将以 RFC7323 为基础,介绍 timestamp 选项的应用场景和当前业界对其的一些讨论。介绍Timestamp 是作为一个 TCP 选项存在于 TCP 首部。如下图所示,一个 timestamp 选项需要占据首部...
-
2021-03-17
理解内核 TCP 的重传次数
sysctl_tcp_retries1和sysctl_tcp_retries2是内核提供的与 TCP 重传次数的相关的两个控制开关.其中sysctl_tcp_retries2 (后文简称retries2)与我们普通认知中的最大重传次数的关系更为密切.文档的原文是这么写的: This value influences the timeout of an alive TCP connection, when RTO retransmissions remain unacknowledged....
-
2021-03-02
内核TCP拥塞控制框架的两次演进
今天的主题是内核 TCP 拥塞控制实现的两次关键变化.第一次 拥塞控制算法插件化 2005.1.24Add pluggable congestion control algorithm infrastructure.在这次 commit 之前, 内核已经支持了 reno、vegas、westwood、bic 拥塞控制算法. 但它们是直接嵌入在 tcp 的主路径中.#define tcp_is_vegas(__tp) ((__tp)->adv_cong == TCP_VEGAS)#de...
-
2021-01-30
socket的加锁与解锁
在内核网络系统代码中,我们可以见到很多地方都有 lock_sock() 这类对 socket 结构的加锁操作,而也有少数地方是使用 bh_lock_sock()那么什么时候该用 lock_sock(),什么时候又该用 bh_lock_sock() ?本文结合实际内核代码稍加解释。(本文使用内核代码版本是 4.19.75,不过这个部分变化不大,其他版本内核也ok)0x0. process context 与 interrupt context我们通常将内核代码执行的上下文分为 proces...