TCP 除了三次握手你还需要知道的东西

TCP 的可靠性

就一个问题:众所周知,TCP 是需要可靠连接的通信,那 TCP 是如何保证可靠性的?

前景提要:为了保证 IP 数据报实现可靠性传输,需要考虑很多事情,如

  • 数据的破坏
  • 丢包
  • 重复发包
  • 分片顺序混乱
  • ...

如果这些问题得不到解决,可靠性就无从谈起,而后是一些优化控制,如何让 TCP 传输在保证可靠的前提下传输效率达到最优。

所以下面要讲到 TCP 实现可靠性的几种机制。

  • 确认应答:回复确认,未回复则认为失败
  • 序列号:回复下一个要发送的序列号
  • 重发控制:未收到确认应答,进行重发
  • 窗口控制:提高速度,发多个数据包,确认应答中会返回最大的序列号
  • 连接管理:三次握手+四次挥手
  • 检验和
  • 拥塞控制:慢启动算法,窗口由小变大
TCP主要特点.jpg

确认应答(ACK)

发送端发送数据,接收端收到后会返回 ACK,以确认收到。
如果不返回(不论是发送端出问题还是接收端出问题),则认为发送失败,会进行重发,所以这是 肯定的 应答。

序列号

发送端发送数据包会带上数据的序列号 (如 1~1000),接收端收到后会返回下一个序列号(如 1001)。
序列号是按顺序给发送数据的每一个字节(8位字节)标上的编号。

重发机制

发送端没接收到 ACK 应答,则会重发。这个重发时间间隔需要计算得到。
超时一般都以 0.5 秒为单位进行控制,因此重发超时都是 0.5 秒的整数倍。
由于最初数据包不确定超时时间,所以一般设置在 6 秒 左右。
如果数据被重发之后,还是收不到应答,时间间隔将以 2 倍4 倍的指数函数延长。
数据不会被无限得重发,到达一定次数后,通信会强制终止。

连接管理

这个方面才是我们常说的 三次握手四次挥手
但需要注意的是,在这握手和挥手的通信中,发的通知信息都是一致的。只不过在 三次握手 是服务端将 ACKSYN 合在了一起。

三次握手

四次挥手

段 - TCP数据的单位(旧)

每种数据链路的 MTU(最大传输单元,Max Transfer Unit)都不尽相同,这是因为每种数据链路的使用目的不同。路径MTU发现 是指去发现整个传输链路中最小的 MTU。(这属于 IP 报文分片和重组部分)

TCP 以段为单位进行传输数据,传输中最理想的传输部分大小是正好 IP 中不会被分片处理的最大长度。
TCP 在三次握手的时候,会在两端主机间计算出 MSS(最大消息长度 ,Maximum Segment Size)。

  • 第一次握手的 SYN 包中客户端填入一个 MSS;
  • 第二次握手的 ACK 包中服务端填入另一个 MSS;
  • 之后在传输时,按两次 MSS 的最小者进行传输。

窗口 - 提高速度

TCP 每一次确认 ACK 只发一个段的话,会很浪费时间,效率低。所以有了窗口的概念。
窗口大小:是以段为单位的,指在无须等待确认应答而可以继续发送数据的最大值。(下方流控制还有介绍)

窗口为 4 的数据传输

另一种解释名词就是 滑动窗口。像一个滑动的窗口来控制传输的部分。
滑动窗口

客户端收到应答后按最大的序列号进行重发。

重发控制

  • 接收端需要控制收到的信息连续。如果不连续会一直返回需要的包序号;
  • 发送端 连续三次 收到相同的序号时,重发数据;
  • 重发了数据之后,接收端自动计算出下一个未发送的序列号。
重发控制

流控制 - 窗口探测和窗口大小

发送端根据自己的情况发送数据,但接收端可能有一些问题导致效率下降,频繁返回丢包(比如接收端主机缓冲区满了),频繁触发重试机制,导致网络流量无端浪费。因此有了流控制。
流控制 就是 TCP 提供的一种机制,让发送端根据接收端 实际接收能力 控制发送的数据量。
窗口探测 是发送端 时不时 得发送一个仅有一个字节的数据段,以获取最新的窗口大小信息。

慢启动 - 拥塞控制

有了窗口控制后,传输的单位不再为 ,而是 拥塞窗口。但为了防止一开始发送大量数据,因而有了 慢启动
拥塞窗口:起初为 1 个数据段,之后每收到一个 ACK 窗口值就增加 。
慢启动:一开始窗口先小一点,后续修正。

  • 拥塞窗口的增加上成指数函数的;
  • 拥塞窗口有阈值限制。

上面大致就讲完了。但还有一些提高网络利用率的方式:

  • Nagle 算法;
  • 延迟确认应答:接收端第两次接收返回一次应答的机制;
  • 捎带应答:TCP 确认应答和回执数据通过一个包发送的机制;

TCP 首部格式图

TCP 首部格式图

注意:

  • 序列号 首次不是从 0 或 1 开始,而是随机产生的一个。之后每传输一次增长自己传输字节的大小。
  • 确认应答号 是下一个接收序列号的值(如 1001 或 4001)。
  • SYN、ACK、FIN 这些信息是在 控制位 位置(8 bit)。(ACK 最初建立连接的 SYN 包时为 0 外,后面必--- 须是 1)
  • 紧急指针 只有在 控制位 URG 为 1 时有效,它标记了 紧急数据 的位置(从数据部分的首位到紧急指针指向的位置之间的数据)。
  • 在 Web 浏览器中点击停止按钮或在 Telnet 中按 Ctrl+C 会将 URG 位设置为 1。

相比之下,附一张 UDP 的首部格式图:

UDP 首部格式图

文章出自于《图解 TCP/IP》第六章。
tcp_headers.png

你可能感兴趣的:(TCP 除了三次握手你还需要知道的东西)