其实作为一个刚开始接触运维或者互联网行业的学生来说,在面试过程中难免会遇到一个很常见的问题:你知道TCP的三次握手四次挥手原理吗,怎么去解释它或者怎么去论证它是否是对或者错
这个图是不是很乱,左右两列,左边客户端,右边服务端,解释了tcp三次握手四次挥手的全过程,所涉及到的状态如下:
LISTEN:服务器在没收到客户端发来的讯息时一直处于这个状态
SYN-SENT:在客户端发完连接请求后,等待服务器回包时候的状态
SYN-RCVD:在回完syn+ack的包后服务器等待客户端确认的状态
ESTABLISHED:在客户端给服务端发送完确认包后双方都进入的状态
FIN-WAIT-1:客户端发送完断开连接的包后等待服务器确认的状态
CLOSE-WAIT:服务器收到了客户端的断开请求后发送完ack包后的状态
FIN-WAIT-2:在收到了服务器的确认包后客户端进入的状态
LAST-ACK:向客户端发送了一个断开连接的讯号(你确定?我真的要断开了)
TIME-WAIT:客户端发送完ack(我真的确认断开)后进入的状态
CLOSED:收到了客户端的确认讯息后果断关闭服务资源,服务器的状态
我们用wireshark来做一个三次握手的实验,Windows下的,比较直观
打开wireshark, 打开浏览器输入 http://www.cnblogs.com/
在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream",
这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图
图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。
第一次握手数据包
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图
第三次握手的数据包
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图: