网络之tcp三次握手和四次挥手

1、TCP的三次握手
三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态(发送状态),等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态(接受状态);
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入连接状态,即连接成功,完成三次握手。

2、TCP的四次挥手

3、四次挥手的过程。

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。
客户端或服务器均可主动发起挥手动作。
  • 客户端进程发出连接释放报文,并且停止发送数据,此时,客户端进入终止等待状态1。(第一次挥手)
  • 服务器收到连接释放报文,发出确认报文,此时,服务端就进入了关闭等待状态。(第二次挥手)
  • 客户端收到服务器的确认请求后,此时,客户端就进入终止等待状态2,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
    服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,此时,服务器就进入了最后确认状态,等待客户端的确认。(第三次挥手)
  • 客户端收到服务器的连接释放报文后,必须发出确认,此时,客户端就进入了时间等待状态。注意此时TCP连接还没有释放。必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCP后,才进入CLOSED状态。(第四次挥手)
  • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCP后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
4、面试中关于tcp三次握手,四次挥手的问题?

(1)为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当客户端发起连接请求的时候,服务器端可以立即发送应答返回,而当客户端要断开连接的时候,发送给服务器端一个断开连接的请求,而服务器端此时可能还没有发送完数据,所以要先发送一个确认收到的消息告诉客户端说我知道了,然后等待数据发送完毕的时候,再发送给客户端一个ok我发送完数据了,这就断开连接。所以会多一次。

(2)为什么TIME_WAIT状态(时间等待状态)需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
按道理,四个报文都发送完毕,就可以直接进入CLOSE状态了。但事实是服务器端可以立即进入close状态而客户端不行,必须假象网络是不可靠的,有可能最后一个ACK丢失(即客户端最后发送的确认包)。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

(3)为什么不能用两次握手进行连接?
3次握手完成两个重要的功能,既要双方做好发送数据和接收数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
如果把三次握手改为两次,则可能发生死锁:客户端向服务器端发送请求分组,然后服务器端接收到请求分组,向客户端发送了请求应答分组,按照两次握手协议,可以认为此时连接已经建立,可以传送和接收数据,但如果服务器端的应答分组在传输过程中丢失了,那么客户端还不知道服务器端是否已经准备好,所以此时客户端在等待应答分组,而服务器端在等待客户端的请求,造成死锁。

(4)如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

猜你喜欢

转载自blog.csdn.net/weixin_40736319/article/details/89374615
今日推荐