TCP(1):TCP协议概述

TCP(Transmission Control Protocol)协议是面向连接的可靠的、基于字节流的传输层通信协议,工作在OSI模型中的第四层(传输层)上。

基本概念

OSI模型

ISO在1984年定义了网络互连的7层结构模型,分别是:

  1. 物理层(Physical Layer)在局域网传输数据帧(Data Frame),负责管理电脑通信设备和网络媒体之间的互通
  2. 数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错
  3. 网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成报文。IP协议就在这一层。
  4. 传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。
  5. 会话层(Session Layer)负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接。
  6. 表达层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式。
  7. 应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。

原理

在IP(Internet Protocol)层的任务仅仅是根据源主机和目的主机的地址来传送数据,数据在IP层传送时会被封装为数据包,但比较独特的是在传输数据之前无需与目的主机建立连接。IP协议提供了不可靠的数据传输机制(或者称之为“尽最大努力交付”),但无法保证数据能够准确的传输,因为数据包在到达的时候可能出现故障,包括:

IP协议不能保证可靠性,即便IPv4在数据报头中有校验和的计算,但假设计算出校验和不正确则直接丢掉错误的包,而不会通知到任一个终端节点。在Ipv6中为了快速传输已经放弃了计算校验和。而TCP协议可以提供在不同的主机的应用层之间进行可靠的、管道般的连接。整个过程是:应用层向TCP层发送数据流,TCP将数据流分割适当长度的报文段(通常受限于数据链路层的最大传输单元MTU),而后将包传输到IP层,并传送给接收端的TCP层。为了保证不丢包和顺序性,TCP给每一个包一个序号,接收端接受到包后会发送ACK信息确认;如果在往返时延(RTT)内未收到确认,那么对应的数据包就被认为已经丢失并进行重传。同时,TCP使用一个校验和来检测数据是否存在错误,在发送和接受的时候都需要计算。

运作方式

TCP协议运行分为三个阶段:创建连接、数据传送和连接终止。首先来看TCP的数据包的结构:

TCP包结构

TCP将数据封装在IP报文中进行传输。

<-------------------------------IP报文---------------------------------->
|-------IP头部--------|-------TCP头部--------|-----------TCP数据----------|

其中,IPv4下IP头部为20字节(不带选项,如果带选项可能更长),IPv6为40字节。TCP头部20字节(不带选项),TCP包的结构如下:

Figure 1: TCP package structure
TCP package structure

连接创建与关闭

TCP使用三次握手(three-way handshake)来创建一个连接。这个过程是:

  1. 客户端向服务端发送SYN来创建一个主动打开,客服端设定这段连接的序号为随机数 𝐼𝑆𝑁(𝑐)
  2. 服务端收到SYN后回复SYN/ACK,确认号为𝐼𝑆𝑁(𝑐)+1,而这个回复包含一个随机序号𝐼𝑆𝑁(𝑠)
  3. 最后,客户端再次发送一个ACK,此时包的序号为𝐼𝑆𝑁(𝑐)+1,服务端回复的确认码为𝐼𝑆𝑁(𝑠)+1。这样就完成了三次握手,进入了连接创建状态
Figure 2: Tcp connection flow
Tcp connection flow

客户端和服务端任何一方都可以发起连接关闭的操作。这个过程如下:

  1. 主动关闭者发送一个FIN指明希望看到自己当前的序列号(K),并包含了对方最近一次的数据序列号(L)
  2. 被动关闭者发送ACK表明已经成功接收到FIN,并通知上层的应用程序连接端已经提出了关闭操作
  3. 接着被动关闭者将变成主动关闭者,并发送FIN
  4. 收到ACK,完成连接的关闭

因为TCP是双工通信,实际上支持一种半关闭的操作,也就是说一方数据发送完成后关闭传输但任然保留接收数据的能力。这种情况下只有一方发送了FIN,但实际很少有程序使用这种特性。

其他需要了解的性质

由于TCP协议的设计,有一些相关的需要了解的性质如下: