学习呦
14 10月 2025 6 min read

TCP

Written by 米豆

TCP

概念

传输控制协议(Transmission Control Protocol),简称: TCP。看名字是一个协议,所以在IP层至上,应用层之下(这里指ISO的七层或者TCP/IP网络协议栈)

可靠的传输协议,传输的数据会按照顺序发送给接收方,且发错的数据会重新传送

TCP层(仅针对TCP协议就先叫这个名字)

介于应用层和IP层(网络层)之间

  • 发送数据时

    从上层应用层开始,由用户数据和Appl首部组成,交给传输层(TCP层)
    TCP层组装自己的TCP首部,之后再次向下传输给网络层(IP层)现在称之为分段(Segament)
    IP层再次组装,形成IP报文,再给链路层形成以太网帧就可以发送给目标了

  • 数据接受时

    是上面发送过程的反向,反过来就可以

传输层怎么封装的

Segament结构

TCP头部 + 数据

TCP首部结构

20字节长度(不包含Options部分),其中包含5个部分(每一个部分是4字节),每一个部分的组成都不相同,但大小范围都在4字节(16位)- 8字节(32位)

tcp header

  • 源端口、目的端口

    因为TCP段解析完成后,应用层的数据就直接给应用层了,所以也是对应的本机的进程(进程通过端口号来区分)

  • TCP序列号SEQ(Sequence Number)

    序列号决定了TCP报文的顺序,具体点就是发送第一个TCP报文到最后一个TCP报文的序号,有了序号可以去重TCP报文、丢失的包可以重发、可以给应用层一个顺序正确的流(stream)

  • TCP确认号ACK(Acknowledgment Number)

    确认号记录下一个TCP报文的序号,32位,8字节,且要求ACK位设置为1

  • 头部长度字段(头部偏移)

    记录TCP数据位置到TCP报文起始位置的相对距离,也就是TCP头部的长度

  • 保留字段

    必须置为0,待以后使用

  • 控制位

    • CWR、ECE:

      拥塞窗口缩减,保留位第一位,配合ECE实现拥塞通知。当发送方收到一个TCP包的ECE设置为1,代表发送方要调整拥塞窗口,调整后会使用CWR = 1,通知接收方收到了拥塞通知并调整了拥塞窗口

    • URG:

      设置为1,表面该TCP报文为需要紧急处理的,要尽快传送。需要配置Urgent Pointer紧急指针

    • ACK:

      和上面的确认号配合,设置为1,表面确认号有效(开启确认号)

    • PSH:

      要求发送方尽快发送给接收方,接收方尽快接收。发送方发送到缓冲区,接收方接收到缓冲区

    • RST:

      置为1表示强制断开当前连接,之后重新建立新的连接

    • SYN:

      为1时,表示发起了一个连接请求,要建立一个新连接了

    • FIN:

      终止字段,发送端的全部数据都发送完成了,就置为1

  • 窗口大小

    接收方可用缓冲区大小,用来调整接收的数据的大小,能做TCP的流量控制

  • 校验和字段

    伪首部、首部、数据的完整性校验

  • 紧急指针

    要和上面的标志位URG对应,表示紧急数据末尾的偏移位置。为什么是末尾,因为按照旧标准(紧急指针是指紧急数据后的下一个位置)且方便处理边界情况,直接确定紧急数据的位置,不用解析后面的数据

  • 可选项

    用于拓展TCP功能

TCP数据大小

这里得要由MTU(最大传输单元)决定,MTU最大传输单元为数据链路层最大负载(payload),以太网帧的数据部分 (802.3标准定义)
最大传输数据字节 = 1500字节(MTU规定的)- TCP Header(20字节) - IP位(20字节)= 1460字节
不足MTU最小64字节,要补位,超了1500字节,要分片

TCP连接的建立、后续数据传输、断开连接

三次握手

过程

  1. 客户端向服务器端发送一个SYN包,请求一个主动打开。该包携带客户端为这个连接请求而设定的随机数A(这个随机数随机生成,seq=A)作为消息序列号

  2. 服务器端收到一个合法的SYN包后,把该包放入SYN队列中;回送一个SYN/ACK包。ACK的确认码应为seq=A+1,SYN/ACK包本身携带一个随机产生的序号B。

  3. 客户端收到SYN/ACK包后,发送一个ACK包,该包的序号被设定为A+1,而ACK的确认码则为seq=B+1。当服务器端收到这个ACK包的时候,客户端和服务端都准备好后续的发送数据了

Connection_TCP

数据传输

传输双方都已经是Establish状态。在第三次握手后,准确点在发送方收到了服务端的ACK后就可以立刻发送数据,且有可能在第三次发送握手包的时候就携带数据

过程

  1. 发送端发送数据包,seq=1200的一个100字节Byte大小的包
  2. 接收端收到后发送ACK=1301的包(接收端要发送ACK号的计算公式:ACK = seq + 发送方数据部长度 + 1)
  3. 发送方收到ACK=1301,下一个发送方发的包SEQ=1301,且有100字节大小的包
  4. 接收方发送ACK=1402,后面以此类推

数据传输并非理想化,实际情况复杂

四次挥手

过程

  1. 客户端发送一个FIN包,主动发起终止连接包,确认号seq=A

  2. 服务端收到包,发起一个ACK=A+1的包,告诉客户端我这边收到了,这时对于客户端往服务器这个方向的连接就终止了

  3. 服务器发送一个FIN包,确认号seq=B

  4. 客户端收到包,发送一个ACK=B+1的包,也是告诉服务器包收到了,服务器相对于客户端方向的连接就终止了,至此,TCP的连接才算是中断

Deconnection_TCP

TCP特性

  • 可靠传输
  • 拥塞控制
  • 流量控制
↑