我试图了解 ECN 标志如何影响发送方的 TCP 拥塞窗口(linux 中的 snd_cwnd 参数)。
为此,我使用 scapy 在 HostA 上生成所需的数据包,将其作为 sr(IP(src='aaaa',dst='bbbb')/TCP(flags=0x050)) 定向到 HostB。
这确实触发了 hostA 向 hostB 发送了一个启用 tcp ecn 的数据包,但是由于 scapy 在用户空间中工作,而不是特别是在 Linux 内核 TCP 中,我无法提取拥塞窗口参数。然后我使用 scapy 的 StraemSocket() 模块将 scapy 连接绑定到 linux TCP 套接字。Hosta = 服务器(aaaa),HostB = 客户端(bbbb)
代码如下: 服务器:
from scapy.all import *
import socket
serversocket = socket.socket()
serversocket.bind(("a.a.a.a",9876))
serversocket.listen(1)
sc,sockname = serversocket.accept()
serverstream=StreamSocket(sc)
serverstream.sr(IP(src='a.a.a.a',dst='b.b.b.b')/TCP(flags=0x050))
客户:
from scpay.all import *
import socket
clientsocket = socket.socket()
clientsocket.connect(("a.a.a.a",9876))
clientstream = StreamSocket(clientsocket)
clientstream.sr(IP(src="b.b.b.b",dst="a.a.a.a")/TCP(flags="S"))
从下面的快照可以看出,带有 ecn 和 cwd 标志的 3 次握手成功(我已经在主机和所有中间路由器上启用了 ecn)。但wireshark 只是没有捕获服务器发送的带有ecn 标记的数据包。我不确定服务器是否发送了数据包,我在这里真的想完了。
