总结描述TCP三次握手四次挥手
三次握手是指的是创建连接的过程:首先客户端向服务器端发送一个请求,询问是否可以发送数据;服务器收到请求之后,如果同意会响应一个确认报文;客户端收到确认报文之后,就开始发送数据。
第一次握手:建立连接时,客户端向服务器发送请求报文(SYN),"我想建立连接”;
第二次握手:服务器收到请求报文后,如同意连接,则向客户端发送确认报文(SYN/ACK),“同意建立”;
第三次握手:客户端收到服务器的确认后,再次向服务器发送确认报文,完成连接(ACK);
四次挥手指的是断开连接的过程:客户端向服务器发送一个请求,询问是否可以断开连接;服务器端会响应自己当前的状态;如果服务器端准备好了,会向客户端发送一个断开连接的请求;如果没有准备好,还有数据没响应完,会等响应完再给客户端发送请求;最后服务器端和客户端断开连接。
第一次挥手:客户端想分手,发送消息(FIN)给服务器;
第二次挥手:服务器通知客户端已经接受的挥手请求,返回确认消息(ACK),但还没做好分手准备;
第三次挥手:服务端已经做好分手准备,通知客户端(FIN);
第四次挥手:客户端发送消息给服务器(ACK),确认分手,服务器关闭连接
1.为什么建立连接是三次握手而不是两次握手或四次?
答:第三次是为了防止已经失效的连接请求报文段又突然传到服务端,而产生错误。例如A发送给B一个连接请求,但在网络传输过程中突然丢失或滞留,A因为迟迟没有接收到B的确认信息,就接着向B发送了一次请求,这次B正常接收,并返回给A确认报文段,A接着向B进行确认,成功后两者就进行通信,当通信完成后就释放连接了,然而这时候A之前发给B的那个消息突然又被B接收到了,B以为A又要跟他建立连接,如果是两次握手,当B发给A一个确认后,由于A知道这是之前被延误的消息,且两者之间的连接也已经建立过了,所以就不会理会了,但B却认为两者之间成功建立连接了,就等待A发送数据,这时候就白白浪费了B的资源。如果是三次握手,当A没有理会后,由于B没有再次收到A确认的消息,就会知道A并没有打算建立连接,所以就不会进行等待。至于为什么不是四次,因为三次完全可以成功建立连接了,使用第四次就会造成不必要的资源浪费。
2.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到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次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
4.如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接