-
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字节.
- 参考: TCP报文格式
- 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负载.