使用WireShark查看TCP连接和断开过程

TCP连接三次握手过程

机器A向机器B发送建立连接请求的过程:

  1. A向B发送: SYN=1 Seq=随机生成的数字i。A进入SYN_SENT状态。
  2. B收到A发送的消息:从SYN=1知道A想要和B发送请求。于是B向A发送:SYN=1,ACK number= i+1 ,ACK=1,seq=随机生成的数字j。B进入SYN_RECV状态。
  3. A收到B发送的应答消息,发现SYN=1 ACK=1,则A向B发送ACK=1。A进入ESTABLISHED状态,三次握手完成。

使用Wireshark抓包三次握手进行分析

1.打开Wireshare,在黄色标签右侧输入http表示过滤http协议相关数据包,然后双击选中的网卡,我的电脑上网使用的是wlp3s0这个网卡。
使用WireShark查看TCP连接和断开过程

2.在浏览器中输入www.baidu.com访问百度。

3.选择有GET请求这一行,右键—>追踪流->TCP流。

使用WireShark查看TCP连接和断开过程

4.这个时候就可以看到TCP的三次握手了。
使用WireShark查看TCP连接和断开过程

5.首先我们的主机向220.181.57.216发送包,可以看到FLAGS是SYN(SYN=1),Sequence Number=0(seq=0).
使用WireShark查看TCP连接和断开过程

6.第二次握手220.181.57.216向我们发送FLAGS(SYN,ACK),Ack number=1 (也就是seqA+1),Seq=0

使用WireShark查看TCP连接和断开过程

7.第三次握手 我们向220.181.57.216发送 FLAGS:ACK,ACK number=1,这样就建立TCP连接了。
使用WireShark查看TCP连接和断开过程

TCP四次挥手过程

使用字母C代表客户端,使用字母S代表服务端。客户端和服务端都可以主动断开连接,这里我们假设客户端主动断开连接。

  1. C向S发送报文FIN(请求断开连接),然后进入FIN_WAIT1状态。(第一次挥手)
  2. S收到FIN报文之后首先向C发送ACK报文表示收到C发送的FIN,然后S进入CLOSE_WAIT状态(第二次挥手)。
  3. C收到S的ACK报文之后进入FIN_WAIT2状态。
  4. S继续把没有发送完的数据发送完之后向C发送FIN报文告诉C我准备好断开连接了,S进入LAST_ACK状态(第三次挥手)。
  5. C接收到S发送的FIN报文之后给S发送一个ACK报文(第四次挥手),S接收到ACK报文之后就进入CLOSE状态表示连接断开了,C进入TIME_WAIT状态等待一段时间后S没有打过来新的报文那么C也进入Close状态表示连接断开。

(四次挥手的过程中也使用了seq和ack number这里就不说了,只要知道它们是用来标明包循序的就可以。个人理解这里使用seq是为了使某个ACK和某个Seq一一对应)

使用Wireshark抓包四次挥手进行分析

还是用上面三次握手抓到的数据,滚动到最下面就可以看到四次挥手的包。

使用WireShark查看TCP连接和断开过程

最后说一个从网上看到的面试题目:

为什么机那里连接使用三次握手,断开连接使用四次握手?

建立连接:

  1. A->B:发送SYN
  2. B->A:发送 SYN,ACK
  3. A->B:发送 ACK

断开连接:

  1. A->B:发送FIN
  2. B->A:发送 ACK
  3. B->A:发送 FIN
  4. A->B:发送 ACK

建立连接的2步骤被拆解为断开连接的2,3步骤,因为断开连接的时候有可能Server端还在发送数据所以Server端只能先回复ACK然后等发送完数据之后再发送FIN报文。