Skip to content

Latest commit

 

History

History
71 lines (62 loc) · 5.47 KB

TCP.md

File metadata and controls

71 lines (62 loc) · 5.47 KB

TCP

1. TCP概述

1.1 TCP服务

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

    • 面向连接: 两个使用TCP的应用(server/client)在彼此交换数据前, 必须先建立一个TCP连接.
    • 可靠性:
      • 应用层数据被分割成TCP认为最合适发送的数据块(segment)
      • TCP发出一个segment后会开启一个计时器, 如果在规定时间内不能收到确认, 会重发.
      • TCP收到对端数据后, 他将发送一个确认, 通常是等待几分之一秒后发送.
      • TCP将保持header和data的校验和, 并且会进行端到端的校验, 若校验不通过则丢弃(希望发端超时并重传)
      • 由于IP的PDU到达时可能会失序, 所以TCP到达时也可能失序. TCP可以将收到失序的数据进行排序后再交给应用层.
      • 如果IP收到重复的数据, TCP会将重复的数据进行丢弃
      • TCP可以提供流量控制: TCP连接两端都有固定大小的缓冲区, TCP的接收端只允许对端发送接收端缓冲区能接纳的数据.
  • TCP交换数据方式

    • TCP交换字节(8 bit)流, 在交换过程中不插入任何标识符来进行分割.
    • TCP对字节流内容不做解释, 解释工作由应用层完成.
    • 发送和接收数据是异步进行的: 如: A向B先后传了10字节, 20字节, 50字节的数据, B可以分4次进行接收, 每次接收20字节.

1.2 TCP首部

tcp-format.png

  • Source/Destination Port: 16比特, 源/目的端口, 标识哪个应用程序发送/接收
    • 源/目端口与IP层源/目的IP地址确定一个TCP连接(即socket对)
    • IP地址与端口号确定一个socket
  • Sequence Number: 32比特, 序号字段, 标识TCP连接中的字节流.
    • 序号字段的值指的是本报文段所发送的数据的第一个字节的序号
    • 新建的连接, syn标志位为1
  • Acknowledgment Number, 32比特, 确认号, 是期望收到对方的下一个报文段的数据的第1个字节的序号, 即上次已成功接收到的数据字节序号加1.
    • 只有ACK标识为1, 此字段有效.
    • TCP为应用层提供全双工服务, 两个方向的序号必须独立地传输.
    • TCP可以表示为一个没有选择确认的或否认滑动窗口的协议:
      • 确认号表示已收到发送方发送的字节, 但不包含确认号本身的字节
      • TCP无法进行选择确认, 如A已经收到B发送的(1-1024)(2049-3072)两个segment, 但是A无法确认(2049-3072), 只能发送1025的ACK;
  • Data Offset: 4比特, 数据偏移, 即首部长度, 以32比特(4字节)为单位, 最大60字节, 若无选项字段, 正常20字节
  • Reserved: 6比特, 保留, 必须填0
  • 6个标志位:
    • URG: 紧急指针有效标识. 它告诉系统此报文段中有紧急数据, 应尽快传送(相当于高优先级的数据)
    • ACK: 确认序号有效标识. 只有当ACK=1时确认号字段才有效
    • PSH: 标识接收方应该尽快将这个报文段交给应用层. 接收到PSH=1的TCP报文段, 应尽快的交付接收应用进程, 而不再等待整个缓存都填满了后再向上交付
    • RST: 重建连接标识. 当RST=1时, 表明TCP连接中出现严重错误 (如由于主机崩溃或其他原因), 必须释放连接, 然后再重新建立连接
    • SYN: 同步序号标识, 用来发起一个连接. SYN=1表示这是一个连接请求或连接接受请求
    • FIN: 发端完成发送任务标识. 用来释放一个连接. FIN=1表明此报文段的发送端的数据已经发送完毕, 并要求释放连接
  • Window: 16比特, 窗口大小的字节数, TCP的流量控制, 窗口起始于确认序号字段指明的值, 这个值是接收端正期望接收的字节数. 窗口最大为65535字节
  • Checksum: 16比特, 校验字段, 包括TCP首部和TCP数据, 是一个强制性的字段, 一定是由发端计算和存储, 并由收端进行验证. 在计算检验和时, 要在TCP报文段的前面加上12字节的伪首部(8字节源/目IP, 1字节0, 1字节协议, 2字节TCP长度).
  • Urgent Pointer: 16比特, 紧急指针, 只有当URG标志置1时紧急指针才有效.
    • 紧急指针是一个正的偏移量, 和序号字段中的值相加表示紧急数据最后一个字节的序号, 即, 紧急指针指出在本报文段中紧急数据共有多少个字节 (紧急数据放在本报文段数据的最前面)
    • TCP的紧急方式是发送端向另一端发送紧急数据的一种方式.
  • Options: 可变, 选项字段
    • MSS, TCP协议最初只规定了这一种选项, 即最长报文段长度(数据字段加上TCP首部), MSS告知对端, 本端缓存所能接收的报文段的数据字段的最大长度字节
    • 窗口扩大因子: 3字节, 其中一个字节表示偏移值S. 新的窗口值等于TCP首部中的窗口位数增大到(16+S), 相当于把窗口值向左移动S位后获得实际的窗口大小
    • 时间戳: 10字节, 其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)
    • 选项表结束
    • 无操作
    • 选项确认选项
  • Padding: 可变, 填充字段, 用来补位, 使整个首部长度是4字节的整数倍.
  • data: 可变, TCP负载.

2. TCP连接的建立与终止

3. TCP的交互数据流

4. TCP的成块数据流

5. TCP的超时与重传

6. TCP的坚持定时器

7. TCP的保活定时器

8. TCP未来