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

TCP的三次握手和四次挥手

2016-04-21 13:22 281 查看
今天介绍下TCP协议的三次握手和四次挥手:

一:TCP三次握手:



过程详解:


1:第一次握手:原始状态为Closed。Client将SYN标志置1,随机产生序列号seq=J.发送数据包后,Client进入SYS_SENT状态。

2: 第二次握手:Server收到数据包后由标志位SYN=1知道Client建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

3:如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发 送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

二:TCP四次挥手:



  过程详解:


1:第一次挥手:原始Client状态为Established,Client发送FIN,Client

进入FIN_WAIT_1.

2:第二次挥手:Server收到数据报后,发送ACK,确认序列号为发送序列号加一(和SYN类似)。Server进入CLOSE_WAIT状态。客户端收到ACK后进行验证,无误后进入FIN_WAIT_2状态。

3:第三次挥手: Server发送FIN用来关闭与Client连接,Server进入

LAST_ACK状态。

4:第四次挥手:Client收到FIN后,然后发送ACK进入TIME_WAIT状态(等待2MSL),如果2MSL依然没有收到Server的重发的FIN则表明Server已经关闭,则主动关闭端也进行关闭,Server收到确认后进入Closed状态。

常见面试问题:

1:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

2:为什么主动关闭一端在TIME_WAIT状态后要2MSL?

因为网络是不可靠的,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: