握手包 tcp 二次握手时延_网络协议从入门到上瘾模拟三次握手

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

>>> ans = sr1(IP(dst='180.101.49.11')/TCP(dport=80,sport=9527,seq=110,flags='S'),verbose=False)

在学习网络协议的三次握手理论过程中,通常会使用Wireshark抓包TCP的三次握手包来进行说明。本文通过使用Scapy和Wireshark对三次握手过程进行握手包级的模拟,以此消除对三次握手的神秘感。使用Scapy发送SYN包:

>>> ans>>

其中,sr1表示发送三层数据包并接收应答包,IP层的目的地址是180.101.49.11(百度IP地址),TCP协议的目的端口是80,源端口9527,序号110,flags值为S(表示SYN包)。Wireshark抓包截图如下:

从上图中可以看出,协议是TCP,SYN包源端口时9527,目的端口时80;序号是110。详情如下图所示:

响应数据包源地址180.101.49.11,目的地址10.10.0.138,源端口80,目的端口9527,序号583771928,ack是111(第一次握手包seq我们设置为110,所以响应ack是110+1=111)。Wireshark抓包详情如下所示:

使用Scapy构建握手包:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP

其中,ack是响应包seq加1,即响应端已发送包序号加1,seq是响应包的ack。Wireshark抓包详情如下所示:

>>>send(IP(dst='180.101.49.11')/TCP(dport=80,sport=9527,ack=ans[TCP].seq+1,seq=ans[TCP].ack,flags='A'),verbose=False)

二次握手包的seq值是583771928,所以三次握手包的ack是583771929;三次握手包的seq是111,即二次握手包的ack。经过上述实操,相信对TCP的三次握手全流程有了更加深刻的认识。估计没有人能比你更加形象的认识三次握手经过。

可能遇到的问题

上述实验是在Windows环境下,使用Scapy和Wireshark进行操作的。如果没有对操作系统和Wireshark进行调整,很可能得不到上述结果。

如果Windows没有打开防火墙,往往Wireshark会收到RST包:

针对这种情况,Windows系统打开防火墙即可解决。Linux可使用iptables把RST包丢弃也可解决,命令如下:

发生此问题的深层次原因是我们使用raw socket处理握手报文时,TCP套接字没有处于listen状态。操作系统内核针对这种情况一般是提前发送RST中断该链接。

通过Scapy构建的SYN包的序号默认值是110,但是Wireshark抓到的包却显示为0,截图如下所示:

发生这种现象的原因是Wireshark自身机制导致的。Wireshark通常显示的都是相对序列号/确认号,而不是实际序列号/确认号,相对序列号/确认号是和TCP会话的初始序列号相关联的。

如果想要关闭相对序列号/确认号,可以选择Wireshark菜单栏中的 Edit -> Preferences ->protocols ->TCP,去掉Relative sequence number后面勾选框中的√即可。

小结

本文演示了如何使用Scapy构建握手包模拟TCP三次握手经过,并对实验过程中可能出现的意外情况进行了说明。

赞(0)