TCP是什么?一文读懂TCP协议(含图解) – wiki基地

一文读懂TCP协议(含图解)

在互联网的世界里,信息的可靠传输至关重要。无论您是在浏览网页、发送电子邮件、观看在线视频还是进行视频通话,都离不开一个幕后英雄——TCP协议(Transmission Control Protocol,传输控制协议)。TCP就像一位负责任的邮递员,确保您的数据包裹(数据包)安全、有序地到达目的地。

本文将深入浅出地讲解TCP协议,带您领略其精妙的设计和工作原理。读完本文,您将对TCP有一个全面而深入的理解。

1. TCP协议概述:可靠传输的基石

1.1 什么是TCP?

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它位于TCP/IP协议栈的传输层,为应用层提供可靠的数据传输服务。

  • 面向连接: TCP在通信双方之间建立一条虚拟的连接,所有数据都通过这条连接进行传输。这就像打电话,先拨号建立连接,然后才能通话。
  • 可靠性: TCP保证数据能够按照发送的顺序、无差错、不丢失、不重复地到达接收方。这是TCP最重要的特性,也是它区别于UDP(User Datagram Protocol,用户数据报协议)的关键所在。
  • 基于字节流: TCP将数据视为一连串的字节,而不是独立的数据包。这意味着TCP可以灵活地控制数据的发送量和发送时机。

1.2 TCP的作用

TCP的主要作用是提供可靠的数据传输服务。它通过以下机制来实现这一目标:

  • 连接管理: 建立、维护和关闭连接。
  • 数据分段: 将应用层传递下来的数据分割成适合网络传输的数据段(Segment)。
  • 流量控制: 防止发送方发送过快,导致接收方来不及处理。
  • 拥塞控制: 避免网络拥塞,保证数据传输的效率和公平性。
  • 差错控制: 检测和纠正数据传输过程中出现的错误。
  • 重传机制: 对于丢失或损坏的数据段进行重传。

1.3 TCP与UDP的区别

TCP和UDP都是传输层协议,但它们的设计理念和应用场景截然不同。

特性 TCP UDP
连接性 面向连接 无连接
可靠性 可靠 不可靠
顺序性 保证顺序 不保证顺序
流量控制
拥塞控制
传输速度 较慢 较快
应用场景 文件传输、网页浏览、电子邮件等 实时音视频、在线游戏、DNS查询等

简而言之,TCP追求可靠性,而UDP追求速度。在需要可靠传输的场景下,例如文件传输、网页浏览、电子邮件等,TCP是首选。而在对实时性要求较高、可以容忍少量数据丢失的场景下,例如实时音视频、在线游戏、DNS查询等,UDP更合适。

2. TCP报文段结构:数据传输的载体

TCP报文段(Segment)是TCP数据传输的基本单位。了解报文段的结构,有助于我们理解TCP的工作原理。

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

下面是对TCP报文段各个字段的解释:

  • Source Port(源端口): 16位,标识发送方的端口号。
  • Destination Port(目的端口): 16位,标识接收方的端口号。
  • Sequence Number(序列号): 32位,标识发送方发送的数据段的序号。用于解决网络包乱序问题。
  • Acknowledgment Number(确认号): 32位,期望收到的下一个数据段的序号。用于确认已成功接收的数据段,实现可靠传输。
  • Data Offset(数据偏移): 4位,指示TCP报文段的首部长度。由于选项字段长度可变,需要这个字段来确定数据部分的起始位置。
  • Reserved(保留): 6位,保留字段,目前未使用。
  • Flags(标志位): 6位,每个标志位有不同的含义:
    • URG(紧急指针有效): 当URG=1时,表示紧急指针字段有效。
    • ACK(确认序号有效): 当ACK=1时,表示确认号字段有效。TCP规定,连接建立后所有传送的报文段都必须把ACK置为1。
    • PSH(推送): 当PSH=1时,接收方应尽快将数据交付给应用层,而不用等到整个缓冲区都填满。
    • RST(复位): 当RST=1时,表示TCP连接出现严重错误,必须释放连接,然后重新建立连接。
    • SYN(同步): 在建立连接时使用。当SYN=1,ACK=0时,表示这是一个连接请求报文段。当SYN=1,ACK=1时,表示这是一个连接接受报文段。
    • FIN(终止): 用于释放连接。当FIN=1时,表示发送方的数据已发送完毕,要求释放连接。
  • Window(窗口大小): 16位,表示发送方自己的接收窗口大小,用于实现流量控制。
  • Checksum(校验和): 16位,用于检测报文段在传输过程中是否出现错误。
  • Urgent Pointer(紧急指针): 16位,仅在URG=1时有效。指出紧急数据的末尾在报文段中的位置。
  • Options(选项): 长度可变,用于支持一些可选的功能,如最大报文段长度(MSS)、窗口扩大选项、时间戳选项等。
  • Padding(填充): 用于保证选项字段和整个TCP报文段首部是4字节的整数倍。
  • Data(数据): 应用层传递下来的数据。

3. TCP三次握手:建立可靠连接

TCP建立连接的过程被称为“三次握手”(Three-Way Handshake)。之所以需要三次握手,是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

三次握手的过程如下:

  1. 第一次握手(SYN): 客户端向服务器发送一个SYN报文段,其中包含客户端的初始序列号(ISN,Initial Sequence Number)。此时客户端进入SYN_SENT状态。

    • Client: SYN (seq=x)
    • 第二次握手(SYN+ACK): 服务器收到SYN报文段后,向客户端发送一个SYN+ACK报文段,其中包含服务器的ISN和对客户端ISN的确认(ack=x+1)。此时服务器进入SYN_RCVD状态。

    • Server: SYN+ACK (seq=y, ack=x+1)

    • 第三次握手(ACK): 客户端收到SYN+ACK报文段后,向服务器发送一个ACK报文段,其中包含对服务器ISN的确认(ack=y+1)。此时客户端进入ESTABLISHED状态,服务器收到ACK报文段后也进入ESTABLISHED状态。

    • Client: ACK (ack=y+1)

三次握手

为什么需要三次握手?

假设只有两次握手,客户端发送了一个SYN报文段请求建立连接,但由于网络原因,这个报文段滞留在了网络中。客户端超时后,又重新发送了一个SYN报文段,这次成功建立了连接,数据传输完毕后释放了连接。

过了一段时间,之前滞留的SYN报文段到达了服务器。服务器以为客户端又要建立连接,于是发送了一个SYN+ACK报文段。由于只有两次握手,服务器发送完SYN+ACK报文段后就认为连接已经建立了,开始等待客户端发送数据。但客户端并没有发送数据,因为这并不是客户端期望的连接。这样,服务器就白白浪费了资源。

三次握手可以解决这个问题。在第三次握手中,客户端会发送一个ACK报文段来确认服务器的SYN+ACK报文段。如果客户端没有收到正确的SYN+ACK报文段(例如,收到了过期的SYN+ACK报文段),就不会发送ACK报文段,服务器也就不会进入ESTABLISHED状态,从而避免了资源的浪费。

4. TCP四次挥手:优雅地断开连接

TCP断开连接的过程被称为“四次挥手”(Four-Way Wavehand)。与三次握手不同,TCP的断开连接是双向的,每一方都需要发送FIN报文段来终止自己的连接。

四次挥手的过程如下:

  1. 第一次挥手(FIN): 客户端向服务器发送一个FIN报文段,表示客户端已经没有数据要发送了,请求关闭连接。此时客户端进入FIN_WAIT_1状态。

    • Client: FIN (seq=u)
    • 第二次挥手(ACK): 服务器收到FIN报文段后,向客户端发送一个ACK报文段,确认客户端的FIN报文段。此时服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。

    • Server: ACK (ack=u+1)

    • 第三次挥手(FIN): 服务器向客户端发送一个FIN报文段,表示服务器也已经没有数据要发送了,请求关闭连接。此时服务器进入LAST_ACK状态。

    • Server: FIN (seq=v)

    • 第四次挥手(ACK): 客户端收到FIN报文段后,向服务器发送一个ACK报文段,确认服务器的FIN报文段。此时客户端进入TIME_WAIT状态,等待2MSL(Maximum Segment Lifetime,报文段最大生存时间)后关闭连接。服务器收到ACK报文段后立即关闭连接。

    • Client: ACK (ack=v+1)

四次挥手

为什么要等待2MSL?

TIME_WAIT状态的存在有两个主要原因:

  • 可靠地实现TCP全双工连接的终止: 假设客户端发送的最后一个ACK报文段丢失了,服务器会超时重传FIN报文段。如果客户端没有TIME_WAIT状态,直接关闭了连接,就无法收到服务器重传的FIN报文段,也就无法再次发送ACK报文段,导致服务器无法正常关闭连接。
  • 允许老的重复报文段在网络中消逝: 在网络中,可能存在一些延迟的报文段。如果客户端过早地关闭了连接,然后又使用相同的端口号建立了新的连接,这些延迟的报文段可能会被误认为是新连接的数据,导致错误。TIME_WAIT状态可以确保这些老的重复报文段在网络中消逝,避免干扰新连接。

5. TCP可靠传输的实现:精妙的机制

TCP的可靠性是通过多种机制共同实现的,包括:

5.1 序列号和确认号

TCP使用序列号(Sequence Number)和确认号(Acknowledgment Number)来保证数据的有序性和可靠性。

  • 序列号: 发送方为每个发送的数据段分配一个序列号,表示该数据段在数据流中的位置。
  • 确认号: 接收方通过确认号来告知发送方已经成功接收了哪些数据段。确认号的值是期望接收的下一个数据段的序列号。

例如,如果接收方收到了序列号为1-1000的数据段,就会发送一个确认号为1001的ACK报文段,表示期望接收序列号为1001的数据段。

5.2 重传机制

TCP使用重传机制来处理数据段丢失或损坏的情况。当发送方发送一个数据段后,会启动一个定时器。如果在定时器超时之前没有收到接收方的确认,就会重传该数据段。

TCP的重传机制有两种:

  • 超时重传(Timeout Retransmission): 发送方在发送一个数据段后,启动一个定时器。如果在定时器超时之前没有收到接收方的确认,就重传该数据段。
  • 快速重传(Fast Retransmit): 如果发送方连续收到三个重复的ACK报文段(即确认号相同的ACK报文段),就认为该ACK报文段对应的数据段丢失了,立即重传该数据段,而不用等到定时器超时。

5.3 滑动窗口

TCP使用滑动窗口(Sliding Window)机制来实现流量控制和提高传输效率。

滑动窗口是一个动态的缓冲区,用于控制发送方可以发送的数据量。窗口的大小由接收方通过TCP报文段中的Window字段告知发送方。

发送方的滑动窗口包含以下几个部分:

  • 已发送且已确认: 这部分数据已经成功发送并被接收方确认,可以从缓冲区中移除。
  • 已发送但未确认: 这部分数据已经发送,但还没有收到接收方的确认,需要保留在缓冲区中,以便在必要时进行重传。
  • 未发送但可以发送: 这部分数据在接收方允许的窗口范围内,可以立即发送。
  • 未发送且不可发送: 这部分数据超出了接收方允许的窗口范围,暂时不能发送。

滑动窗口

随着数据段的发送和确认,滑动窗口会不断地向前滑动。

5.4 流量控制

流量控制(Flow Control)是为了防止发送方发送过快,导致接收方来不及处理。TCP通过滑动窗口机制来实现流量控制。接收方通过TCP报文段中的Window字段告知发送方自己的接收窗口大小,发送方根据接收窗口大小来调整自己的发送速率。

5.5 拥塞控制

拥塞控制(Congestion Control)是为了避免网络拥塞,保证数据传输的效率和公平性。TCP的拥塞控制机制包括:

  • 慢启动(Slow Start): 在连接建立初期,发送方将拥塞窗口(Congestion Window,cwnd)设置为一个较小的值(通常为1个MSS),然后每收到一个ACK报文段,就将cwnd加倍。
  • 拥塞避免(Congestion Avoidance): 当cwnd达到慢启动阈值(ssthresh)时,进入拥塞避免阶段。在拥塞避免阶段,每收到一个ACK报文段,就将cwnd增加1/cwnd个MSS。
  • 快速重传(Fast Retransmit): 如前所述,快速重传可以更快地发现数据段丢失,提高传输效率。
  • 快速恢复(Fast Recovery): 当发生快速重传时,TCP认为网络可能出现了拥塞。快速恢复算法将ssthresh设置为当前cwnd的一半,然后将cwnd设置为ssthresh+3个MSS,并重传丢失的数据段。如果收到新的ACK报文段,就将cwnd增加1个MSS。

6. 总结:TCP的魅力

TCP协议是一个复杂而精妙的协议,它通过多种机制的协同工作,实现了可靠的数据传输。TCP的设计理念和实现细节,值得我们深入学习和思考。

通过本文,我们了解了:

  • TCP协议的定义、作用和与UDP的区别。
  • TCP报文段的结构和各个字段的含义。
  • TCP三次握手和四次挥手的过程和原理。
  • TCP可靠传输的实现机制,包括序列号和确认号、重传机制、滑动窗口、流量控制和拥塞控制。

希望本文能够帮助您更好地理解TCP协议,为您的网络学习和实践打下坚实的基础。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部