tcp报文段包含头部区域和数据区域,tcp报文段的结构如下图。tcp头部分为不同的区域,如源端口号和目的端口号用于复用/解复用功能,本节重在学习序号列号区域与确认号区域。
序列号
序列号和确认号用于tcp协议的可靠性数据传输服务。tcp将数据看成无结构、有序的字节流。一个报文段的序号是该报文段数据部分首字节的字节流编号。如下图,主机A通过某个进程向主机B发送字节流。假如字节流数据包含500000字节,MSS部分是1000字节,数据流的首字节编号是0,那么tcp将会把数据流分成500个报文段。给第一个报文段分配序号0,第二个报文段分配序号1000,第三个报文段分配序号2000,以此类推。但是在实际使用中tcp会随机的选择一个初始序列号,比如上例的初始序号可能不是0而是5。
确认号
tcp协议是全双工通信,即主机A在给主机B发送数据时会收到主机B发送给主机A的数据。主机A填充进报文段的确认号是主机A期望从主机B收到的下一字节的序号。如下图,假设主机A收到里来自主机B的编号为0~535的所有字节,同时收到主机B的确认号为1,表明主机B希望收到主机A发送的序列号为1的报文段。主机A发送序号为1~100的报文段至主机B,同时发送收到主机B 0~535字节的确认号536,也表明主机A期望从主机B收到的下一字节的序号为536。