建立连接
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
通俗解释
第一次握手是客户端发给服务器建立链接的请求,叫做SYN(syn=j)。
如果路上没有发生意外,服务器成功收到这个请求,于是反馈给客户端一个确认信号ACK(ack=j+1),表示对第一次握手成功的确认,同时发送一个SYN(syn=k)信号来测试从服务器到客户端的路是否通畅,这是第二次握手。
如果返程也没有意外发生,客户端成功收到这个ACK+SYN信号,证明返程也通畅,这是第三次握手。服务器可以向客户端发送数据。
相当于第一次握手发出请求,第二次握手确认收到了第一次握手证明来路通畅,并发送一个确认返程是否通畅的信号,客户端收到后发给服务器一个确认信号告诉它返程通畅可以发送数据了,如果没有第三次握手,则服务器不知道第二次握手是否成功,也就是不知道返程是否通畅,不能发送数据。
关闭TCP连接:改进的三次握手
对于一个已经建立的连接,TCP使用改进的三次握手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下:
第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。
第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。
第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。