三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。
第一次握手([SYN], Seq = x)
客户端发送一个SYN标记的包,Seq初始序列号x,发送完成后客户端进入SYN_SEND状态。
第二次握手([SYN,ACK], Seq = y, ACK = x + 1)
服务器返回确认包(ACK)应答,同时还要发送一个SYN包回去。ACK = x + 1,表示确认收到(客户端发来的Seq值 + 1),Seq = y, 表示让客户端确认是否能收到。发送完成后服务端进入SYN_RCVD状态。
第三次握手([ACK], ACK = y + 1)
客户端再次发送确认包(ACK),ACK = y + 1, 表示确认收到服务器的包(服务端发来的Seq值 + 1)。客户端发送完毕后,进入ESTABLISHED状态,服务端接收到这个包,也进入ESTABLISHED状态, TCP握手结束。
这里我使用一台windows和一台kali虚拟机来测试
1.首先在windos虚拟机上安装web服务器功能(为了后续建立连接)
2.开启kali虚拟机并打开wireshark准备抓包
3.直接终端探测一下windows系统的80端口
4.wireshark抓包结果如下
1.当前客户端(192.168.187.134)向服务器(192.168.100.245)发送SYN标记的包,seq=0
2.服务器(192.168.100.245)返回一个[SYN,ACK]的流量包给客户端(192.168.187.134)
3.客户端(192.168.187.134)收到后再次发送一个ACK确认包给服务器(192.168.100.245),双方正式建立连接
4.在windows系统我们可以在终端使用netstat -ano命令查看端口情况
可以看到状态为ESTABLISHED,ESTABLISHED表示建立连接,两台机器正在通信