过程如下:
1、浏览器向目的主机发出TCP连接结束请求报文,此时进入FIN WAIT状态;
2、该报文FIN标志位设为1,表示结束请求;
3、TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
4、目的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文;
5、当前只是进行回应,因为目的主机可能还有数据要传,并不急着断开连接;
6、该报文中ACK标志位设为1,表示收到结束请求;
7、目的数据发送完所有数据后,向我的主机发出TCP连接结束请求报文;
8、该报文FIN标志位设为1,表示结束请求;
9、TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->我的主机;
10、我的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文,此时进入TIME WAIT状态,因为不相信网络是可靠的,如果目的主机没收到还可以重发;
11、该报文中的FIN标志位均设为1,表示结束应答;
12、该TCP回应报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
13、目的主机关闭连接;
14、TIME WAIT等待结束后,没有收到回复,说明目的正常关闭了,我的主机也关闭连接。
这里的过程是以我的主机主动发起结束请求开始的,实际上也可以由目的主机主动发起,那么过程就会跟上面相反,但细节差不多。
FIN_WAIT状态是主动发起请求时等待确认信息,而TIME_WAIT状态是收到结束请求后发送确认信息后等待看是否需要重发。
现在来说说为什么断开连接时需要四次挥手呢?因为建立连接时目的主机可以直接发送SYN(同步) ACK(应答)报文。而当断开时,目的主机收到FIN后可能还有数据要发,并不一定直接断开,所以先发送一次应答,告知我的主机收到了请求,等确认所有数据都发完了,再发送FIN,同时等待我的主机应答,这里的FIN和ACK就不能一起发送,所以需要四次。
4.2.5总结一下:
以上就是主机访问网站时的网络通信全过程,归纳起来就是:
首先要通过域名找到IP,如果缓存里没有就要请求DNS服务器;得到IP后开始于目的主机进行三次握手来建立TCP连接;连接建立后进行HTTP访问,传输并获取网页内容;传输完后与目的主机四次挥手来断开TCP连接。