If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

传输控制协议(Transmission Control Protocol,TCP)

传输控制协议(TCP)是一种传输协议,用于在IP之上以确保可靠地传输数据包。
TCP包含一些机制,可以解决由于基于数据包的消息传递而引起的许多问题,例如数据包的丢失,数据包的乱序,数据包的重复和数据包的损坏。
由于TCP是IP上最常用的协议,因此互联网协议栈有时被称为 TCP / IP

封包格式

当使用TCP / IP发送数据包时,每个 IP 数据包 的数据部分被格式化为 TCP段
IP数据包中的TCP段图。 IP数据包包含头部和数据部分。 IP数据段是TCP段,它本身包含头部和数据段。
每个TCP段都包含一个标头和数据。 TCP头部比UDP头部包含更多的字段,其大小范围为2060字节,具体取决于选项字段的大小。
TCP头部与UDP头部共享一些字段:源端口号,目标端口号和校验和。 要记住它们的用法,请查看 UDP article

从开始到结束

让我们逐步介绍使用TCP / IP传输数据包的过程。

步骤 1: 建立连接

当两台计算机希望通过TCP相互发送数据时,它们首先需要使用三向握手建立连接。
两台用箭头连接的计算机的图像。
  • 从计算机1指向计算机2的箭头,标记为"SYN"。
  • 从计算机2指向计算机1的箭头,标记为"ACK SYN"。
  • 从计算机1指向计算机2的箭头,标记为"ACK"。
第一台计算机发送一个SYN位设置为1的数据包(SYN =“ synchronize?”)。 第二台计算机发回一个包,该包的ACK位设置为1(ACK =“ acknowledge!”)加上SYN位设置为1。 第一台计算机以ACK答复。
SYN位和ACK位都是TCP标头的一部分:
带有行字段的TCP标头图。 每行长32位。 第一行包含一个16位源端口号和一个16位目的端口号。 第二行包含一个32位序列号。 第三行包含一个32位确认号。 第四行包含一个4位数据偏移号,被标记为保留的6位,6个控制位(URG,ACK,PSH,RST,SYN和FIN)以及一个16位窗口大小号。 第五行包含一个16位校验和和16位紧急指针。 标头以选项和填充结尾,其长度可变。
ACK位和SYN位突出显示在标头的第四行上。
实际上,三向握手中涉及的三个数据包通常不包含任何数据。 一旦计算机完成了握手,它们就准备好接收包含实际数据的数据包了。

步骤 2: 发送数据包

通过TCP发送数据包时,接收者必须始终确认接收到的内容。
两台用箭头连接的计算机的图像。
  • 从计算机1指向计算机2的箭头,显示传输的数据以及“Sequence #1”的标签。
  • 从计算机2指向计算机1的箭头,标记为“ACK”。
第一台计算机发送一个包含数据和序列号的数据包。 第二台计算机通过将设置ACK位并依据接收数据的长度增加接收号来对其进行确认。
序列号和确认号是TCP标头的一部分:
带有行字段的TCP标头图。 每行长32位。 第一行包含一个16位源端口号和一个16位目的端口号。 第二行包含一个32位序列号。 第三行包含一个32位确认号。 第四行包含一个4位数据偏移号,被标记为保留的6位,6个控制位(URG,ACK,PSH,RST,SYN和FIN)以及一个16位窗口大小号。 第五行包含一个16位校验和和16位紧急指针。 标头以选项和填充结尾,其长度可变。
突出显示了32位序列号和确认号。
这两个数字可帮助计算机跟踪了解成功接收了哪些数据,丢失了哪些数据以及哪些数据意外发送了两次。

步骤 3: 关闭连接

当不需要发送和接收数据时,两台计算机中的任何一台都可以关闭连接。
两台用箭头连接的计算机的图像。
  • 从计算机1指向计算机2的箭头,标记为"FIN"。
  • 从计算机2指向计算机1的箭头,标记为"ACK FIN"。
  • 从计算机1指向计算机2的箭头,标记为"ACK"。
计算机通过发送FIN位设置为1(FIN =完成)的数据包来启动关闭连接。 另一台计算机答复一个ACK和另一个FIN。 从启动计算机再发出一个ACK后,连接关闭。

检测丢失的数据包

TCP连接可以使用超时来检测丢失的数据包。
图像显示了一台计算机向另一台计算机重新发送一个数据包的情形。最上面是一条从第一台计算机指向第二台计算机的箭头,标记着“sequence #1”以及一段数据。箭头后的小闹钟表示不同时间阶段,第一个表示刚开始,第二个表示过去了一半时间,第三个表示过去了全部时间,并且闹钟响了。下面是另一条从第一台计算机指向第二台计算机的箭头,有与前一个箭头相同的标记。
发送完数据包后,发送方启动计时器并将数据包放入重传队列中。 如果计时器用尽并且发送方尚未从接收方收到ACK,它将再次发送数据包。
如果数据包实际上并没有丢失,只是到达或确认的速度非常慢,则重传可能导致接收方接收到重复的数据包。 如果这样,接收者可以简单地丢弃重复的数据包。 有两次数据总比没有好!

处理乱序数据包

TCP连接可以使用序列号和确认号来检测乱序的数据包。
两台用箭头连接的计算机的图像。
  • 箭头从计算机1到计算机2,并显示一盒标有 "Seq #1"的二进制数据。
  • 箭头从计算机2到计算机1,标为 "Ack #37"。
  • 箭头从计算机1到计算机2,并显示一盒标有 "Seq #73"的二进制数据。
  • 箭头从计算机2到计算机1,标为 "Ack #37"。
当接收端看到的序列号比他们到目前为止所确认的要高时,他们知道他们之间至少丢失了一个数据包。 在上图所示的情况下,接收端看到的序列号为#73,但期望的序列号为#37。 接收端通过发送一个将确认号设置为预期序列号的数据包,使发送端知道有问题。
有时,丢失的数据包只是通过互联网的速度较慢,然后很快就到达了。
TCP数据包乱序到达的示意图。 所示的两台计算机带有来回箭头,它们的垂直位置表示发送和到达的时间:
  • 标记为“ Seq#1”的箭头从计算机1开始,到计算机2之后不久结束。
  • 标记为“ Ack#37”的箭头从计算机2开始并在到计算机1之后不久结束。
  • 标记为“ Seq#37”的箭头从计算机1开始,直到很晚才在计算机2处结束。
  • 标记为“ Seq#73”的箭头从计算机1开始并在到计算机2之后不久终止(在“ Seq#37”的箭头之前)。
  • 标记为“ Ack#37”的箭头从计算机2开始并在到计算机1之后不久终止(在“ Seq#37”的箭头之前)。
其他时候,丢失的数据包实际上就是丢失了,发送方必须重新发送该数据包。
TCP数据包乱序到达的示意图。 所示的两台计算机带有来回箭头,它们的垂直位置表示发送和到达的时间:
  • 标记为“ Seq#1”的箭头从计算机1开始,到计算机2之后不久结束。
  • 标记为“ Ack#37”的箭头从计算机2开始并在到计算机1之后不久结束。
  • 标记为“ Seq#37”的箭头从计算机1开始并在到计算机2之前结束,带有X的箭头表示已丢失。
  • 标记为“ Seq#73”的箭头从计算机1开始,到计算机2之后不久结束。
  • 标记为“ Ack#37”的箭头从计算机2开始并在计算机1之后不久结束。
  • 标记为“ Seq#37”的箭头从计算机1开始,到计算机2之后不久结束。
在两种情况下,接收者都必须处理乱序数据包。 幸运的是,接收者可以使用序列号以正确的顺序重组数据包数据。
TCP数据重组图。

🙋🏽🙋🏻‍♀️🙋🏿‍♂️您对此主题有任何疑问吗? 我们很乐意回答-只需在下面的问题区域中提问即可!

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.