目录
TCP 协议是传输层上一个非常重要的协议, 即: 传输控制协议
1. TCP 协议端格式
- 源 / 目的端口号: 表示数据是从哪个进程来, 到哪个进程去
- 32 位序号 / 32 位确认号: 保证 TCP 可靠传输的一种机制
- 序号(SN): 用于对字节流进行编号:
例如: 序号为 301, 表示第一个字节的编号为 301, 如果携带的数据长度为 100 字节, 则下一个报文段的编号就应该为 401- 确认号(ASN): 希望收到的下一个报文段的编号
例如: B 收到 A 发来的一个报文段序号为 501, 携带的数据长度为 200 字节, 则 B 期待下一个收到的报文编号为 701, 所以 B 发送给 A 的确认报文段中确认序号就为 701
- 4 位首部长度: 表示该 TCP 首部有多少个字节, 通常情况下是 4 个字节. 如果该选项为空, 则 TCP 首部为 20 个字节. 如果该选项不为空且为最大, 则 TCP 首部为 60 个字节 (TCP 最大首部长度就是 60 个字节)
- 6 位标志位:
- UGR: 紧急指针是否有效
- ACK : 确认号是否有效
ACK 只有两种情况: 0: 不具备应答能力; 1. 具备应答能力 - PSH: 提醒接收端应用程序立刻从 TCP 缓冲区把数据读走
- RST: 对方要求重新建立连接, 我们把携带 RST 标识的称为 复位报文段
- SYN: 请求建立连接, 我们把携带 SYN 标识的称为 同步报文段
- FIN: 通知对方, 本端要关闭了, 我们称携带 FIN 标识的为 结束报文段
- 16 位窗口大小:
- 16 位检验和: 和 UDP 的检验方法相同, 使用 CRC 检验, 但此处的检验, 不光包括 TCP 首部, 也包括 TCP 数据部分
- 16 位紧急指针: 标识哪部分数据是紧急数据
2. TCP 可靠传输
2.1 什么是可靠性
可靠性是指:
- 通过 TCP 发送的数据, 能保证对方一定收到
- TCP 只能尽全力保证数据可以正确的发送给对方, 但它并不能完全保证数据一定能发送给对方
①. 数据会尽量发送给对方, 即使发送失败了, 应用层也可以知道数据发送失败的情况
②. 尽量保证数据会按照发送方的顺序到达接收方
③. TCP 会选择合适的数据大小进行发送
④. 由于 TCP 会做重传的操作, 所以有时候会出现接收方接收到重复的数据, 但这种情况下, TCP 会进行相应的处理
2.1.1 保证可靠性方法 — 确认应答(ACK)机制
- 什么是确认应答(ACK)机制:
当发送方发送数据之后
①. 如果在超时时间(大概一个往返的时间)内, 发送方收到了接收方的应答, 就代表对方收到了数据
②. 如果在超时时间到达后, 发送方没有收到接收方的应答, 就代表对方没有收到数据 - 确认应答机制 如图所示: