TCP链接和释放

[TOC]网络

前言

  • TCP是一种端对端的协议;
  • TCP是无状态协议;

1、TCP的三次握手-链接

1.1 图解流程

TCP三次握手

  • SYN,同步标志位,用于创建链接时,同步本身序列号给对方。
  • ACK,确认标志位,当须要发送ack(确认序列号)时,必须置位1。
  • seq,数据序列号,表名这次请求发送的第一个数据的序列号为多少,首次自定。
  • ack,下次数据的序列号,告诉对方下次应该发过来的第一个数据的序列号应该是多少。
  • established,链接已创建。

TCP三次握手实质上就是维护双方 seq(数据序列号) 的过程。spa

注意:同步

  • SYN报文段不携带数据,可是要消耗一个序号;
  • ACK报文段能够携带数据,若是不携带,则下次序列号不变,因此最后一次握手后,下次链接序列号仍是从K+1开始;

图解it

  1. A呼叫B,这是条同步链接,这次数据由J开始;
  2. B收到;
  3. B呼叫A,收到同步链接,下次请从J+1开始发送数据,而且一样须要同步,这次数据由K开始;
  4. A收到,创建链接;
  5. A呼叫B,收到同步链接,那下次请从K开始发送数据吧;

1.2 为何不能是四次握手?

其实能够看到,握手的第二次能够拆成两部分完成,先发送ACK,在同步SYN,这样下来就是四次握手了。为何不呢?由于效果同样,不必呀~。一样不五次、六次、七次等等缘由都是如此。class

1.3 为何不能是两次握手?

这主要是为了防止 已失效的链接请求报文段 忽然又传送到了对方,于是产生错误。请求

已失效的链接请求报文段:第一次握手发送因网络拥堵或其余缘由而未到达对方手中。im

若是是两次握手,会发生的错误是什么?总结

两次握手的话,B的established(链接创建)将发生在第一次握手后通信

  1. 若是A第一次发送链接请求(seq=J),由于网络拥堵而为到达B手中,以后发送第二次链接请求后,成功到达,双方后续链接好链接,并开始持续发送数据(A发送给B的seq已经到了N)。
  2. 此时第一次链接请求到达B,B认为A须要从新创建链接(由于TCP是无状态的,因此只能这么机械认为),而后B创建链接,发送确认、同步请求给A以后,等待接收A数据序号为J+1的数据。
  3. A收到来自B的确认、同步请求,但A此时已经和B链接,因此忽略这次确认请求,继续发送序列号为N+1的数据。
  4. B收到序列号为N+1的数据,并非J+1的数据,不进行接收。
  5. A没有等到B的回复,一直在超时重传,屡次后便报出错误,等待从新链接。

为何三次握手,不会出现” 已失效的链接请求报文段 忽然又传送到了对方,于是产生错误“的状况?数据

由于B创建链接在第三次握手以后已失效的链接请求报文段 忽然又传送到了对方,并不会改变B下次接收A的数据的序列号(两次握手失败的主要缘由:B下次接收A的数据序列号从N+1变成了J+1)。因此在A忽略以后继续发送N+1的序列号数据时,B能正常接收。

第二次或第三次握手拥堵以后,忽然又传回对方手中,会产生怎么样的结果?

由于第二次握手和第三次握手都须要有前景,即第一次握手(第二次握手的前景)和第1、二次握手(第三次握手的前景),由于没有前景,因此天然会被忽略掉。

2、TCP的四次挥手-释放

2.1 图解

TCP四次挥手

  • FIN,链接结束标志位,表示发送方请求断开链接。
  • MSL,最长报文段寿命,约为2分钟,随着时代进步,以后继续变短。
  • 2MSL,2个MSL时间,为一个等待计时器的时长。

注意:

  • FIN标志位为1时,即便请求不携带数据,也要消耗一个序号。

图解

  1. A想关闭链接,并处理好关闭链接的过后;
  2. A呼叫B,这是条关闭请求,这次序号为u;
  3. B收到A的关闭请求,同时向应用汇报,关闭链接的事;
  4. B呼叫A,这是条确认请求,这次数据序号为v,下次发送数据从u+1开始(这代表B收到A的上一条(u)请求了);
  5. B处理关闭链接的事,同时把须要发送的数据给发送完(此时发送的数据都要保留ack=u+1,由于要给后续A发送用),发送完以后,便进行关闭操做;
  6. B呼叫A,这是条关闭请求,这次序号为w,下次发送数据从u+1开始;
  7. A呼叫B,这是条确认请求,这次序号为u+1,下次发送数据从w+1开始;
  8. A等待2MSL后,关闭链接;

2.2 为何最后A须要等待2MSL时间呢?

  1. 保证A最后发给B的报文段能到达B。若是不能到达B,在这2MSL时间段内,彻底够B超时重发FIN报文段,且A让收到。若是A收到后,将继续发送最后一次挥手,且重置等待计时器。等待计时器重置也有次数,若是重置屡次的话,A将直接关闭。
  2. 防止”已失效的链接请求报文段“出如今挥手阶段。在这2MSL时间段内,足够让B接收到以前的因网络拥堵而未到达的报文段了,固然报文段有有效时长,超过这个有效时长,将会被丢弃。这样就不会由于下次创建链接时接收到上次创建链接时的报文段而产生错误。

2.3 若是A掉电退出了怎么办?

TCP有一个保活计时器,当双方接收到对方报文段时,保活计时器将重置。若是保活计时器时间结束,它将会主动关闭TCP链接。

3、总结

整个TCP链接、互相发送数据(你向我发送数据,我回复你收到)、挥手阶段,都是一个 维护序号的过程。这个序号就是我同对方讲的这句话的惟一标识符。

seq、ack都尤其重要。seq 表示了某一方数据的惟一性;ack 不只告诉对方下次应该从哪一个位置发送,还能验证对方发送的数据是否正确。

整个通讯都是针对双方的,没有哪一方为数据的领导者。

相关文章
相关标签/搜索