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

TCP连接的三次握手和四次挥手

2016-04-29 10:01 309 查看
最近参加了几次面试,那些大公司问的问题都绕不开TCP话题,那么就来说说Tcp的三次握手和四次挥手。

Tcp是面向连接的协议,所以在双方交换数据之前,需要先建立一条连接。

文章下面所列的客户端和服务端并非绝对,而是指主动建立连接或主动关闭连接的一方为客户端,另一方为服务端。

连接的建立——三次握手:

第一次握手:客户端向服务端发送带SYN(syn=x)标识的报文,发送后客户端状态变为SYN_SENT状态,等待服务端确认;

第二次握手:服务端收到客户端发送过来的带有SYN标识的报文,服务端将发送ACK报文(ack = x + 1)和SYN报文(syn = y),(ACK表示做出回应,收到SYN报文,并且发送一个新的SYN报文),服务端状态变为SYN_RECV状态。

第三次握手:客户端收到服务端回应的ACK+SYN报文,作出回应向服务端发送ACK报文(ack = y + 1),客户端发送完该报文之后变为ESTABLISH状态,服务端收到该报文后也变为ESTABLISH状态。此时三次握手完成,连接已建立,双发可以交换数据。

连接的断开——四次挥手:

由于TCP是全双工的,因此每个方向都必须进行单独的关闭。这个原则就是当一方完成数据传送之后便发送一个FIN报文来终止这个方向的连接。

第一次挥手:客户端完成自己的数据传送任务后,客户端向服务端发送带FIN标识的报文(fin = x),用来关闭客户端向服务端方向的数据传输,此时客户端的状态变为FIN_WAIT1。

第二次挥手:服务端收到客户端的发来的FIN报文后,执行被动关闭,立即回应一个ACK报文(ack = x + 1),表示已收到客户端的断开连接请求,此时服务端的状态变为CLOSE_WAIT。客户端收到服务端发来的ACK报文后,状态变为FIN_WAIT2。

第三次挥手:服务端在完成向客户端的数据传输之后,向客户端发送新的FIN报文(FIN = y),表示已完成数据传输,此时服务端的状态变为LAST_ACK。

第四次挥手:客户端在收到服务端发来的FIN报文之后,客户端会向服务端发送一个ACK报文(ack = y + 1),此时客户端的状态变为TIME_WAIT,在服务端收到ACK报文之后,状态变为CLOSED,客户端在等待足够长的时间之后,状态改变为CLOSED。此时双方的连接断开。四次挥手完成。

—————————————————————————————————————————————————————————————————————————————

在面鹅厂后台开发时候,面试官问了我一个状态代表的含义,我感觉自己说得不是很好,回来查阅了一些资料,整理了一下。

我其实是搞JAVA的,面鹅厂可能注定我会悲剧。

—————————————————————————————————————————————————————————————————————————————

常见的客户端、服务端的状态所代表的含义:

LISTENING:监听来自远程TCP端口的连接请求。

SYN_SENT:客户端状态,表示已发送连接请求等待匹配的连接请求。

SYN_RECV:服务端状态,表示连接请求已收到,等待对方对连接请求的确认。

ESTABLISH:表示连接已建立,正在传送数据。

FIN_WAIT1:客户端状态,等待远程TCP的连接中断请求,或者先前的连接中断请求的确认。

CLOSE_WAIT:服务端状态,等待连接关闭。

FIN_WAIT2:客户端状态,等待来自远程tcp的连接中断请求。

LAST_ACK:服务端状态,等待客户端最后的连接中断确认。

TIME_WAIT:客户端状态,等待足够长的时间,用于确保服务端的连接已关闭。

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