6-TCP 协议(序号和确认号)
2017-04-05 16:38
316 查看
转载请注明出处:http://blog.csdn.net/q1007729991/article/details/69261780
接下来的内容是学习后续内容的基础,必须先讲清楚。为了方便你回忆 TCP 首部,这里再次把这个图贴出来,以便对照。
图1 TCP 首部
在 APUE 基础中,我们通过 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.
初始序号是非常非常重要的概念,它告诉对端,第一个报文段是谁!而三次握手的目的,就是为了确认初始序号,这个在后面会讲。
报文段序号
如果一个 TCP 报文段的序号为 301,它携带了 100 字节的数据,就表示这 100 个字节的数据的字节序号范围是 [301, 400],该报文段携带的第一个字节序号是 301,最后一个字节序号是 400.
图2 前面实验抓取的一个数据包
在图 2 中,报文段序号是 2379453244,它携带了 6 字节的数据
注意:序号字段只有在下面两种情况的任意一种才有意义:
数据字段至少包含一个字节
这是一个 SYN 段,或者是 FIN 段,或者是 RST 段。
对方通过回复一个确认号,来表示确认已经接收到了哪个 TCP 段。比如发送方发送了一个报文段序号为 301 的 TCP 段,这个段携带了 100 字节数据,则接收方应当回复的确认号是 401,它表示接收方已经收到了字节序号为 [0, 400] 的数据,现在期望你发送字节序号为 401 以及以后的数据。
只有当 ACK 标志位被置位的时候,确认号这个字段才有效。
图3 这个数据包还是前面实验中抓取的
为了能够清晰的看到客户端与服务器的交互过程,这里将它画成了下面的时序图。
图4 客户端与服务器的交互
现在,我们只需要观察每一次发送 TCP 段后,对方是如何应答的。为了方便观察序号和确认号,我只保留了后三位。
初始序列号
确认号
接下来的内容是学习后续内容的基础,必须先讲清楚。为了方便你回忆 TCP 首部,这里再次把这个图贴出来,以便对照。
图1 TCP 首部
1. 序号
1.1 序号存在的意义
首先得弄清楚为什么要有序号。在 APUE 基础中,我们通过 TCP 协议将数据发送给对方,就比如
helloworld,这一串字节流,假设被拆分成了三个 TCP 报文段,第一个报文段携带了
hel,第二个报文段携带了
lowo,第三个报文段携带了
rld,这三个报文段不一定是按照顺序送到对端的,那么对端收到这三个段是如何确定他们的顺序的呢?此时序号的意义就体现在这里。
1.2 序号
序号占用 4 字节,即 32 位。它的范围是 [0,232−1],也就是说一共有 4 294 967 296 个序号。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.
初始序号是非常非常重要的概念,它告诉对端,第一个报文段是谁!而三次握手的目的,就是为了确认初始序号,这个在后面会讲。
报文段序号
如果一个 TCP 报文段的序号为 301,它携带了 100 字节的数据,就表示这 100 个字节的数据的字节序号范围是 [301, 400],该报文段携带的第一个字节序号是 301,最后一个字节序号是 400.
图2 前面实验抓取的一个数据包
在图 2 中,报文段序号是 2379453244,它携带了 6 字节的数据
hello\0,这 6 字节的数据字节序号就是从
h->2379453244,
e->2379453245一直到最后一个空字符
\0->2379453249.
注意:序号字段只有在下面两种情况的任意一种才有意义:
数据字段至少包含一个字节
这是一个 SYN 段,或者是 FIN 段,或者是 RST 段。
2. 确认号
如果你还记得前面你和你对象发短信的例子的话,这里就不难了。每传送一个 TCP 段,都要等待对方回复一个确认。不过这种方式效率太低,在 TCP 协议中,一般采用累积确认的方式,即每传送多个连续 TCP 段,可以只对最后一个 TCP 段进行确认。对方通过回复一个确认号,来表示确认已经接收到了哪个 TCP 段。比如发送方发送了一个报文段序号为 301 的 TCP 段,这个段携带了 100 字节数据,则接收方应当回复的确认号是 401,它表示接收方已经收到了字节序号为 [0, 400] 的数据,现在期望你发送字节序号为 401 以及以后的数据。
只有当 ACK 标志位被置位的时候,确认号这个字段才有效。
3. 一次完整的 TCP 连接到释放的过程
图3 这个数据包还是前面实验中抓取的
为了能够清晰的看到客户端与服务器的交互过程,这里将它画成了下面的时序图。
图4 客户端与服务器的交互
现在,我们只需要观察每一次发送 TCP 段后,对方是如何应答的。为了方便观察序号和确认号,我只保留了后三位。
4. 总结
字节序号与报文段序号初始序列号
确认号
相关文章推荐
- TCP传输中序号与确认序号的交互
- TCP 滑动窗口(已经发出等待对方确认的队列)协议
- TCP协议的作用?三次握手是通过什么方法来保证通信双方确认的正确?
- TCP传输中序号与确认序号的交互
- TCP 滑动窗口(已经发出等待对方确认的队列)协议
- 转 TCP中的序号和确认号
- TCP协议三次握手过程分析
- OSI七层协议和TCP/IP四层协议对比
- 《TCP/IP详解 卷1:协议》 读书笔记 第十九章 TCP的交互数据流
- TCP协议的原理分析与示例
- 【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)
- TCP/IP 协议
- TCP/IP 协议簇下的各报文结构总结
- HTTP/TCP/SOCKET连接协议和原理
- 网络协议-TCP和UDP最完整的区别介绍
- 协议森林11 涅槃 (TCP重新发送)
- 从TCP协议的原理来谈谈RST复位攻击
- 互联网协议,osi七层,tcp ip五层和四层
- TCP协议中FLAG的含义(三次握手,四次挥手)
- UDP和TCP协议包大小的计算