三次握手
-
先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即为包在网络中的最大生存时间,我发一次和对方未收到超时重发。
-