TCP-Basics

TCP Basics

概述

TCP提供一种面向连接的可靠的 字节流服务

面向连接

这一特性要求传输必须是端到端的,同时在连接的每一端,都需要有相应的资源和机制来维护TCP连接的状态。

可靠的

TCP协议主要通过以下几种方式来确保TCP连接的可靠性:

  • 数据分段。应用层传下来的数据会被TCP分成几段再往下传给IP,通常传给IP层的,已经添加过TCP包Header的信息单位也被称为报文段(segment)
  • 超时重传。在TCP连接的一端发送了一个报文段之后,会为这一个报文段启动一个定时器,如果在指定的时间内收不到另一端对这一报文段的ACK,TCP连接将会重发这一报文段。通常TCP在收到一个报文段之后并不会立即发送ACK,而是推迟几百毫秒之后再发送。
  • 数据包检查和。TCP包的Header中添加了首部和数据(首部是pseudo-header,双端IP地址、零、TCP协议号6、TCP包长度)的检验和,TCP连接的一端收到TCP数据包之后会对其进行检测,如果收到数据包的检验和有差错,将会直接丢弃这一个TCP数据包同时不ACK这一个数据包
  • 重排序。如有必要,TCP将对收到的数据包进行重排序。由于IP数据报的转发是由路径上的路由器决定的,因此经常会出前后两个TCP数据包走的不同IP路由路径并且到达对端的先后顺序前后倒置。这时候便需要TCP对收到的数据包进行重新排序,否则乱序的已经被分段过的TCP数据包就无法重新组合成最开始应用层传下来的数据块。
  • 流量控制。TCP连接的每一端都有固定大小的缓冲空间。在协议上,TCP的接收端只允许另一端发送接收端缓冲区能够接收的数据量。缓冲区限制不仅能防止较快的发送端导致较慢的接收端缓冲区溢出;还能提高整体的运行效率(TCP一般都在内核当中,而应用层则基本都是用户态的程序,如果TCP每收到一个数据包就传给应用层程序会导致操作系统频繁地在内核态和用户态之间转换)。

字节流服务

应用程序通过TCP连接交换8bit字节构成的字节流,TCP不在字节流当中插入任何标识符(很多PPP协议会使用“字符填充”技术往字节流里塞特殊字符)。TCP提供给应用程序的这种服务也被称之为字节流服务(byte stream service)

TCP包首部

  • 端口号:每个TCP数据包首部中都会包含源端口号目的端口号,以便用于寻找发送端和接收端的应用程序。
    这两个端口号加上源端IP地址和目的IP地址唯一确定一个TCP连接。一个IP地址和一个端口号很多时候也被称为一个插口(socket)
  • 序列号:序列号是32bit的无符号数,到达上限后又从0开始。TCP用其对每个字节进行计数。
    TCP连接发送数据的第一个字节序号为ISN(Initial Sequence Number)+ 1。
  • 标识符:粉红色字段的标示位是是重要的标识符,当标识符被置为1时通常具备了特殊意义。
    URG:指明TCP包处于紧急(urgent)模式当中。
    ACK:确认序号有效,通知接收方其之前发送的某个或多个TCP包(由确认序号确定)已经被ACK。
    PSH:接收方应该尽快将这个报文段交给应用层。
    RST:重建连接,当TCP连接出现异常时,该标识符经常被使用。
    SYN:使用同步序号来请求建立一个新的TCP连接。
    FIN:发送端完成发送任务,请求断开TCP连接。
  • 窗口:也被称为TCP拥塞窗口,用来通知接收端期望接收到的字节数,TCP流量控制(拥塞控制)的关键所在。
  • 检验和:检验和覆盖了整个TCP报文段(pseudo-header+数据),接收端用其来验证字节流的完整性。这是一个强制性的字段,一定是由发端计算和存储,并由接收端进行验证。