TCP 是基于会话的。想要通信的机器必须首先相互同步(设置会话)。
这个过程就是所谓的 3 次握手,使用以下步骤:SYN、SYN-ACK、ACK。
1.) Machine A ====SYN====> Machine B (Machines A, running scapy, tries to synch with B, running netcat)
2.) Machine B ==SYN-ACK==> Machine A (Machine B ACKs and SYNs with Machine A)
3.) Machine A ====ACK====> Machine B (Machine A ACKs the SYN-ACK from Machine B)
机器现在有一个会话(连接)并且可以互相发送数据。
在侦听机器上运行 netcat 并尝试从 scapy 发送单个数据包失败,因为您的机器 (A) 无法与运行 netcat 的机器 (B) 同步。
IP 10.22.4.45.20 > 10.1.2.3:1234: Flags [S], seq 0:7, win 8192, length 7
IP 10.1.2.3:1234 > 10.22.4.45:20: Flags [S.], seq 2668993358, ack 1, win 14600, options [mss 1460], length 0
IP 10.22.4.45:20 > 10.1.2.3:1234: Flags [R], seq 1, win 0, length 0
如您所见,机器 B (netcat) 尝试与您的机器同步确认,但是由于您只是向它发送了一个数据包并且没有监听返回的 SYN-ACK,因此您的机器会生成一个 RST(重置)并且尝试的连接在 3 次握手完成之前被关闭。
有两种选择。要么使用无连接且不需要此连接设置的 UDP,要么进行完整的 TCP 握手。如果您选择后者,Scapy 有几种方法可以帮助您管理 TCP 会话创建:http: //trac.secdev.org/scapy/wiki/TCP