服务端不 listen 可以创建 tcp 连接吗

这个问题有三类答案。

上来就撸 linux kernel 源码,折腾半天,哦,终于在 tcp_rcv_state_process 里找到了 tcp_rcv_synsent_state_process 调用,后者包含:

c 复制代码
if (th->syn) {
        /* We see SYN without ACK. It is attempt of
         * simultaneous connect with crossed SYNs.
         * Particularly, it can be connect to self.
         */
        tcp_set_state(sk, TCP_SYN_RECV);

注释也不看,看到 tcp_set_state 就很兴奋,认为自己找到了答案,斩钉截铁回答 "不 listen 也能建立起连接"。

这种回答说明此人能看懂 linux kernel c 代码,可能根本不懂 tcp,就像一个毫无乐感且不识谱的人照着一个按排好的钢琴按键序列依次按下,就能弹出正道的光的一样。

大部分人都精通 linux kernel 源码,所以任何问题都可以落实到一个查找代码的问题。

第二类答案是告诉你可以在服务端创建个 tun 设备将 syn 引到用户态程序,然后构造一个 synack 回注到 tun 设备,或者 dpdk,iptables nf_queue,自定义 nf_hook 回注 synack 也可以做同样的事吧啦吧啦... 这说明这个人懂 tcp 握手套路但显然对协议理解并不深入,他只是对 linux 网络协议栈的玩法比较擅长。

第三类答案才是正确答案,就一句话,tcp 同时打开。撸代码的那位,tcp_set_state 上面注释写得很清楚了,rfc793 3.4 小节:

The procedure also works if two TCP simultaneously initiate the procedure. When simultaneous attempt occurs, each TCP receives a "SYN" segment which carries no acknowledgment after it has sent a "SYN".

bash 复制代码
[root@localhost ~]# nc -p 2234 127.0.0.1 2234

知道姿势了吗?

浙江温州皮鞋湿,下雨进水不会胖。

相关推荐
枷锁—sha19 分钟前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
郝学胜-神的一滴25 分钟前
深入解析C/S模型下的TCP通信流程:从握手到挥手的技术之旅
linux·服务器·c语言·网络·网络协议·tcp/ip
池央31 分钟前
CANN 算子诊断与故障定位:oam-tools 在异构计算错误解析中的作用
网络
“αβ”33 分钟前
数据链路层协议 -- 以太网协议与ARP协议
服务器·网络·网络协议·以太网·数据链路层·arp·mac地址
释怀不想释怀39 分钟前
Linux网络基础(ip,域名)
linux·网络·tcp/ip
开开心心就好1 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
子榆.1 小时前
CANN 性能分析与调优实战:使用 msprof 定位瓶颈,榨干硬件每一分算力
大数据·网络·人工智能
驱动探索者1 小时前
U盘发展史
网络·cpu·u盘
青春给了代码1 小时前
基于WebSocket实现在线语音(实时+保存)+文字双向传输完整实现
网络·websocket·网络协议
Trouvaille ~3 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket