概述
TCP 和 UDP 都使用相同的网络层 IP,但是与 UDP 不同的是,TCP 是面向连接的、可靠的字节流协议。因此,在传输数据之前通讯双方必须建立1个 TCP 连接。TCP 通过检验和、序列号、确认应对、重发机制、连接收理和窗口控制等机制实现可靠性传输。
TCP通过以下方式提供可靠性:
- 利用数据被分割成 TCP 认为最适合发送的数据块,即进行 TCP 分段。这点与 UDP 完全不同,利用程序产生的 UDP 数据报长度将保持不变,在 IP 层将 UDP 数据报加上IP 首部后,必要时对其进行 IP 分片。
- 当 TCP 发出1个报文段后,它会启动1个定时器,等待目的端确认收到这个报文段,如果没能及时收到该确认信息,则将重发这个报文段。即超时重传。
- 当 TCP 接收端收到发自连接另外一真个 TCP 报文段时,它将发送1个确认,这个确认不是立即发送的,通常会推延几分之1秒。即确认应对。
- TCP 将保持它首部和数据的校验和。这是1个端到真个校验和,目的是检查数据在传输进程中的任何变化。如果收到的报文段的校验和有过失,TCP 将抛弃该报文段,同时不发送确认收到的消息,从而使发送端超时重发。
- 由于 TCP 报文段作为 IP 数据报来传输,IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能失序,如果必要,TCP 将对收到的数据进行重排序,将收到的数据以正确的顺序交给利用层。
- 由于 IP 数据报有可能产生重复,TCP 的接收端必须抛弃重复的数据。
- TCP 能提供流量控制。TCP 连接的每方都有固定大小的缓冲空间,TCP 的接受端只允许另外一端发送接收端缓冲区所能接纳的数据,这将避免较快主机导致较慢主机的缓冲区溢出。即流量控制。
TCP 首部
TCP 首部以下图所示:
TCP 首部比 UDP 首部复杂很多,并且没有表示包长度和数据长度的字段,可由 IP 层获得 TCP 的包长度,并由 TCP 包长度可知数据的长度。下面对 TCP 首部的个字段进行简单介绍:
- 源端口号:表示发送端端口号,字段长 16 位;
- 目标端口号:表示接收端端口号,字段长 16 位;
- 序列号:字段长 32 位,是指发送数据的位置,即标识从发送端向接收端发送的字节流。每发送1次数据,就累加1次该数据字节数的大小。序列号不会从 0 或 1 开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。另外,在建立连接和断开连接时发送的 SYN 包和 FIN 包虽然其实不携带数据,但是也会作为1个字节增加对应的序列号。由此可知,建立 TCP 连接是为了初始化序列号;
- 确认应对:字段长 32 位,是指下1次应当收到的数据的序列号。实际上,它是指已收到确认应对号减1为止的数据。发送端收到确认应对后可以认为在这个序列号之前的数据都已被正常接收;
- 首部长度(数据偏移):该字段表示 TCP 所传输的数据部份应当从 TCP 包的哪一个位置开始计算,可以把它看做是 TCP 首部的长度。该字段长 4 位,单位是 4 字节(即 32 位)。不包括选项字段的话,TCP 首部长度为 20 个字节,因此,数据偏移字段可设置为 5。反之,若该字段值为 5,那末说明从 TCP 包的1开始到 20 字节为止都是 TCP 首部,余下的部份为 TCP 数据;
- 保存:该字段主要是为了以后扩大时使用,其长度为 4 位,1般设置为 0,但即便收到的包在该字段不为 0,此包也不会被抛弃;
- 控制位:字段长为 8 位,每位从左到右分别为 CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫做控制位。当他们的对应位上值为 1 时,具体含义以下:
- CWR:CWR 标志与后面的 ECE 标志都用于 IP 首部的 ECN 字段,ECE 标志为 1 时,则通知对方已将堵塞窗口缩小;
- ECE:若其值为 1 则会通知对方,从对方到这边的网络有阻塞。在收到数据包的 IP 首部中 ECN 为 1 时将 TCP 首部中的 ECE 设为 1.;
- URG:该位设为 1,表示包中有需要紧急处理的数据,对需要紧急处理的数据,与后面的紧急指针有关;
- ACK:该位设为 1,确认应对的字段有效,TCP 规定除最初建立连接时的 SYN 包以外该位必须设为 1;
- PSH:该位设为 1,表示需要将收到的数据立刻传给上层利用协议,若设为 0,则先将数据进行缓存;
- RST:该位设为 1,表示 TCP 连接出现异常必须强迫断开连接;
- SYN:用于建立连接,该位设为 1,表示希望建立连接,并在其序列号的字段进行序列号初值设定;
- FIN:该位设为 1,表示今后不再有数据发送,希望断开连接。当通讯结束希望断开连接时,通讯双方的主机之间就能够相互交换 FIN 位置为 1 的 TCP 段。每一个主机又对对方的 FIN 包进行确认应对以后可以断开连接。不过,主机收到 FIN 设置为 1 的 TCP 段以后没必要马上回复1个 FIN 包,而是可以等到缓冲区中的所有数据都由于已成功发送而被自动删除以后再发 FIN 包;
- 窗口大小:该字段长 16 位,用于通知从相同 TCP 首部的确认应对号所指位置开始能够接收的数据大小(8 位字节)。TCP 不允许发送超过该窗口大小的数据。若窗口为 0,则表示可以发送窗口探测,以了解最新的窗口大小,但这个数据必须是 1 个字节;
- 检验和:TCP 的检验和与 UDP 检验和1样,也是采取伪首部,但是 TCP 的检验和没法关闭。TCP 伪首部的信息和 UDP 1样,包括:源 IP 地址、目的 IP 地址、填充、协议号和 TCP 包长度;
- 紧急指针:该字段为 16 位。只有在 URG 控制位为 1 时有效。该字段的数值表示本报文段中紧急数据的指针。从数据部份的首位到紧急指针所在的位置为止是紧急数据。因此,紧急指针是指出了紧急数据的末尾在报文段中的位置;
序列号与确认应对
在 TCP 中,当发送真个数据到达接收端主机时,接收端主机会返回1个已收到消息通知,该消息就是确认应对(ACK)。TCP 通过确认应对和序列号实现可靠的数据传输,若发送端发出数据以后得到接收真个确认应对,则表示该数据已成功到达接收端,否则可能丢失数据。
超时重传
超时重传是指在重发数据之前,等待确认应对到来的那个特定的时间间隔。若发送端将数据发送出去以后,在特定的时间内没有收到接收真个确认应对,则发送端会重新发送该数据,这就是超时重传机制。
连接收理
TCP 协议是提供面向连接的通讯传输,面向连接是指双方在进行传输数据之前必须建立连接。有关 TCP 的建立连接和释放连接放在后面讲授。
窗口控制
TCP 传输数据是以 1 个段为单位,每发送1个段进行1次确认应对的处理,这样使通讯时包的来回时间很长致使下降通讯性能。为了解决这个问题,TCP 引入了窗口控制,确认应对不再是以每一个分段,而是以更大的单位进行确认,这样缩短转发时间,也就是说,发送端主机在发送了1个段以后没必要要1直等待确认应对,而是继续发送数据段。窗口大小是指无需等待确认应对而可以发送数据的最大值。
采取窗口控制机制必须实现缓冲区,在图 4 中,窗口内的数据即使是没有收到确认应对也能够发送出去。另外从该窗口中能看到的数据是因其某种数据已在传输中丢失,所以发送端才能接收到确认应对,这类情况下需要进行重发。为此,发送端主机在等到确认应对返回之前,必须在缓冲区中保存这部份的数据。在滑动窗口之外的部份包括还没有发送的数据已已确认对端已收到的数据。当数据发出后若如期收到确认应对就能够不用进行重发,此时数据可以从缓冲区中删除。收到确认应对后,将窗口滑到确认应对中的序列号的位置,这样可以顺序地将多个段同时发送提供通讯性能。这类机制也称为滑动窗口机制。
流量控制
流量控制可让发送端根据接收真个实际接受能力控制发送的数据量。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,因而发送端会发送不会超过该大小的数据,该限制大小即为窗口大小,即窗口大小由接收端主机决定。TCP 首部中,专门有1个字段来通知窗口大小,接收主机将自己可以接收的缓冲区大小放在该字段中通知发送端。当接收真个缓冲区面临数据溢出时,窗口大小的值也是随之改变,设置为1个更小的值通知发送端,从而控制数据的发送量,这样到达流量的控制。
堵塞控制
为了避免网络堵塞,TCP 采取了1种慢启动算法,对发送数据量进行控制。为了调理发送真个数据发送量,引入了堵塞窗口,在慢启动时,将这个堵塞窗口设为 1 个数据段发送数据,以后每收到1次确认应对,堵塞窗口的值就加 1。在发送数据包时,将堵塞窗口的大小与接收端主机通知的窗口大小进行比较,然后选择较小的值来控制数据量的发送。
参考资料:
《TCP/IP 详解》
《图解 TCP/IP》