TCP 传输控制协议

134 阅读6分钟

TCP 传输控制协议

  • Transmission Control Protocol 传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,通过 TCP 传输的数据将按照发送顺序无差错、不丢失、不重复地到达接收方
  • 面向连接:TCP 在传输数据之前,必须要先建立连接(通过三次握手确保双方都准备好已经具备收发数据的能力),数据传输完成后还需要断开连接(通过四次挥手释放连接)
  • 可靠传输:通过序列号(使用 seq 序列号对数据包进行编号,确保接收端能够按照发送时候的顺序重组数据)、确认应答、超时重传和滑动窗口(实现流量控制,控制发送方发送数据的速率,避免接收方来不及处理)等机制确保数据能够准确无误地传输到目的地
  • 基于字节流:TCP 将数据看作一个无结构的字节流进行传输,发送方和接收方需要自行处理数据的分段和重组操作
  • 全双工通信:TCP 支持两端同时双向的数据传输,一旦连接建立后,发送方和接收方可以同时双向传输数据(双向通讯协议)
  • 拥塞控制:TCP 在数据传输过程中,会动态进行拥塞控制,避免过多的数据造成的网络拥堵,可以通过慢开始(慢启动)、拥塞避免、快速重传和快速恢复等算法来控制网络拥塞

三次握手

  • 三次握手准确的说应该是三步握手,指的就是 TCP 需要三个步骤(通过三次通信完成握手)才能够建立连接(就是在进行数据传输前,客户端和服务端通过三次信息交换来同步初始序列号并建立可靠连接的机制)
  • 1 客户端向服务端发送一个 SYN (Synchronize)同步序列号包,表示请求建立连接,等待服务端确认
  • 2 服务端回应一个 SYN-ACK (Acknowledge)包(其中这个 SYN 就表示服务端也同意建立连接,而这个 ACK 则表示对客户端 SYN 包的确认,相当于合并了两个操作),表示同意建立连接,等待服务端确认
  • 3 客户端发送一个 ACK 确认包(这个 ACK 就表示对服务端 SYN 包的确认),表示确认连接,服务端在收到 ACK 报文后,至此连接正式建立成功
客户端 -> 服务端:SYN(客户端的 ISN 初始序列号为 X ,即 Init Sequense Number,是随机生成的)
服务端 -> 客户端:SYN-ACK(服务端的 ISN 初始序列号为 Y,确认号为 X + 1)
客户端 -> 服务端:ACK(确认号为 Y + 1,而客户端自己的序列号会加一为 X + 1

三次握手的作用

  • 1 确认双方通信能力正常,确保双方都准备好通信,为可靠的数据传输奠定基础
  • 2 避免历史连接的干扰,交换同步初始序列号,通过同步双方的序列号,防止历史连接的干扰(可以避免网络中延迟的旧连接请求被误认为是新的连接请求),避免资源浪费
  • 3 同步序列号,确保双方的序列号已经正确同步确认(通过一来一回,双方都知晓了对方的初始序列号),保证后续能够正确传输数据,来确保数据的有序性和可靠性

假设只采用两次握手

  • 两次握手无法确保客户端和服务端双方的通信能力都正常(比如服务端确认响应报文丢失,即客户端未收到会认为连接未建立而不发送数据,而服务端会认为连接已建立,等待客户端数据,导致状态不一致而使得数据传输异常)
  • 两次握手无法防止失效的连接请求传送到服务端而导致的错误(比如客户端请求报文因网络延迟未及时到达服务端,后来重传正常处理等等各种操作后之前滞留的过时请求又重新到达了服务端,那么服务端就会误认为这是一个新的有效连接请求并接受,但此时客户端是不会理睬的,从而导致服务端资源浪费)
  • 两次握手无法确保双方都正确同步了序列号(比如服务端的初始序列号没有被客户端确认,影响数据传输的有序性和可靠性)

四次挥手

  • 四次挥手是需要四次通信完成 TCP 连接释放的过程,使得 TCP 连接的双方都能够安全、有序地关闭连接,能够保证数据完整传输的同时有序释放连接的资源
  • 1 主动关闭方发起关闭连接的请求,发送一个 FIN (Finish)数据包,表示想要关闭连接,并停止发送数据(客户端不再发送数据,但仍可以接收服务端的数据),等待服务端的确认
  • 2 服务端收到客户端 FIN 数据包后,会发送一个 ACK 确认数据包作为响应,表示已经收到了客户端的关闭请求(此时服务端仍可以发送数据给客户端)
  • 3 接着当服务端在完成数据发送后,也会向客户端发送一个 FIN 标志的数据包,表示服务端也准备关闭连接
  • 4 客户端收到服务端的 FIN 数据包后,会发送一个 ACK 确认数据包作为响应,服务端收到了最后的 ACK 包后,至此完成连接的完全关闭
//假设客户端为主动关闭方
客户端 -> 服务端:FIN(客户端的序列号为 U,是客户端之前传输数据的最后一个字节的序列号加一)
服务端 -> 客户端:ACK(服务端的序列号为 V,是服务端之前传输数据的最后一个字节的序列号加一,确认号为 U + 1)
服务端 -> 客户端:FIN(服务端的序列号 W,W 的值通常可能是 V + 1,确认号为 U + 1)
客户端 -> 服务端:ACK(确认号为 W + 1,而客户端自己的序列号会加一为 U + 1

四次挥手的作用

  • 因为 TCP 是全双工通信协议,允许数据在两个方向上同时传输,所以每个方向都需要进行单独关闭
  • 四次挥手确保了双方都能安全地关闭连接,避免数据丢失,也算是保证数据的完整性和连接的可靠性