[TOC]
前言
- TCP 是一种端对端的协定;
- TCP 是无状态协定;
一、TCP 的三次握手 - 连贯
1.1 图解流程
- SYN,同步标记位,用于建设连贯时,同步本人序列号给对方。
- ACK,确认标记位,当须要发送 ack(确认序列号)时,必须置位 1。
- seq,数据序列号,表名此次申请发送的第一个数据的序列号为多少,首次自定。
- ack,下次数据的序列号,通知对方下次应该发过来的第一个数据的序列号应该是多少。
- established,连贯已建设。
TCP 三次握手本质上就是保护单方 seq(数据序列号) 的过程。
留神:
- SYN 报文段不携带数据,然而要耗费一个序号;
- ACK 报文段能够携带数据,如果不携带,则下次序列号不变,所以最初一次握手后,下次连贯序列号还是从 K + 1 开始;
图解:
- A 呼叫 B,这是条同步连贯,此次数据由 J 开始;
- B 收到;
- B 呼叫 A,收到同步连贯,下次请从 J + 1 开始发送数据,并且同样须要同步,此次数据由 K 开始;
- A 收到,建设连贯;
- A 呼叫 B,收到同步连贯,那下次请从 K 开始发送数据吧;
1.2 为什么不能是四次握手?
其实能够看到,握手的第二次能够拆成两局部实现,先发送 ACK,在同步 SYN,这样下来就是四次握手了。为什么不呢?因为成果一样,没必要呀~。同样不五次、六次、七次等等起因都是如此。
1.3 为什么不能是两次握手?
这次要是为了避免 已生效的连贯申请报文段 忽然又传送到了对方,因此产生谬误。
已生效的连贯申请报文段:第一次握手 发送因网络拥挤或其余起因而未达到对方手中。
如果是两次握手,会产生的谬误是什么?
两次握手的话, B 的 established(连贯建设)将产生在第一次握手后。
- 如果 A 第一次发送连贯申请(seq=J),因为网络拥挤而为达到 B 手中,之后发送第二次连贯申请后,胜利达到,单方后续连贯好连贯,并开始继续发送数据(A 发送给 B 的 seq 曾经到了 N)。
- 此时第一次连贯申请达到 B,B 认为 A 须要从新建设连贯(因为 TCP 是无状态的,所以只能这么机械认为),而后 B 建设连贯,发送确认、同步申请给 A 之后,期待接管 A 数据序号为 J + 1 的数据。
- A 收到来自 B 的确认、同步申请,但 A 此时曾经和 B 连贯,所以疏忽此次确认申请,持续发送序列号为 N + 1 的数据。
- B 收到序列号为 N + 1 的数据,并不是 J + 1 的数据,不进行接管。
- A 没有等到 B 的回复,始终在超时重传,屡次后便报出谬误,期待从新连贯。
为什么三次握手,不会呈现”已生效的连贯申请报文段 忽然又传送到了对方,因此产生谬误“的状况?
因为 B 建设连贯在 第三次握手之后 , 已生效的连贯申请报文段 忽然又传送到了对方,并不会扭转 B 下次接管 A 的数据的序列号(两次握手失败的次要起因:B 下次接管 A 的数据序列号从 N + 1 变成了 J +1)。所以在 A 疏忽之后持续发送 N + 1 的序列号数据时,B 能失常接管。
第二次或第三次握手拥挤之后,忽然又传回对方手中,会产生怎么样的后果?
因为第二次握手和第三次握手都须要有前景,即第一次握手(第二次握手的前景)和第一、二次握手(第三次握手的前景),因为没有前景,所以天然会被疏忽掉。
二、TCP 的四次挥手 - 开释
2.1 图解
- FIN,连贯完结标记位,示意发送方申请断开连接。
- MSL,最长报文段寿命,约为 2 分钟,随着时代提高,之后持续变短。
- 2MSL,2 个 MSL 工夫,为一个期待计时器的时长。
留神:
- FIN 标记位为 1 时,即便申请不携带数据,也要耗费一个序号。
图解:
- A 想敞开连贯,并解决好敞开连贯的预先;
- A 呼叫 B,这是条敞开申请,此次序号为 u;
- B 收到 A 的敞开申请,同时向利用汇报,敞开连贯的事;
- B 呼叫 A,这是条确认申请,此次数据序号为 v,下次发送数据从 u + 1 开始 (这表明 B 收到 A 的上一条(u) 申请了);
- B 解决敞开连贯的事,同时把须要发送的数据给发送完(此时发送的数据都要保留 ack=u+1,因为要给后续 A 发送用),发送完之后,便进行敞开操作;
- B 呼叫 A,这是条敞开申请,此次序号为 w,下次发送数据从 u + 1 开始;
- A 呼叫 B,这是条确认申请,此次序号为 u +1,下次发送数据从 w + 1 开始;
- A 期待 2MSL 后,敞开连贯;
2.2 为什么最初 A 须要期待 2MSL 工夫呢?
- 保障 A 最初发给 B 的报文段能达到 B。如果不能到达 B,在这 2MSL 时间段内,齐全够 B 超时重发 FIN 报文段,且 A 让收到。如果 A 收到后,将持续发送最初一次挥手,且重置期待计时器。期待计时器重置也有次数,如果重置屡次的话,A 将间接敞开。
- 避免”已生效的连贯申请报文段“呈现在挥手阶段。在这 2MSL 时间段内,足够让 B 接管到之前的因网络拥挤而未达到的报文段了,当然报文段有无效时长,超过这个无效时长,将会被抛弃。这样就不会因为下次建设连贯时接管到上次建设连贯时的报文段而产生谬误。
2.3 如果 A 掉电退出了怎么办?
TCP 有一个 保活计时器,当单方接管到对方报文段时,保活计时器将重置。如果保活计时器工夫完结,它将会被动敞开 TCP 连贯。
三、总结
整个 TCP 连贯、相互发送数据(你向我发送数据,我回复你收到)、挥手阶段,都是一个 保护序号的过程。这个序号就是我同对方讲的这句话的惟一标识符。
seq、ack 都尤为重要。seq 示意了某一方数据的唯一性;ack 不仅通知对方下次应该从哪个地位发送,还能验证对方发送的数据是否正确。
整个通信都是针对单方的,没有哪一方为数据的领导者。