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

来源:互联网 发布:软件宣传推广 编辑:程序博客网 时间:2024/05/14 06:07

这是个网络编程面试的重点知识点,总结一下:

建立连接——三次握手

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):
这里写图片描述

0 0
原创粉丝点击