序列号
为什么要有序列号
在APUE基础中,我们通过TCP协议将数据发送给对方,就比如 helloworld,这一串字节流;
假设被拆分成了三个TCP报文段,第一个报文段携带了 hel,第二个报文段携带了 lowo,第三个报文段携带了 rld;
这三个报文段不一定是按照顺序送到目的地的,那么目的地收到这三个段是如何确定他们的顺序的呢?
此时序号的意义就体现在这里;
序列号
序号占用4字节,即32位。它的范围是 [0,2^32−1],也就是说一共有42 9496 7296个序号;
TCP协议中的序号,指的是报文段序号;
字节序号
TCP连接中,传送的字节流(数据)中的每一个字节都是按顺序编号;也就是说,在一次TCP连接建立的开始,到TCP连接的断开,你要传输的所有数据的每一个字节都会被编号;
这个序号称为字节序号;
初始序号ISN
当新连接建立的时候,第一个字节数据的序号称为ISN(Initial Sequence Number),即初始序号;
ISN并不一定就是1;在 RFC (规定网络协议的文档)中规定,ISN 的分配是根据时间来的;
当操作系统初始化的时候,有一个全局变量假设为 g_number 被初始化为 1(或 0),然后每隔 4us 加 1;当 g_number 达到最大值的时候又绕回到 0;当新连接建立时,就把 g_number 的值赋值给 ISN;
在BSD系统中,这段代码实现时并未遵守协议,它将g_number 初始化为 1,每 8us 加 1,也就是说,每隔 1 秒增加 125000,约 9.5 小时后 g_number 又绕回到了 0;
初始序号是非常非常重要的概念,它告