TCP 协议三次握手与四次挥手

TCP 简述

按层次分,TCP位于传输层,提供可靠的字节流服务。所谓的字节流服务(ByteStreamService)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。

三次握手的过程

为了准确无误的将数据送达目标处,TCP协议采用了三次握手的策略。

  1. 客户端发送带有 SYN 标志的数据包–-一次握手–服务端;
  2. 服务端发送带有 SYN/ACK 标志的数据包–-二次握手–客户端;
  3. 客户端发送带有带有 ACK 标志的数据包–-三次握手–服务端。

提问: TCP三次握手,如果两次握手会怎么样?

TCP 的握手过程本质上就是使通信双方获得彼此数据原点的序列号。

A <-------> B

  1. A 发送同步信号SYN + A's seq num (举例 1000),
  2. B 发送同步信号, SYN B's seq num (举例 2000) 与 确认信号 ACK 1000
  3. A 发送确认信号,ACK 1001

到达第2步时,A已知自身和B的序号,并且也确认了B服务器知其序号。但若省略第 3 步,B 虽然知道自身和 A 的序号,但是无法确认 A 是不是知道了自身的序号,故而 A 的 TCP 状态是 ESTABLISED 但是 B 还只是 ACTIVE。

其实当第 3 步 A 的确认信号因网络问题没有送达 B 时也不要紧,因为下方第 1 步还会再发 ACK 包,收到后 B 也会激活 TCP 状态为 ESTABLISED。

此后 A 与 B 通信时

  1. A 发送数据附带序号与ACK,seq 1001 ACK 1001
  2. B 发送确认信号 ACK 1002

四次挥手

  1. 客户端发送一个 FIN,用来关闭客户端到服务器的数据传送;
  2. 服务器收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。和 SYN 一样,一个 FIN 将占用一个序号;
  3. 服务器关闭与客户端的连接,发送一个FIN给客户端;
  4. 客户端发回 ACK 报文确认,并将确认序号设置为收到序号加 1。

提问:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

建立连接时,因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。

而关闭连接时,当收到对方的 FIN 报文时,仅表示对方不再发送数据但还能接收收据,我们也未必把全部数据都发给了对方,所以我们可以立即 close,也可以发送一些数据给对方后,再发送 FIN 报文给对方表示同意关闭连接。因此我们的 ACK 和 FIN 一般会分开发送。

TCP 协议如何保证可靠传输

TCP协议保证数据传输可靠性的方式主要有:

  1. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  2. 确认应答+序列号(累计确认+seq)。接收方收到报文就会确认(累积确认:对所有按序接收的数据的确认),TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。TCP 的接收端会丢弃重复的数据。
  3. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  4. 拥塞控制: 当网络拥塞时,减少数据的发送。
  5. 停止等待协议 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  6. 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
posted @ 2020-04-26 15:19  Ever-Lose  阅读(161)  评论(0编辑  收藏  举报