TCP/IP 协议详解 第17章 TCP 传输控制协议

TCP使用网络层(IP),提供了一种面向连接的、可靠的字节流服务。

面向连接意味着两个使用TCP协议的应用在彼此交换数据之前必须先建立一个TCP连接。

TCP使用以下方式来提供可靠服务:

  • 应用数据被分割成TCP认为最适合发送的数据块。由TCP传递给IP的信息单位称为报文段或段(segment)。
  • 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
  • TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测在传输过程中的任何变化。如果收到的校验和有差错,TCP将丢弃这个报文段和不缺人收到这个报文段(希望发端超时并重发)。
  • TCP报文段接收到的顺序是不确定的,所以TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  • IP数据包还会发生重复,TCP的接收端必须丢弃重复的数据。
  • TCP还能提供流量控制。TCP连接的双方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。

一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。TCP对字节流不作任何解释。

TCP数据在IP数据报中的封装:
TCP数据在IP数据报中的封装

TCP包首部:
TCP包首部

  • 源端口号和目的端口号用于寻找发端和收端应用程序。两个端口号加上源端IP地址和目的端IP地址可以唯一确定一个TCP连接。一个IP地址和一个端口号称为一个Socket。

  • 序号用来标识TCP发端向收端发送的数据字节流,表示在这个报文段中的第一个数据字节。无符号整数,到达 2^32-1 后又从 0 开始。

    当建立连接时,SYN 标志变 1,序号字段包含由这个主机选择的该连接的初始序号 ISN(initial Sequence Number)。该主机发送的第一个字节的序号是这个 ISN 加 1,因为 SYN 消耗了一个序号。

    确认序号包含发送确认的一端所期望接收到的下一个序号,应当是上次已成功收到数据字节序号加1。只有 ACK 标志为 1 时确认序号字段才有效。

    TCP为应用层提供全双工服务,数据能在两个方向上进行传输,因此连接的每一端必须保持每个方向上的传输序号。

  • 首部长度给出首部中 32bit 字的数目,所以TCP首部的长度范围是 [20-60] 个字节。

  • TCP首部中有 6 个标志比特,可被同时设置为 1 来表示该标志有效:

    URG:紧急指针(urgent pointer)。
    ACK:确认序号。
    PSH:接收方应该尽快将这个报文段交给应用层。
    RST:重建连接。
    SYN:同步序号,用来发起一个连接。
    FIN:发端完成发送任务,用于关闭。

  • TCP流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。

  • 校验和覆盖了整个TCP报文段:TCP首部和TCP数据。由发端计算和存储,并由收端进行验证。(计算时校验和的字段先赋为 0 进行占位)

  • 紧急指针只有在 URG 标志置为 1 时才有效,是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

  • 选项用于可选字段,常见的有最长报文大小,又称为MSS(Maximum Segment Size)。

  • 数据部分是可选的。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据