TCP三次握手和四次挥手详解

在建立TCP的过程中,会用到三次握手和四次挥手,三次握手和四次挥手到底是什么?在哪里用到?
在这里插入图片描述

TCP握手为什么是三次?

两次不安全,四次没必要。SYN请求目的是为了确定对方是否具有数据收发的能力,得到ACK响应,则认为对方在线。

  1. 若两次就能建立连接,则万一客户端发送了多次SYN,就都会建立连接,浪费资源。
  2. 有可能客户端发送请求后退出,服务端建立的套接字就会占用资源(受TCP保活机制影响)。
TCP挥手为什么是四次?

发送FIN请求后,不表示完全断开连接,只能表示主动关闭方不再发送数据了,而还有可能继续接收服务端发送的数据。因此被动关闭方进行ACK回复后,还有可能继续发送数据,只有不再发送数据了才会发送下一个FIN包。

通过底层原理来了解一下三次握手是如何建立的

在这里插入图片描述
第一次握手
整个过程是由客户端发起的,也就是connect,将SYN置为1,SYN就是建立时用来同步序号的,seq是客户端随机的一个值,代表传输的序号。发送完毕客户端进入SYN-SENT状态。
第二次握手
服务器端在接收到数据之前一直处于LISTEN状态,接收到消息后,会给客户端回一条消息进行第二次握手,这时SYN置为1,用于建立连接,ACK=1,这个是确认用的,只有ACK=1时确认序号才会生效,ack也就是确认序号=x+1,就是客户端发给服务器端的序号加1,并生成一个随机的序号y,然后将这条消息发送给客户端,发送完毕进入SYN-RCVD状态。
第三次握手
客户端接收到服务器端的回复后,会给服务器端回一条确认消息,发出消息后客户端就意味着三次握手已经完成,所以消息中SYN没有置为1,只是确认信息,ACK=1,确认序号ack=y+1。算上第一次客户端给服务器端发消息,这是第二次,第一次seq=x,所以这次是seq=x+1。发送完消息进入ESTAB-LISHED状态。注意seq只是一个序号,只是第一次随机生成的,生成后,以后每次发消息都是加1,最大为65535,达到这个数字后又重新从0开始。

四次挥手是如何发生的

在这里插入图片描述

第一次挥手
客户端发起第一次挥手,FIN置为1,序号seq是传输数据的最后一个序号值加1,为u,发送完后客户端进入FIN-WAIT-1状态。
第二次挥手
服务端接收到客户端的关闭消息后,会通知应用程序关闭,然后会给客户端回一条确认消息,ACK置为1,确认序号ack=u+1,本次消息的序号为seq=v,发送完消息后,进入CLOSE-WAIT状态。客户端接收到服务端的确认信息后,进入FIN-WAIT-2。
需要注意的是进入CLOSE-WAIT状态的服务端还是可以给客户端发送消息的,客户端也可以接受到服务端发送的消息。
第三次挥手
服务端被动关闭,这时会给客户端发送一条关闭确认信息,FIN置为1,ACK=1,确认序号不变,还是u+1,由于可能在半关闭状态下服务器可能给客户端发送了一些消息,所以本次消息序号为w。发送完毕后服务器端进入LAST-ACK,等待确认。
第四次挥手
客户端收到服务器端的关闭消息后,会回一条确认信息,ACK=1,ack=w+1,seq=u+1。服务端接收到确认信息后会马上关闭套接字,释放资源。而客户端会在2MSL后关闭套接字,释放资源。

TIME_WAIT状态有什么用?为什么主动关闭方没有直接进入closed释放资源?

假设主动关闭方最后一次回复的ACK丢失,被动关闭方没有收到最后一次ACK,超时后就会重传一个FIN。

假设客户端没有TIME_WAIT直接释放资源,就有可能启动新的客户端使用与之前客户端相同的地址信息。

  1. 刚启动新的客户端绑定地址成功,此时若收到被动关闭方重传的FIN包,会对新连接造成影响。
  2. 新启动的客户端,若是向相同的服务端发送SYN,因为服务端处于LAST_ACK要求的是ACK而不是SYN,因此就会发送RST。

所以若主动关闭方最后一次回复后直接释放资源,就有可能对新启动的新连接造成影响,因此必须等待一段时间,能够处理有可能重传的FIN包。

等待的时间多长比较合适?2个MSL时间。MSL:报文段最大生存时间。

MSL:报文段最大生存时间

报文段最大生存时间默认为120S,《TCP/IP详解》。也可以进行修改报文段最大生存时间。

发送方发送的TCP报文如何从网络当中消失?

  1. 被接收方在报文段最大生存时间内接收了
  2. 在报文段最大生存时间内,耗光了TTL,导致被转发设备丢弃

TTL:报文的最大跳数,即当前这个报文最大可以经过多少转发设备。
没经过一个转发设备,TTL就进行减1,直到TTL减为0还没有到达目标主机,则被转发设备丢弃。

为什么要等待2MSL?

2MSL = 主动关闭方确认报文的MSL + 有可能被动关闭方重传的FIN报文的MSL

如果只等待1MSL,则意味着如果当主动关闭方发送的ACK包丢失,则一定不会受到被动关闭方重传的FIN包。此时被动关闭方的状态还是处于LAST_WAIT状态,资源没有得到释放。

如果TCP三次握手失败,服务端如何处理?
  1. 没有收到SYN,什么都不做
  2. 回复了SYN+ACK,但是长时间没有收到ACK响应,则超时后发送RST重置连接报文,释放资源
一台主机上出现大量的TIME_WAIT是什么原因?如何处理?

TIME_WAIT是主动关闭方出现的,一台主机出现大量的TIME_WAIT证明这台主机大量的主动关闭了连接,常见于一些爬虫服务器。

调整TIME_WAIT等待时间,也可以使用开启地址重用的套接字选项:setsockopt

地址重用:允许套接字绑定使用中的地址端口,常用于防止socket处于TIME_WAIT无法使用相同地址信息进行绑定新的套接字。

一台主机上出现大量的CLOSE_WAIT是什么原因?如何处理?

CLOSE_WAIT是被动关闭方收到FIN请求进行回复之后的状态,等待上层进行进一步处理,若出现大量CLOSE_WAIT,有可能是被动关闭方主机上程序中忘了最后一步断开连接后调用close释放资源。

TCP连接管理中的保活机制

TCP通信中,若两端长时间没有数据往来,则这时候每隔一段时间,服务端向客户端发送一个保活探测数据报,要求客户端进行回复,若连接多次没有收到响应,则认为连接断开。

长时间没有数据往来:默认7200S,可配置,通过设置套接字选项配置
每隔一段时间:默认75S,可配置,通过设置套接字选项配置
连续多次无响应:默认9次,可配置,通过设置套接字选项配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值