TCP 是 TCP/IP 模型中的传输层一个最核心的协议,不仅如此,在整个 4 层模型中,它都是核心的协议,要不然模型怎么会叫做 TCP/IP 模型呢。
它向下使用网络层的 IP 协议,向上为 FTP、SMTP、POP3、SSH、Telnet、HTTP 等应用层协议提供支持。其他的还有我们常用的 Redis 的 RESP 协议、MongoDB的网络协议,以及我们编程中用到的 Socket,都是 TCP 协议在背后提供支持的。
网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。
语法:即数据与控制信息的结构或格式;
语义:即需要发出何种控制信息,完成何种动作以及做出何种响应; 时序(同步):即事件实现顺序的详细说明。
TCP协议格式
TCP首部 + 用户数据被称为TCP段,其中 TCP 首部就是这里要主要研究的 TCP 协议的核心所在,用户数据部分是 TCP 段的负载。TCP 段的大小也是有限制的,最大是 1460 字节。
最终由网卡发出去的数据包叫做以太网帧,以太网帧由以太网首部和负载构成。以太网帧的负载就是一个 IP 数据报,IP数据报由IP首部和负载构成。
下图是TCP协议的示意图,如果不算「可选项」部分的话,共占用 32bit x 5 = 160bit,也就是20个字节
源端口和目标端口
源端口和目标端口分别占用 2个字节,共占用 4 字节,分别记录数据发送端的端口号和数据接收端的端口号,这两个标记和 IP 协议中记录的发送端 IP 和接收端 IP组合起来,便可确定一个唯一的 TCP 连接。
序号
由于TCP段的大小有限制,当要传输的数据量大于这个限制的时候,就要对数据进行分段,一段一段的发送,既然发送方要分段,那接收方就要对分段进行重组,才能还原回原始数据。在重组的过程中,要保证各段间的先后顺序,序号正是起到保证重组顺序的作用。
序号占用 4 字节,32 位,它的范围是 0,
2(32)。
TCP是字节流服务,会对每一个发送的字节进行编号。在建立连接的时候,系统会给定一个 ISN(初始序号),然后这个设备在当前连接中发送的第一个字节的序号就是 ISN+1,假设 ISN 初始为0,那第一个字节的序号就是 1。
举个例子:
假设ISN为0,发送端第一次发送 100 字节的数据包,那这第一个 TCP段的序号就是1,下次再发送 100字节的数据包,那这第二个 TCP段的序号就是 101。
这样一来,最大可以一直标记 2(32)
个字节,也就是 4个G的数据。当达到最大值后,又会从 0 开始标记。
序号只有在下面两种情况下才有用:
1:数据字段至少包含一个字节。
2:是一个 SYN 段,或者是 FIN 段,或者是 RST 段。