TCP中的三次握手与四次挥手

最近准备面试题,看到有介绍计网中的TCP三次握手和四次挥手操作及其代表的含义的题,复习了一下,顺便记录下来吧。

注:图片来自中国大学MOOC 哈尔滨工业大学 计算机网络之探赜索隐 聂兰顺老师的慕课,讲得很好,大家如果还有什么不清楚的可以直接搜慕课看。

TCP连接特点:

  点对点:一个发送方,一个接收方

  可靠的、按序的字节流

  流水线机制:TCP拥塞控制和流量控制机制设置窗口的尺寸。

  发送方/接收方缓存

  双全工:同一连接中能够传输双向数据流

  面向连接:通信双方在发送数据之前必须建立连接。

       连接状态只在连接的两端中维护,在沿途节点中并不维护状态

       TCP连接包括:两台主机上的缓存,连接状态量、socket等。

       流量控制机制

TCP段结构:

  

  序列号和ACK

  

   在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

     它们的含义是:

    SYN表示建立连接,

    FIN表示关闭连接,

    ACK表示响应,

    PSH表示有 DATA数据传输,

    RST表示连接重置。

 重点来了,TCP的三次握手到底是什么意思呢? TCP建立连接的过程如下图所示:

     

   TCP建立连接的过程可具体形容为三次握手,首先,client端发送连接请求的报文【SYN】,Server端接收到连接后回复确认报文【ACK】,于此同时,服务器端为其分配资源,Client端收到Server端的ACK报文之后也向其发送ACK报文,同时准备资源,就这样,连接建立了,这三个操作也被称为三次握手。

  TCP连接关闭的过程如下图所示:

  

  每一步的操作图上说的已经很清楚了,我再来描述一遍,假设Client端想断开连接,那么它会向Server端发送关闭连接报文【FIN】,注意,这只是给Server端先打个招呼说将要断开连接,如果Server端东西还没发送完的话还可以接着发送,套接字并不会立刻关闭,Server端收到之后回应一个ACK,说我收到你打的招呼,知道你想断开连接,但还没准备好,准备好给你发FIN,前两次挥手就大概是这个意思。当Server端准备好断开连接后,它会向Client端发送关闭连接报文【FIN】

对Client端说,我准备好关闭连接了,由于网络可能存在收不到的问题,Client端必须回应一个确认报文【ACK】 说:OK 我知道了,然后Server端就断开了连接,而Client端在发完ACK之后会等待2MSL,如果没有收到回复,就说明连接已经断开了然后Client再关闭连接,回收之前开启连接时分配的资源等等。

  以上就是四次挥手的过程。

Client端和Server端的状态转移如下图所示:

 面试官:为什么是三次握手,而断开连接需要四次挥手?

  因为在建立连接的时候,Server端收到SYN【建立连接请求】的时候,直接回复ACK和SYN【ACK确认,SYN同步信息】,然后Client发ACK就可以了,所以是三次

  在断开连接的时候,Server端收到Client端的FIN报文【断开连接请求】的时候,可能还有数据没有发送完,所以只能先告诉Client端说知道了,但是还没准备好,准备好了再发FIN告诉你【并不能连着ACK一起发,ACK要准备好断开之后才能发送,所以多了一次,是四次挥手】。由于网络存在丢包现象,所以当Client端收到Server端的FIN包时,必须要发个ACK报文,告诉他说我已经知道你准备好断开了,不然可能存在两端都不确定到底对面准备好断开没有的情况。

  最后Client端通过等待超时来结束四次挥手。 

叙述有点啰嗦,但大意就是这样。 

原文地址:https://www.cnblogs.com/xingzhuan/p/10623503.html