kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

一个存在10年的tcp建链失败的问题

https://blog.csdn.net/mrpre/article/details/152134117

2015年的patch 5e0724d027f0 将request_sock从listen队列移到ehash队列。正常情况下,SYN包到达后创建request_sock并插入ehash,三次握手ACK到来时在ehash中查找并替换为full socket。问题在于替换过程先删除request_sock再插入新socket,中间存在间隙,并发场景下其他连接可能误入此空隙,导致建链失败。

https://github.com/torvalds/linux/commit/1532ed0d0753c83e72595f785f82b48c28bbe5dc

1
2
3
4
5
6
7
8
9
10
The call trace map is drawn as follows:
   CPU 0                           CPU 1
   -----                           -----
				inet_ehash_insert()
                                spin_lock()
                                sk_nulls_del_node_init_rcu(osk)
__inet_lookup_established()
	(lookup failed)
                                __sk_nulls_add_node_rcu(sk, list)
                                spin_unlock()

不修也无所谓, 因为修了, 可能查到的是osk, 最终也不会被处理.

kernel, net

« NAME记录与MX/TXT记录冲突 MAC地址表项的老化时间及老化机制 »