TCP握手与挥手

一、为什么需要三次握手

刚开始学习TCP三次握手的时候,搞不懂为什么要三次握手,两次为什么会有问题。但如果client发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞

留着,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文后,就误认为是client再次发出的新的连接请

求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就有建立了。由于现在client并没有发出建立连接的请求,因

此不会理睬server的确认,也不会向server发送数据。然而server却以为新的连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。所以,采

用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有建立连接。所以,三次握

手的主要目的是防止server段一直等待,浪费资源。

二、为什么需要四次挥手

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。就好比两人打电话,只有在双方都说再见后才能挂断,如果只有一方说再见,另一方没有回应,很可能造成

信息传输不完整。那么TCP的四次握手,是为了保证通信双方都关闭了连接,具体过程如下:


1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送;

2)服务器B收到这个FIN,他发回一个ACK,确认序号为收到序号加一,和SYN一样,一个FIN将占用一个序号;

3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A;

4)客户端A发回ACK报文确认,并将确认序号设置为收到序列号加一。

关闭连接时,当收到对方的FIN报文通知时,他仅仅表示对方没有数据发送给你了,但是你还可以给对方发送数据,也有这种可能,你还有一些数据在传给对方的途中,所

以你不能立马关闭连接,又或者,你还有一些数据需要传输给对方后,(再关闭连接)再发送FIN报文给对方来表示你同意现在可以连接了,所以它这里的ACK报文和FIN报文

多数情况下都是分开发送的。

三、主动断开链接的一方为什么要进入TIME_WAIT状态


这是因为虽然双方都同意关闭连接了,而且握手的4个报文协议也都协调和发送完毕,按理说可以直接回到CLOSED状态(就好比SYN_SEND状态到ESTABLISH状态那

样);但是因为处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以TIME_WAIE状态的作用就是用来重发可能丢失的报文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值