【计算机网络】TCP的三次握手和四次挥手

首先

tcp的三次握手和四次挥手绝对是高频的面试题,因为他是网络建立可靠稳定连接的基础,那么我们可以知道的时候三次握手是建立连接,四次挥手是断开连接。那其中衍生出来的一些问题如为什么要建立三次连接?两次为什么不行?为什么要四次挥手?三次为什么不行?等等,所以就此问题我做了一个简单的可以应付面试的总结,当然你要是想深入了解那必须看书!!!

TCP 三次握手

tcp的三次握手是为了建立两个端点之间的通信的,所以说tcp是点与点之间的通信。
先上图,
【计算机网络】TCP的三次握手和四次挥手_第1张图片

根据上图我来讲一下大致的握手过程:
第一次握手:客户端处于SYN_SEND状态,给服务器发送一个SYN报文和自身的序列号(Initial Sequence Number ISN)M。此时,服务器收到了客户端发送的报文和序列号那么服务器就知道客户端的发送功能是ok的这个时候就是处于半连接队列
第二次握手:服务器收到客户端的报文请求,此时处于SYN_RCVD的转态,服务器会发送一个将客户端发送的序列号+1的确认报文 ack = M + 1; 然后在发一个自身的序列号ISN K 。那么此时客户端接受到服务器发送的确认报文和序列号,那么可以知道客户端已经可以确认服务器的接受和发送能力是ok的。
第三次握手: 此时客户端处于ESTABLISHED的转态换句话说就是已经准备好跟服务端发送数据了,但是呢这里有一个问题就是我服务器并不知道你客户端的接受能力是不是ok的,因此我们这里需要客户端给服务器发一个确认报文 ack = K + 1;服务器接受到之后就可以确认客户端的接受能力是ok的,至此客户端和服务器就成功建立起了联系。此时已经建立了连接,所以称为全连接队列

衍生问题
为什么要三次握手?两次握手不行吗?

其实这个问题并不是很难,看懂了我上面过程的讲解这个问题应该是迎刃而解的,为什么呢?因为两次握手就结束的话,只有客户端知道服务器的接受和发送能力是没有问题的,但是呢,服务器给客户端发送的SYN报文客户端并没有给服务器发回一个确认报文,所以说此时的服务器还在等着客户端的确认报文来确认客户端的接受能力是ok的。因此需要第三次握手。

三次握手的所用?

三次握手的作用就是为了建立服务器和客户端的连接,一开始的时候就说了!

Initial Sequence Number ISN 是固定的吗?

ISN序列号肯定不能是固定的,如果是固定的那么就很容易被人识破,一直给服务器发送连接请求(第一次握手)让你的服务器宕机!所以说ISN必须是动态生成的。

三次握手中哪次可以携带数据吗?

我们在回头看看这个握手的过程,什么叫可以携带数据,那就是说你必须知道对方的接受和发送能力ok的时候才能发送数据,那么我们看看第二次的握手,客户端知道服务端的接受和发送能力是ok的,现在就只差服务器收到客户端的确认报文了,那么我们是不是可以在发确认报文的时候将数据携带过去呢。这样就不需要我等服务器知道了我接受能力ok了再发,节省了一次报文的时间。因此综上分析可以知道,第三次是可以携带数据的。

TCP 四次挥手

TCP的四次挥手就是为了关闭连接的。先上图,在讲过程:
【计算机网络】TCP的三次握手和四次挥手_第2张图片
TCP四次挥手的过程:
首先刚开始的时候因为是之前就建立好了连接所以双方都是处于ESTABLISHED的状态。
第一次挥手: 客户端发送一个FIN 报文并且报文中指定一个序列号 M 个服务器,此时的客户端处于FIN_WAIT_1状态。现在这时候是客户端要主动关闭。
第二次挥手: 服务器接受到了客户端的FIN 报文之后,服务器可能还有别的请求没有处理完还需要工作,因此处于一个被动关闭(CLOSE_WAIT)的状态,给客户端发送一个确认报文 ack = M + 1; 那么此时的客户端就处于一个FIN_WAIT_2的一个状态。
第三次挥手: 现在服务器把所有的连接都处理完了,觉得自己需要关闭了,那么这个时候就会想客户端发送一个FIN 的报文外加一个序列号 N ,自己处于一个LAST_ACK 的状态。
第四次挥手: 客户端收到服务器的FIN 报文之后此时处于一个TIME_WAIT状态,此时客户端会给服务端返回一个确认报文 ack = N + 1; 但是注意一下此时客户端并不会马上就关闭,因为你想想如果说你发送的确认报文因为网络原因没有发送到服务器呢?那么此时服务器肯定会重新给客户端发一个FIN 报文咯,客户端要是关闭了的话那么这个连接并没有断开,服务端还在等你回信。因此最好的办法就是客户端在等一下大概就是一个报文的来回时间确认一下服务器没有在发过报文了!此时在关闭!

衍生问题
为什么客户端发送了ACK确认报文不能马上关闭呢?而是需要等一会再关闭?

其实看完我上面的过程的分析就已经知道答案了,为什么?因为客户端并不知道服务器是不是已经接受到了所发的确认报文,那没有的话服务器会重新发送一遍,要是此时客户端下线了,那就接收不到,关闭不了连接。如果说客户端要是接受到服务器的确认报文的话那么就说明上一次发的丢了,需要重新发送。那这个等待时间到底时候要多久呢?大概就是至少需要一个报文的来回时间

结语

今天大概总结了一下TCP三次握手和四次挥手这个过程以及衍生的问题,但是并不是总结的很到位,这里还需要大家一起留言帮我把问题给总结好!拜托啦!好啦,收工~下一个问题。

你可能感兴趣的:(计算机网络,Java面试知识点,tcp/ip,网络,网络协议)