考虑TCP的三次握手。它解释了here。
现在,上面的文章提到,两端可以尝试同时连接,在这种情况下,三次握手可以很好地工作。
我们可以使用sockets来模拟这种情况吗?我们通常使用套接字编写的代码是被动开放(服务器)和主动开放(客户端)?
发布于 2010-02-15 10:59:05
可以使用套接字API同时打开TCP。正如Nikolai所提到的,这是一个执行下面的序列的问题,它的定时使得初始的SYNs彼此交叉。
bind addr1, port1
connect addr2, port2
bind addr2, port2
connect addr1, port1
下面是我如何使用单个Linux主机实现同步打开。
tc qdisc add dev lo根句柄1:0 netem延迟5秒
netcat
两次netcat -p 3000 127.0.0.1 2000 netcat -p 2000 127.0.0.1 3000
两个netcat进程相互连接,从而产生单个TCP连接
$ lsof -nP -c netcat -a -i # some columns removed
COMMAND PID NAME
netcat 27911 127.0.0.1:2000->127.0.0.1:3000 (ESTABLISHED)
netcat 27912 127.0.0.1:3000->127.0.0.1:2000 (ESTABLISHED)
下面是tcpdump向我展示的内容(为了清晰起见,对输出进行了编辑)
127.0.0.1.2000 > 127.0.0.1.3000: Flags [S], seq 1139279069
127.0.0.1.3000 > 127.0.0.1.2000: Flags [S], seq 1170088782
127.0.0.1.3000 > 127.0.0.1.2000: Flags [S.], seq 1170088782, ack 1139279070
127.0.0.1.2000 > 127.0.0.1.3000: Flags [S.], seq 1139279069, ack 1170088783
发布于 2011-12-01 20:51:40
作为参考,除了sigjuice和Nikolai的可靠答案之外,还提供了一个示例,使用python可以很容易地实现同步打开。在两个不同的python解释器中,执行以下操作:
>>> import socket
>>> s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s1.bind(('localhost', 1111))
>>> s1.connect(('localhost', 2222))
>>> s1.send('hello')
5
>>> s1.recv(5)
'world'
和:
>>> import socket
>>> s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s2.bind(('localhost', 2222))
>>> s2.connect(('localhost', 1111))
>>> s2.recv(5)
'hello'
>>> s2.send('world')
5
(连接调用必须在两个绑定调用都返回之后进行)
发布于 2010-02-10 05:39:30
我们使用被动服务器和主动客户端,因为它易于理解,相对容易实现,并且易于编码。想一想一个商店和一个顾客,我们会处于以下情况之一:
由于服务器被动地等待客户端进行连接,因此很容易预测何时可以进行连接。不需要预先协议(服务器地址和端口号除外)。
另一方面,同时打开受到两端连接超时的影响,即必须仔细安排连接才能发生连接,以便SYN
交叉“在运行中”。它是TCP协议的一个有趣的产物,但我看不出它在实践中有什么用处。
您可以尝试通过打开套接字、将其绑定到端口(以便另一端知道要连接到何处)并尝试连接来模拟此过程。两边是对称的。可以尝试使用带有-p
选项的netcat。不过,您必须非常快速:)
https://stackoverflow.com/questions/2231283
复制相似问题