您的位置:首页 > 理论基础 > 计算机网络

TCP的三次握手与四次握手过程及状态转换

2016-02-11 17:51 435 查看
这是个网络编程面试的重点知识点,总结一下:

建立连接——三次握手

TCP通过三次握手建立服务器与客户端之间的连接。

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个数据包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。

在socket编程中,服务器首先调用socket、bind、listen和accept,并阻塞于accept,当客户端调用connect时,将触发三次握手过程。

第一次握手:客户端调用connect发送一个SYN数据包给服务器,并进入SYN_SENT状态,等待服务器的确认;

第二次握手:服务器收到客户端发来的SYN数据包,必须发回确认包(ACK)应答,同时自己也发送一个SYN包给客户端,此时服务器进入SYN_RCVD状态;

第三次握手:客户端收到服务器的数据后connect返回,进入ESTABLISHED状态,并向服务器发回确认包ACK,服务器接收到这个ACK后accept返回,也进入ESTABLISHED状态。

至此,三次握手完成,服务器和客户端就建立起了连接。上述过程图示如下:



终止连接——四次握手

TCP通过四次握手终止服务器与客户端之间的连接,一共需要发送四个数据包。

第一次握手:客户端或服务器调用close发起主动关闭,我们以客户端为例,客户端发送一个FIN给服务器,并进入FIN_WAIT_1状态;

第二次握手:服务器收到FIN后发送一个确认包ACK到客户端,并进入CLOSE_WAIT状态,客户端接收到ACK后进入FIN_WAIT_2状态;

第三次握手:经过一段时间,服务器做好了关闭连接的准备工作,然后调用close(代码主动调用或由内核调用)给客户端发送一个FIN,并进入LAST_ACK状态;

第四次握手:客户端收到服务器的FIN后发送ACK给服务器,然后进入TIME_WAIT状态,服务器接收到这个ACK后进入CLOSED状态。

至此四次握手完成,客户端与服务器间的连接被终止,图示如下(左边client,右边server):

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: