这是我在ensp上搭建的小实验,并通过Wireshark抓包观察TCP握手过全过程;
服务器配置
图2
客户端访问
图3
抓包观察
三次握手
图4
1)第一次握手
TCP 协议规定,SYN 置 1 的报文段不能携带数据,但是要消耗一个序号
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;
图5
2)第二次握手
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
图6
3)第三次握手
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,也通知其上层应用进程:TCP连接已经建立,客户端与服务器才正式开始传送数据。
四次挥手
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
TCP 的标准规定,FIN报文即使不携带数据信息,也需要消耗一个seq
图7
图8
1)第一次挥手
客户端给服务端发送TCP包,用来关闭客户端到服务端的数据传送,FIN=1,ACK=1,seq=158,ack=308。
图9
2)第二次挥手
服务端收到客户端的FIN报文段后,回应一个应答,ACK=1,seq=308,ack=159,及y+1。
图10
3)第三次挥手
客户端口连接已释放,第三次握手是服务器端释放连接表示我的数据已经传输完了,发送FIN报文段,FIN=1,ACK=1,seq=308,ack=159。
图11
4)第四次挥手
客户端收到服务端的FIN报文后,回应应答,发回ACK确认,ACK=1,seq=159,ack=309。
end