TCP三次握手四次挥手

TCP三次握手和四次挥手

纠正理解(重要)

首先来说一下TCP"三次握手四次挥手"来创建链接这个说法的来源,其实真正的在官方的文档中是经过handshake这个单词描述"整个创建-断开链接"的过程,因此三次报文传送创建链接和四次报文传送断开链接的整个过程才称得上一次握手.面试

很形象的说就像咱们平常生活正握手同样,创建链接的时候至关于把手握在一块儿,其次咱们会互相说你好,很久不见之类的话,这就像创建链接以后传送的一些信息,最后咱们互相问候以后会把握在一块儿的手松开,这个时候就像断开链接,经过这样一个详细的握手-讲话-松手例子,咱们就能够清晰地理解客户机(client)和服务器(server)从创建链接传送信息最后再到断开链接.服务器

 

 

三报文传送创建链接(握手)

在经过纠正理解(重要)部分以后咱们能够对整个过程有了清晰的认识,下面这一部分咱们专一于握手-讲话-松手中的握手(创建链接)的是怎么握的.网络

图一👇spa

图二👇server

 

 

 

咱们从上往下看,blog

 

首先(第一步路由

看客户机(client)和服务器的链接都是LISTEN(监听)或者CLOSED(关闭)状态。文档

这个无所谓了, 咱们继续向下看,握手的发起者是客户机(client),客户机会主动打开链接通道经过网关路由向服务器发送一条报文(SYN(SYNbit) = 1, seq = x),客户机(client)的状态从LISTEN(监听)或者CLOSE(关闭)状态(状态1)转换为发送同步号状态(SYN-SENT)(状态2)。同步

这条报文包含两个部分,第一部分是SYN(同步号\同步器,反正就是同步的意思啦,这里叫作同步标志位好啦),seq(序列,就是和同步标志位一块儿工做的兄弟),而后它俩兄弟过千山万水到达了服务器。it

服务器监听到了信息,打开大门接收了这俩兄弟(同步号标志位SYN=1和同步序列seq=x),这个时候服务器状态就从LITSTEN(监听)或者CLOSE(关闭)转为了SYN RCVD(收到同步标志位和同步序列了)状态。

第一个报文完成(客户机到服务器)!

 

接着(第二步

服务器收到了客户机请求创建链接的消息以后,选择应答客户机,就会发送本次应答的信息。

这个信息包括本次的SYN=1(同步标志位)和seq=y(序列y),除此以外还有ACK(应答标志位)和ack(应答数字,应答数字是接收的标志序列seq+1)同步标志位(SYNbit)和应答标志位(ACKbit)都是标志着一条消息(对应的是seq和ack或者ACKnum)是什么类型的,咱们能够把SYN和ACK理解为咱们写文章时候的标题,seq和ACKnum或ack理解为文章正文。

而后客户机收到这个回复以后,经过ack或者ACKnum(应答数字)和本身发过去的同步序列seq进行比对,发现正好ack是本身发过去的seq + 1,这样就证实了服务器活着,而且还收到了本身发送的创建链接请求。

这个时候客户机的状态就从发送同步信号状态(SYN-SENT)(状态2)转换成了链接创建状态(ESTABLISHED)(状态3)

第二个报文完成(服务器到客户机)!

 

最后(第三步

前两步就已经互通了,就能够创建链接了,为何还要第三步呢?咱们这里先把第三步走完,最后再单独分析这一步,这一步也是面试中的关键一步!

客户机在收到了服务器的赞成信息(服务器确认信息)以后,客户机会再一次的发送报文给客户机,发送的内容依旧是和服务器发送回来的格式同样,两大部分(同步信息和标志信息),四小部分(同步号和同步序列;标志号和标志数字),为何格式是同样的呢?是由于从服务器发送回到客户机和如今最后一步的目的是相同的;

服务器发送信息回到客户机的目的是为了应答客户机的同步信息(SYN=1和seq=x),这一步的目的一样明显,是为了应答服务器的同步信息(SYN=1和seq=y),咱们知道了这两条消息的目的相同,那么咱们就很容易理解到,ack或者ACKnum确定是y+1了(从服务器的seq = x + 1 推断出来的),SYN和ACK确定是1,咱们能够发现,标志位ACK对应的的ack或者ACKnum老是收到消息的seq+1, 咱们没有推断错误。

服务器收到这条消息以后呢,服务器就能够知道客户机也还活着,而且ack活着ACKnum对应的正好是本身刚发过去的seq+1,也证实信息没收错(这里都是形象比喻,方便理解),这时候服务器的状态也会从SYN RCVD转换为ESTABLISHED。

第三步完成了(客户机到服务器)!

 

为何还要第三步呢

解决这个问题时,咱们须要先了解一下发送报文的机制,在网络中发送报文时会先发送第一次报文,而后有一个超时机制,超时结束后没收到回复会再次发送一次报文,还有在网络中咱们从客户机到服务器能够有不少的路线选择,在了解了这两个机制以后咱们能够继续向下分析了。

 

咱们经过一种假设状况来理解为何还须要第三步:

假如咱们没有第三步

假设咱们第一次从客户机发送报文到服务器请求链接,而后因为网络情况不好,咱们这一个报文被阻塞在了某个路由器中,没有送达到服务器,因此服务器就一直没有相应咱们的请求,咱们客户机超时都没有收到服务器的反馈,接着基于咱们前面讲的报文发送机制能够推出,咱们客户机还会再一次发送请求报文过去,第二次发送的请求报文选择的路线很好,瞬间到达了服务器,服务器收到后当即进行了反馈,返回了确认信息,假如没有第三步,这时候咱们链接已经创建起来了!

咱们是经过超时发送的第二次报文创建的链接,若是第一次阻塞的请求这个时候路线又通了,那么服务器又收到了一次请求,服务器又当即反馈了,这个时候因为没有第三步,到这里创建链接的两步已经走完了,因此咱们就创建了两个链接。

如今咱们有了第三步

从图中咱们看到,咱们给服务器通过第三步发过去的seq是基于第一步请求的seq再+1,这样若是被阻塞的第一次请求路线通了,服务器再次反馈回来,咱们发现这个时候咱们并无给服务器请求(超时发送第二条请求以后第一条请求咱们客户机就直接抛弃了,认为它再也不有效),可是服务器怎么平白无故又反馈了呢,基于上面没有第三步,若是没有第三步,到目前为止,创建链接的两个步骤已经完成,这一步是否是服务器又给咱们完成了一次创建链接,可是有了第三步,注意!咱们客户机发现是这种状况以后,就不会再执行第三步了,这样创建链接的三步没有执行完,因此就不能成功的再一次创建链接。这里也是面试的重点!

 

到如今为止,咱们完全明白了创建链接的整个过程,其中具体怎么样扫描端口的啊,怎么传输的啊咱们不须要了解,只要知道怎么个过程就能够了!固然,网络工程师除外。

 

通过这三次报文传送,链接已经创建好了,这样整个"握手-说话-松手" 的 握手环节结束了,如今的状态就是双方手已经握在一块儿了。

 

 

 

 

 

经过创建的链接传输信息(交谈)

这里不是咱们关注的重点,略,咱们看下面的四次报文松手环节!

 

 

 

 

 

四次报文断开链接(松手)

 

 

在理解了三次报文创建链接以后,咱们再来理解一下四次报文传送断开链接,经过上面的两张图来帮助理解,我以为这两张图画的都很好,上边是国外画的,我加了一些中文注释,下边是中文图书上画的。

 

下面这一部分咱们专一于握手-讲话-松手中的松手(断开链接)是怎么松的.

 

第一步(客户机请求结束到服务器):

客户机和服务器都是链接状态,这个时候客户机已经不须要再发送数据到服务器了,会主动发送一个结束标志FIN和对应的序列seq,这时候客户机就进入了FIN-WAIT-1结束等待阶段1,这个时候客户机已经不可以再给服务器发送了,只要发了结束标志FIN就不可以再发送数据包了,可是能够继续接收服务器发来的数据,等下服务器也是同样的。数据包和结束标志和应答标志是不同的,不能发送数据包但能够发应答标志

 

第二步(服务器反馈到客户机):

服务器收到客户机的断开请求以后会给客户机一个反馈,一样遵循ack = seq + 1,这个返回发送以后,服务器会进入关闭等待阶段CLOSE-WAIT,可是服务器仍然能够给客户机发送数据包,由于服务器只是给客户机发送了应答标志可应答数,这个时候服务器若是还有数据须要发送给客户机,会继续给客户机发送数据,客户机接收到服务器的应答反馈,此时客户机从FIN-WAIT-1阶段到达FIN-WAIT-2阶段,若是服务器还有数据发来,仍可以接收。

 

第三步(服务器请求结束到客户机):

接着,服务器若是没有数据要发给客户机,也会向客户机那样请求结束,这里会有一个新的seq,专属于服务器发来的seq是w,在服务器发送完这个结束请求以后服务器会进入到LAST-ACK阶段,即等待客户机的响应。

 

第四步(客户机回应服务器):

最后客户机收到服务器的请求以后,会当即给服务器回复一个确认响应,告诉服务器我知道了,可是这里客户机按照咱们的理解应该能够关闭链接了,可是并无,客户机会接着进入一个时长为2MSL的等待,大概是两个超时时间(超时就是前面创建链接时说的那个超时)。至于为何没有当即关闭的缘由这是个面试重点,后面我会单独介绍为何,客户机的回应服务器收到以后会当即关闭链接,而后客户机的等待时间到了也会关闭链接,客户机和服务器至此流浪各天涯!

 

为何客户机给服务器发送确认响应以后没有当即关闭链接?

 由于,客户机给服务器发送的确认响应有可能阻塞到网络中,服务器收不到这个响应就不会关闭链接,客户机若是没有等待的话,客户机关闭了,服务器就没办法关闭了,为了保证双方都可以无缺的关闭,这时候客户机选择再等待一段时间,若是客户机给服务器的确认响应阻塞到网路中,那么服务器等待超时以后会从新请求结束,客户正好还没关,就能够再一次的回复了,再回复一次给服务器,服务器这一次能收到了,就关闭了,客户机再等待2MSL以后就能够安心关闭了。

相关文章
相关标签/搜索