通俗易懂理解TCP连接时的三次握手和释放时的四次握手

TCP和UDP相比,能够保证数据传输的完整性,这就依赖于TCP连接时client和server的三次握手。先上图,图丑了点见谅。

TCP通道在建立以前,需要三次握手:

 

(1) 客户端发送一个包含SYN标志的TCP报文,同步报文指明客户端所需要的端口号和TCP连接的初始序列号

 

(2) 服务器收到SYN报文之后,返回一个SYN+ ACK报文,表示客户端请求被接受,TCP初始序列号加1

 

(3) 客户端也返回一个确认报文ACK给服务器,同样TCP序列号加1

 

(4) 如果服务器端没有收到客户端的确认报文ACK,则处于等待状态,将该客户IP加入等待队列,然后轮训发送SYN+ACK报文

 

下面说连接释放时的四次握手过程,见丑图

同样可以把FIN理解成释放连接(关闭端口)的消息,ACK任然是回复的消息这个过程我解释一下:Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。(参考了这篇博客http://blog.csdn.net/whuslei/article/details/6667471/)。

我们对比三次握手和四次握手(把SYN和FIN都看做是请求就好了),建立连接的第二次握手是同时返回请求SYN和ACK,而断开连接时,是先回复了ACK,告诉client我接收到了你断开连接的请求,但由于各种原因,我现在还不能立即断开(比如数据没有传输完),当我可以断开连接时会 给你发FIN请求的,所以当server发送第三次握手的FIN消息时,代表server已经做好断开连接是准备了。当client收到server发送的FIN消息时,返回serverACK回复表示我知道你可以断开连接了,然后就断开了连接。(这段话可以用来回答为什么连接的时候是三次握手,关闭的时候却是四次握手)

除此之外,要有一个等待时间要提一下:如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值