【网络原理】TCP/IP 协议—— 传输层(二)TCP协议

TCP (Transmission Control Protocol)传输控制协议(重点)

一、特点:

  • 有连接
  • 面向流
  • 可靠性:
  1. 数据保证正确 —— 校验和
  2. 作为一个发送方,希望知道接受方是否收到数据 —— 确认应答(SN/ASN/ACK)
  3. 保证接收方的数据是按序收到的 —— TCP 利用 SN 在接收方做排序
  4. 接收方可以去重数据 —— SN

二、TCP 协议段格式

【网络原理】TCP/IP 协议—— 传输层(二)TCP协议

 

1、32 位序号(Sequence Number/SN)与 32 位确认序号(Acknowledge Sequence Number/ASN):通过序号和确认序号实现明确收到的是哪句话

SN 的三个作用:标号便于应答;在接收方排序;(去重)去除接收到的重复报文。

  1. 发送的每个数据都带着 SN
  2. 如果数据中的 ACK 被置为 1,表示该 TCP 包有确认含义(发送数据和确认含义共用的)
  3. ASN 可以计算出收到哪些数据

2、4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60

3、六位标志位:

  1. URG: 紧急指针是否有效
  2. ACK: 确认号是否有效
  3. PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
  4. RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
  5. SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
  6. FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

URG: Urgent 紧急 + 配合 16位 紧急指针(偏移量),为 1 则优先查看紧急指针所在的内容。

16位紧急指针: 标识哪部分数据是紧急数据。

PSH :建议别缓冲这份数据

三、确认应答机制(ACK 机制 以及 SN 和 ASN)

前置知识:数据在网络上的传输过程中不一定走的是同一条路。即到达顺序可能和发送顺序不同。所以是需要通过 SN 进行排序的。

【网络原理】TCP/IP 协议—— 传输层(二)TCP协议

TCP将每个字节的数据都进行了编号, 即为***。每一个ACK都带有对应的确认***,意思是告诉发送者, 我已经收到了哪些数据,下一次你从哪里开始发。

实际上来说,一个 TCP 的通信过程中,只有第一个 Segment 的 ACK 没有置为 1,其他全部含有 ACK 含义。

ASN 的细节含义:希望发送端发送的下一个字节的序号。如 SN 为1003,数据长度为 20 ,则接收方回复以 1023 开头的其他数据。

四、超时重传机制:

1、基于确认应答。超时:超过预计时间。重传:把没有收到应答的数据重新发送一次。

TCP 的发送方发送数据给接收方之后,在一段时间内没有收到 接收方 发来的确认应答。那么在次数限制内会进行重发,直至收到应答。对于 TCP 连接中任何 Segment 都需要应答,除了 ACK 本身(应答(无数据)本身不需要应答)

【网络原理】TCP/IP 协议—— 传输层(二)TCP协议

2、那么, 如果超时的时间如何确定?

最理想的情况下, 找到一个最小的时间, 保证 "确认应答一定能在这个时间内返回".但是这个时间的长短, 随着网络环境的不同, 是有差异的.如果超时时间设的太长, 会影响整体的重传效率;如果超时时间设的太短, 有可能会频繁发送重复的包;

3、TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间。根据网络情况跳转,一般实现是:遇到丢包,超时时间翻倍。

4、TCP 有发送缓冲区 和 接收缓冲区

原因:发送的数据有可能需要重传,所以 TCP 需要暂时保存这些数据。接收:数据可能是无序到达的,或者可能数据到达后应用层不是马上取走。

对于 TCP 来说,发送成功:如os.write();成功,代表只是数据被写入到 TCP 协议栈的发送缓冲区,不代表数据发生到网络上了,更不代表对方已经收到了。

接收方:如is.read();如果接收缓冲区中有准备好(有序)的数据,直接返回。如果没有数据,则会一直堵塞,直到数据准备好。