三次握手
-
先
ping
域名为www.baidu.com,便于DNS
解析。ping
走的协议就包括DNS
、ARP
和ICMP
。 -
接着使用
Wireshark
去抓包,抓包这里导航栏直接过滤ip
就可以了,输入ip.host == 183.232.231.174
-
接着直接在浏览器输入百度域名www.baidu.com访问请求,Wireshark就能抓取包来分析了
-
这里我们可以看到,本地通过
ipconfig
就可以看到source
那一列为自己的ip
地址,而且是客户端为前后各一次,服务端是第二次。-
第一次为
SYN
标记请求,全英文名我的理解是Synchronized
,即为同步,表示同步连接请求;
-
第二次为
SYN
+ACK
组合标记请求,准确来说是两次请求(SYN
第一次,ACK
第二次),只不过优化对它进行合并了,SYN
也表示连接,显而易见,想建立连接两方都要与对方发送同步包请求连接,ACK
表示百度接收到了你的同步包,但怎么告知人家?用ACK = SYN(第一次握手的Sequence) + 1
,算是一种默契,你收到该包后客户端完成了连接,但百度还未连接成功;
-
第三次为
ACK
标记请求,百度第二次握手发了一个ACK
标记,说明这个包是对你前一个包的回应,由前两个图可知。剩下的一个SYN
标记,是表明这个包也是一个连接请求包,需要你发回ACK
包,即表明我收到了,但得告知你,最后你收到后,你也成功完成连接。
-
四次挥手
-
三次挥手需要客户端与服务端断开连接,我这里使用vmware去连接虚拟机centos来演示。跟三次握手一样,你要抓那个网络的包,你就要在这个网络中去连接,比如我的是
192.168.10.1
这个,用这个通过子网分配给了一台虚拟机192.168.10.100
-
通过
xsell
连接后,使用命令init 0
来断开连接,这会让服务器和客户端都断开连接。分清楚我是虚拟机,服务器是虚拟适配器VMnet8
,因为我是在虚拟机里主动命令断开的。抓取信息如下:(将FIN
顺带的ACK
忽略,就是标准的四次挥手)-
第一次为
FIN
标记请求,表示自己要断开连接了,不会再发送消息。 -
第二次为
ACK
标记请求,表示服务器收到了,然后服务器不再接收消息,但还是会发送消息,所以这是还未发送FIN
包。从这个时候我还是可以接收服务器的消息的,所以我这边还不能断开。 而有些不用接收数据就可以是三次挥手,是将ACK
与FIN
结合一起,如上图就是,只不过是发FIN
请求时带上了ACK
,但第一次还是发了ACK
,才不会让对方以为没收到导致重发,这样才不会对网络造成阻塞。
-
第三次为
FIN
标记请求,这时FIN
表示服务器收到我要断开连接的消息,那它也准备断开连接了,不再发送消息,那我也不必再接收了,于是我就完成挥手,原则上是可以断开了,但服务端还不知情,还是不能断开。这里要注意,其实第二次与第三次之间应该还是有很多次请求,这些请求是消息的发送和接收,不算入断开连接中的挥手,而且这些请求都跟第二次挥手以及本次挥手的Acknowledgment number
相同。
-
第四次是
ACK
标记请求,就是我要告知VMnet8
我已经完成挥手了,你可以断开了。VMnet8
收到就可以立即断开,而我等待2MSL
时间内没收到服务端重发包就可以断开。因为MSL
即为包在网络中的最大生存时间,我发一次和对方未收到超时重发。
-