TCP (Transmission Control Protocol)传输控制协议(重点)
一、特点:
- 有连接
- 面向流
- 可靠性:
- 数据保证正确 —— 校验和
- 作为一个发送方,希望知道接受方是否收到数据 —— 确认应答(SN/ASN/ACK)
- 保证接收方的数据是按序收到的 —— TCP 利用 SN 在接收方做排序
- 接收方可以去重数据 —— SN
二、TCP 协议段格式
1、32 位序号(Sequence Number/SN)与 32 位确认序号(Acknowledge Sequence Number/ASN):通过序号和确认序号实现明确收到的是哪句话
SN 的三个作用:标号便于应答;在接收方排序;(去重)去除接收到的重复报文。
- 发送的每个数据都带着 SN
- 如果数据中的 ACK 被置为 1,表示该 TCP 包有确认含义(发送数据和确认含义共用的)
- ASN 可以计算出收到哪些数据
2、4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60
3、六位标志位:
- URG: 紧急指针是否有效
- ACK: 确认号是否有效
- PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
- RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
- SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
- FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
URG: Urgent 紧急 + 配合 16位 紧急指针(偏移量),为 1 则优先查看紧急指针所在的内容。
16位紧急指针: 标识哪部分数据是紧急数据。
PSH :建议别缓冲这份数据
三、确认应答机制(ACK 机制 以及 SN 和 ASN)
前置知识:数据在网络上的传输过程中不一定走的是同一条路。即到达顺序可能和发送顺序不同。所以是需要通过 SN 进行排序的。
TCP将每个字节的数据都进行了编号, 即为序列号。每一个ACK都带有对应的确认序列号,意思是告诉发送者, 我已经收到了哪些数据,下一次你从哪里开始发。
实际上来说,一个 TCP 的通信过程中,只有第一个 Segment 的 ACK 没有置为 1,其他全部含有 ACK 含义。
ASN 的细节含义:希望发送端发送的下一个字节的序号。如 SN 为1003,数据长度为 20 ,则接收方回复以 1023 开头的其他数据。
四、超时重传机制:
1、基于确认应答。超时:超过预计时间。重传:把没有收到应答的数据重新发送一次。
TCP 的发送方发送数据给接收方之后,在一段时间内没有收到 接收方 发来的确认应答。那么在次数限制内会进行重发,直至收到应答。对于 TCP 连接中任何 Segment 都需要应答,除了 ACK 本身(应答(无数据)本身不需要应答)
2、那么, 如果超时的时间如何确定?
最理想的情况下, 找到一个最小的时间, 保证 "确认应答一定能在这个时间内返回".但是这个时间的长短, 随着网络环境的不同, 是有差异的.如果超时时间设的太长, 会影响整体的重传效率;如果超时时间设的太短, 有可能会频繁发送重复的包;
3、TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间。根据网络情况跳转,一般实现是:遇到丢包,超时时间翻倍。
4、TCP 有发送缓冲区 和 接收缓冲区
原因:发送的数据有可能需要重传,所以 TCP 需要暂时保存这些数据。接收:数据可能是无序到达的,或者可能数据到达后应用层不是马上取走。
对于 TCP 来说,发送成功:如os.write();成功,代表只是数据被写入到 TCP 协议栈的发送缓冲区,不代表数据发生到网络上了,更不代表对方已经收到了。
接收方:如is.read();如果接收缓冲区中有准备好(有序)的数据,直接返回。如果没有数据,则会一直堵塞,直到数据准备好。