TCP三次握手和四次挥手

TCP三次握手和四次挥手


本文通过借鉴书籍资料、他人博客总结出的知识点

TCP三次握手

  • 图解
    在这里插入图片描述web

  • 文解面试

    第一次握手:创建链接时,客户端发送syn包到服务器,并进入SYN SENT状态,等待服务器确认; SYN: 同步序列编号(Synchronize Sequence Numbers) 。
    
    第二次握手:服务器收到syn包,必须确认客户的SYN,同时本身也发送一一个SYN包,即SYN+ACK包,此时服务器进入SYN _RECV状态;
    
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED (TCP 链接成功)状态,完成三次握手。

TCP四次挥手

  • 图解
    在这里插入图片描述服务器

  • 文解网络

    因为TCP链接是全双工的,所以每一个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一一个 FIN来终止这个方向的链接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP链接在收到一一个FIN后仍能发送数据。首先进行关闭的一-方将执行主动关闭,而另外一方执行被动关闭。
    四次挥手过程:
    (1)客户端A发送一个FIN, 用来关闭客户A到服务器B的数据传送。
    (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN同样,一个FIN将占用一个序号。
    (3)服务器B关闭与客户端A的链接,发送一个FIN给客户端A。
    (4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

面试常见问题

  • TCP握手为何不是两次?并发

    三次握手完成两个重要的功能,既要双方作好发送数据的准备工做(双方都知道彼此已准备好),也要容许双方就初始序列号进行协商,这个序列号在握手过程当中被发送和确认。
    假设创建链接只须要两次握手,服务端收到客户端的链接请求后,并发送了确认应答分组,服务端认为链接已创建。但是,客户端在服务端的应答分组在传输中被丢失的状况下,将不知道服务端是否已准备好,不知道服务端创建什么样的序列号,客户端甚至怀疑服务端是否收到本身的链接请求分组。在这种状况下,客户端认为链接还未创建成功,将忽略服务端发来的任何数据分组,只等待链接确认应答分组。而服务端在发出的分组超时后,重复发送一样的分组。这样就造成了死锁。
  • TCP创建链接是三次,断开链接为何是四次?svg

    在创建链接中,服务器的ACK和SYN包是同时发送的(ACK报文是用来应答的,SYN报文是用来同步的),而在断开链接的时候,服务器向客户端发送的ACK和FIN包是分两次发送的,由于服务器收到客户端发送的FIN包时,可能还有数据要传送,因此先发送ACK告诉客户端“你发的FIN报文我收到了”,等数据传输结束后再发送FIN断开这边的链接。
  • 若是已经创建了链接,可是客户端忽然出现故障了怎么办?.net

    TCP设有一个保活计时器。显然,客户端若是出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会从新复位这个计时器,时间一般是设置为2小时,若两小时尚未收到客户端的任何数据,服务器就会发送一个探测报文段,之后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭链接。
  • 为何TIME_WAIT状态须要通过2MSL(最大报文段生存时间)才能返回到CLOSE状态?code

    虽然按道理,四个报文都发送完毕,咱们能够直接进入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链接。

借鉴博客连接:https://blog.csdn.net/qq_38950316/article/details/81087809xml