复习题——计算机网络之TCP的三次握手和四次挥手

TCP是什么?(What)

TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的传输层通信协议。

 

TCP的目的?(Why)

为了在不可靠的互联网络上提供可靠的端到端字节流,或说提供可靠链接和可靠的信息传送。

 

TCP是如何达成目的?(How)

   1:在可靠信息传输前建立可靠的连接(三次握手)

   什么是可靠的信息传输?   

   发送信息且收到确认信息表示发送信息是可靠传输的。

   TCP 的可靠数据传输是靠 seq( sequence numbers ***)和ack(Acknowledge character确认号)来达成的。

  如果通信一方A能发送一份携带seq=x的信息给通信另一方B,且之后A又能收到一份B发送的携带ack=x+1的确认信息,则说明这次A到B的数据传输是可靠的。

 

  为什么需要建立可靠连接,即为什么要三次握手,而非直接数据传输?

  但因为网络是不稳定的,可能会出现丢包或报文延迟到达的现象。

  第一次A向B发送信息Q1时,

  B可能 1:报文丢失收不到   2:报文延迟不能立即收到   3:收到了但发送给A确认信息包,出现如1,2种情况导致A接收不到。

  因为接受不到B的确认信息,A会重新给B再发生一条信息Q2,而Q2也同样遇到上面的出现几种问题,即网络拥塞。

  为了避免网络拥塞而导致的重复发送大容量数据包而再导致网络更加拥塞的这种恶性循环发生。

  在可靠传输数据的前,我们可先尝试建立轻量化的连接(只传输必要信息),若连接成功连接再传输数据。

  (一般来说,如果可靠连接能建立,网络运行状态则大概率是通畅的。若在可靠连接建立后网络变差,又出现丢包延迟等现象,这就需要更多的操作这里先不加赘述。但先建立轻量级连接而非直接传输数据是有利且必要的。)

  为了建立可靠连接,从而达到可靠数据传输。TCP采用三次握手的方式来建立可靠的连接,并采用四次挥手方式结束这次连接。

 

  为什么是三次握手,而不是两次或四次?

  三次是必要的,正如之前所说,发送信息且收到确认信息只能表示发送信息方是可靠传输的,而不能说明确认信息方是可靠的(对方无法确认你有没有收到)。所以在发送信息(一次连接)后对方回复确认信息(二次连接)后需要第三次连接,来证明不仅仅是A->B通,且B->A通。之于为什么不是四次,因为三次就够了。

   这可能和下面的观点”防止已失效的链接请求报文突然传输到服务器"不同:

复习题——计算机网络之TCP的三次握手和四次挥手

   这当然也是一种的思考角度,依照他的想法,“三次握手”处理滞留的报文,不在两次握手中开始苏剧传递是为了不浪费服务器资源。而我的想法是1,2次握手使A知道A->B可通,2,3次握手使B知道B->A可通,双方相互可通则连接稳定。

   哈,这种情况我一般会合起来看。结合主流观点和自己观点。或许有一天发现那个地方需要再修改也不迟。

   现在来总结一下答案。

    为什么是三次握手,而不是两次或四次?

    如果是两次握手,A发送请求建立给B后,B确认一下后立马开始发生数据信息给A。可能会导致,在网络中滞留的A之前发送的“无效的”请求报文到达B后,B直接发送A数据,而这些数据是“不必要”传输,可见两次握手可能会浪费资源。所以需要三次握手,第三次握手是对前面两份信息的确认,确认一下此次连接的双方初始seq,同时也变现确认两次了网络的数据可达。至此便可开始传输数据,而无需多余握手。

 

   下面想讲下其中两个比较重要的标志位

           SYN: 同步序列编号(Synchronize Sequence Numbers),SYN = 1,请求建立连接。握手完后SYN=0。

           ACK: 确认字符 (Acknowledge character),当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

    接下来是保证TCP可靠数据传输的最重要的两个字段

            seq:通信双方在建立连接时都会产生一个“唯一”的seq,用于标识数据与接受对应ack。之后seq在不断累加。

            ack:确认号,当前报文段最后一个字节的编号+1即为确认号。很多资料上说这是期待下一个seq的编号,其实我认为它的副作用确实是有这方面的,但主要的是确认了我收到你的seq,告诉对方你的信息传输可靠。

            seq和ack贯穿TCP数据传输始终,即从开始建立连接,数据正式传输和结束连接,都需要seq和ack不断的确认可靠性。

   其他份参考资料:

                     https://www.cnblogs.com/bj-mr-li/p/11106390.html

                     https://www.zhihu.com/question/24853633

                     https://blog.****.net/justloveyou_/article/details/78303617?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.compare


                   

为什么采取四次挥手方式结束这次连接

   当我们不再需要TCP连接传输数据时,我们应当结束连接,减少资源消耗。

   下面是四次挥手的具体过程

   1.当一方A主动要求结束连接时,发生FIN=1(一次挥手)给另一方B。

   2.B收到FIN=1的消息后报告,通知A已确认收到消息发送ACK=1(两次挥手),但存在有一部分数据仍需发生

   3.直到B将所有需要的信息发送于A,最终发送FIN=1,ACK=1(三次挥手)的信息给A

   4.A收到后回复ACK=1(四次挥手),开辟2MSL确认再无B信息后,关闭本次TCP连接

   可以说,四次挥手之于三次握手,多在了第三次挥手。B因为是被动关闭,可能存在为没有发送完全的信息,要等待信息发送完全后再发送消息给A。而第二次挥手却不能少,否则A将不知道B有没有收到停止的信息,并不断发生FIN=1给B(B需要即使反应A的请求,而非先干自己的干完了再通知A)。

   至于等待2MSL,是因为这是这次通信时的最后一次,是没有确认信息的,无法保证最后一句的的可靠。若B收不到A的最后一句会发送消息给A,A需要即使处理(为了让B休息),所有需要保持2MSL的可处理时间(MSL:MaximumSegmentLifetime报文最大生存时间)变向的确认B收到了信息。

 

    TCP其中还有许多保持可靠传输的方法,三次握手仅是其中一种。

    从三次握手中,可以引发的我的思考有:

    1、可用seq序号和ack确认号作为一种确认机制,保证在不稳定的通信能找到丢失的包,然后进行重新发送

    2、在大数据传输前,可用试探机制(建立连接)确认网络通畅,避免一开始就传输“浪费资源的”大文件

    3、在传输最后一句报文时,可采用等待2MSL方式无响应的方式(无法采用等待ACK的方式),来解决最后一文的传输问题。

    4、可靠的数据传输不是保证不丢包,而是保证你能不能发现丢的包是什么并处理丢的包或传输慢的报文。可靠应指所有必要传输的报文都传递到了。

    .....

 

本文仅为整理了个人观点所做,可能存在偏差,若有欢迎指出