TCP的三次握手和四次挥手(详细)

TCP是面向链接的协议,要想传输数据就得先建立链接,通讯结束后关闭链接。

我们先说下他的链接过程------三次握手:

简单来说就像是两个人打电话,电话通了之后,A向B说“喂,听得见我说话嘛”,然后B接着说“能听见”,最后A说“那好我开始讲了”,然后他俩就可以畅通的交流了。

说三次握手前先讲一下在握手过程中用到的信息(都是在TCP报文里的信息)

ACK标志:我们把携带ACK(ACK=1时确认号才有效)标志位的TCP报文称为确认报文;

SYN标志:表示请求建立一个链接,讲携带SYN的报文称为同步报文;

FIN标志:表示通知对方本端要关闭链接了,称为结束报文;

RST标志:表示请求对方重新建立链接;

ack :是TCP报头里的确认号,用来确认报文到达了对端

seq :是TCP报头里的序号,用来要求数据必须有序

我们先看下三次握手的过程图:

TCP的三次握手和四次挥手(详细)

1.在没有建立链接前客户端和服务器都是处于CLOSED状态。接着客户端主动打开链接,服务器被动打开。

2.客户端先创建传输控制块TCB,然后进入LISTEN状态等待链接,接着客户端也会创建一个TCB。

tcb结构的定义包括这个连接使用 的源端口、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、top输入/输出队列应用层输出队列、tcp的重传有关变量。

3.第一次握手:客户端A向服务器B发送请求报文,SYN=1,seq=x(seq的值是随机产生的,保证了防止别人伪造客户端A的报文信息,主要对服务器B的接受窗口进行设置,拒绝seq<x && seq> x+窗口大小的信息传入),该报文不能携带数据,且消耗一个序号,此时客户端进入SYN-SEND状态;

4.第二次握手:当服务器B接收到请求报文时,如果同意链接,会回复SYN=1,ACK=1,seq=y,ack=x+1,同样不能携带数据消耗一个序号,然后服务器B进入SYN-RCVD状态。

5.第三次握手:A收到B的消息后,A还得向B发出确认,然后发送ACK=1,seq=x+1,ack=y+1 ;此报文可以携带数据,如不携带不会消耗序号,所以服务器的接受窗口序号还是从x+1开始,然后A进入ESTAB-LISHED(链接状态),当B收到后也进入该状态。当双方都进入该状态时就可互发信息了,此时A向B发送数据的序号从x+1起

然后这里又有个问题抛出,就是为什么一定得是三次握手,两次握手或者一次握手不行吗?

我们可以先讨论下两次握手会出现的问题,两次握手的话可以看成A向B请求,B回复确认,然后进入链接状态,如果A第一次发送的请求报文因为网络阻塞问题没有发送到B,A经过超时重传机制再给B发送一份,之前的那一份请求报文就算做失效报文,然后B回复确认然后进入链接状态,就在这个时候之前失效的报文到达B,B收到后给A回复,B就认为链接建立了,会为此分配资源,但是A收到B的确认后,A会把他丢弃掉,因为A并不认识该报文(序号不对)且没有发送过连接的请求,最后服务器B就会白白浪费资源。如果是一次握手的话,那就更不靠谱了,A都不知道B有没有收到该请求。也可以说三次握手主要是为了防止已失效的连接请求报文突然到达服务器,造成服务器的等待和资源的浪费。

我们来接着讲四次挥手,还是先看图

TCP的三次握手和四次挥手(详细)

1.第一次挥手:假设A主动提出关闭,A向B发送FIN=1 , seq=u,此时A进入了FIN-WAIT-1状态。

2.第二次挥手:B收到A的报文后立马给A回复,ACK=1 , seq=v , ack=u+1,此时B进入了CLOSE-WAIT状态,A进入了FIN-WAIT-2状态。

3.第三次挥手:当服务器也没有消息发送打算结束时,向A发送FIN=1,ACK=1,seq=w,ack=u+1;此时A进入TIME-WAIT状态,B进入LAST-ACK状态;

4.第四次挥手:A收到报文后,向B回复ACK=1,seq=u+1,ack=w+1;当B收到后,B就进入了CLOSED状态,A还得等待2MSL(两倍的最长报文段寿命),才能进入CLOSED。

这里我们主要讲一讲TIME-WAIT状态的意义

1.保证可靠的终止TCP链接(假如第四次分手报文丢失,就得保证有足够的时间让B再向A发送第三次分手报文,以获得第四次分手报文,来让服务器B关闭)

2.保证让迟来的TCP报文有足够的时间被识别并遗弃(因为该状态有2MSL时长,可以保证因为网络问题阻塞的报文跑到下一个同IP、端口号的链接里去,造成错误,因为一个报文就只能存活MSL,要么被识别要么被丢弃)

还有个问题是为什么是四次挥手

因为tcp属于全双工通讯,第一跟第二次挥手是说明客户端A通讯结束并且回复确认,第三跟第四次挥手是说明服务器通讯结束并且对它的确认,只有经过四次后才能真正的关闭通讯。