如何在 Python 中禁用掉 TCP_QUICKACK

168 views
Skip to first unread message

cloverstd

unread,
Jul 3, 2018, 11:40:18 AM7/3/18
to python-cn(华蟒用户组,CPyUG 邮件列表)

最近发现了一个很有趣的 TCP 健康检查方式

Client: SYN
Server: SYN-ACK
Client: RST

不用完成完整的 TCP 三次握手来检查一个目标地址的端口是否开启。

在这里有一个 Go 的实现 https://github.com/tevino/tcp-shaker.

我想在 Python 里实现这种健康检查的方式

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_TCP, socket.TCP_QUICKACK, 0)
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 0)
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
s.connect((ip, port))
s.close()

可是,通过抓包,我发现它并没有按照我的设想走

client 还是会回一个 ACK 给 Server,并且在 close 的时候,也没有发送 RST 过去,而是发了 FIN。

我也翻了下 Python socket 的源代码,发现 socket 就是 C 把 connect setsockopt 给 export 出来了而已,并没有做什么特殊的事情,不知道为啥不能按照我设想,关闭了 TCP_QUICKACK,然后 client 不发 ACK 过去。

设置了 SO_LINGER,也没有按照我设想的发送 RST 去关闭连接。

Linux 内核是 3.10.0,高于 TCP_QUICKACK 要求的版本,而且上面那个 Go 实现的,也可以正常工作,就是我写的 Python 的没法玩。

依云

unread,
Jul 3, 2018, 12:30:51 PM7/3/18
to pyth...@googlegroups.com
On Tue, Jul 03, 2018 at 08:40:18AM -0700, cloverstd wrote:
>
> 最近发现了一个很有趣的 TCP 健康检查
> <https://yanagieiichi.github.io/tcp-check/docs/intro/#The%20tcp-check>方式
我这里观测到 SYN -> SYN+ACK -> RST+ACK。Linux 4.16.12, Python 3.6。

你 strace 一下你的 Python 程序呢?是不是 setsockopt 没成功之类的?然后再
strace 一下 Go 版本对比一下。


--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
https://blog.lilydjwg.me/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

est

unread,
Jul 3, 2018, 9:21:50 PM7/3/18
to pyth...@googlegroups.com
检查下 setsockopt 的返回值是不是0 。不一定执行成功了。

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

cloverstd

unread,
Jul 4, 2018, 8:57:31 AM7/4/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
strace 了一下,对比了 Python 的和 Go 的,setsockopt 的调用是一样的

但是发现一个奇怪的问题,Go 版本抓到抓不到,我是用的 WireShark 在宿主机(Mac)上抓包,程序是跑在 Vagrant(VirtualBox) 里面的

Python 里面 setsockopt 调用后返回 None

在 2018年7月4日星期三 UTC+8上午12:30:51,依云写道:

cloverstd

unread,
Jul 4, 2018, 8:58:07 AM7/4/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
返回的是 None,我也感觉没设置成功,但是不知道问题在哪里

在 2018年7月4日星期三 UTC+8上午9:21:50,est写道:
检查下 setsockopt 的返回值是不是0 。不一定执行成功了。

要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

Shell Xu

unread,
Jul 4, 2018, 9:34:05 AM7/4/18
to CUPG
看strace的返回值。

检查下 setsockopt 的返回值是不是0 。不一定执行成功了。

要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout


--
彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
blog: http://shell909090.org/

依云

unread,
Jul 4, 2018, 10:46:40 AM7/4/18
to pyth...@googlegroups.com
On Wed, Jul 04, 2018 at 05:57:31AM -0700, cloverstd wrote:
> strace 了一下,对比了 Python 的和 Go 的,setsockopt 的调用是一样的
>
> 但是发现一个奇怪的问题,Go 版本抓到抓不到,我是用的 WireShark 在宿主机(Mac)上抓包,程序是跑在
> Vagrant(VirtualBox) 里面的

那你为什么能抓到 Python 版的?难道你用的操作系统都不一样?

> Python 里面 setsockopt 调用后返回 None


cloverstd

unread,
Jul 7, 2018, 1:27:26 AM7/7/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
破案了

我是在我的电脑(Mac)上,使用 WireShark 抓包,但是程序是在 Vagrant(VirtualBox) 里面的 Linux 中运行,使用 WireShark 抓包,看到的就是正常的三次握手,和四次挥手

但是当我在 Linux 中使用 tcpdump 抓包时,就得到了我期望的结果,不知道在宿主机上抓虚拟机里的包,为什么会是这种情况,虚拟机用的 NAT 模式的网络

在 2018年7月4日星期三 UTC+8下午10:46:40,依云写道:

coder vx

unread,
Jul 9, 2018, 10:11:27 PM7/9/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
用原始套接字玩这个,想怎么搞怎么搞.

在 2018年7月3日星期二 UTC+8下午11:40:18,cloverstd写道:
Reply all
Reply to author
Forward
0 new messages