相比于socket的udp传输协议来讲,tcp在数据的传输过程中可以保证数据的安全和稳定,这些都是由于tcp本身的特性所决定的:在建立连接时的三次握手,在数据传输过程中对数据的实时校验,以及在断开连接时客户端与服务器的四次挥手。正是有了这些通信过程的校验,使得tcp可以安全地为用户传输数据。下图为tcp完整的通信过程解析。
在最初,客户端与服务器还没有建立连接。此时,服务器的accept处于阻塞的状态,一直在等待新的客户端连接;而客户端的connect连接服务也处于阻塞状态,等待用户主动向客户端发起连接请求。
当客户端主动连接服务器,connect启动,这是三次握手中的第一次:客户端向服务器发送了SYN请求,并发送了一个随机的数据''seq=x'';
若服务器收到客户端的请求信息,会向客户端回复信息,这是第二次握手:服务器在客户端发来的数据基础上发了一个新的ACK,并将客户端的发送来的SYN信息改为:‘’seq=y‘’,发送到客户端;
客户端收到服务器的反馈信息后,确认数据的一致性,然后再向服务器反馈ACK的值:‘’y+1‘’,此时服务器收到客户端的消息,在确认数据正确后,完成第三次握手。到这时,客户端与服务器正式建立了连接,可以进行数据的传输与发送了。
一般在面试中,可以将tcp的三次握手总结为一句话:客户端发出SYN连接请求,服务器返回ACK应答并且有新的SYN请求,然后客户端返回ACK应答给服务器。
在理解四次挥手的时候,由于tcp是全双工的传输协议,可以假想客户端与服务器之间,具有一个双线的连接通道。
客户端A发送一个“FIN”报文段给服务器B,其中该报文中的FIN标志位被置为1;
服务器B收到了FIN报文段后,它会向客户端发送“ACK”报文段,表示允许断开该TCP连接了。同时它还会通知高层应用程序,客户端已经请求释放连接。此时客户端已经不再会给服务器发送数据了,但是服务器到客户端的TCP连接还没有断开,所以服务器还是可以向客户端发送数据,此时状态称为“半关闭状态”;
当服务端的高层程序已经没有数据要发送了,它会通知TCP可以断开连接了,这时候,服务器就会向客户端发送FIN报文段;
客户端收到FIN报文段后,客户端会发送“ACK”报文段给服务器,同时客户端会进入一个叫“TIME-WAIT”的状态,需要再等待两个报文寿命(MSL)时间后,才进入最后的“CLOSE”状态。
当然,tcp的四次挥手也可以总结为一句话:客户端发出断开连接请求FIN,然后服务器给出ACK应答给客户端,然后服务器向客户端发出断开连接请求,然后客户端向服务器返回ACK应答。