转载请注明出处:http://blog.csdn.net/q1007729991/article/details/69261780

接下来的内容是学习后续内容的基础,必须先讲清楚。为了方便你回忆 TCP 首部,这里再次把这个图贴出来,以便对照。


图1 TCP 首部

1. 序号

1.1 序号存在的意义

首先得弄清楚为什么要有序号。

在 APUE 基础中,我们通过 TCP 协议将数据发送给对方,就比如 helloworld,这一串字节流,假设被拆分成了三个 TCP 报文段,第一个报文段携带了 hel,第二个报文段携带了 lowo,第三个报文段携带了 rld,这三个报文段不一定是按照顺序送到对端的,那么对端收到这三个段是如何确定他们的顺序的呢?此时序号的意义就体现在这里。

1.2 序号

序号占用 4 字节,即 32 位。它的范围是 [0,232−1][0, 2^{32}-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->2379453244e->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. 总结

  • 字节序号与报文段序号
  • 初始序列号
  • 确认号

6-TCP 协议(序号和确认号)相关推荐

  1. TCP 协议(序号和确认号)

    接下来的内容是学习后续内容的基础,必须先讲清楚.为了方便你回忆 TCP 首部,这里再次把这个图贴出来,以便对照. 图1 TCP 首部 1. 序号 序号占用 4 字节,即 32 位.它的范围是 [0,2 ...

  2. TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体,

    TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体, 一.TCPsocket 1.TCP是面向连接的 ...

  3. tcp报文段的结构之序号和确认号 (计算机网络—自顶向下)

    发现看书还是要做点笔记才行,看了就忘,没有多大的效率- 自顶向下这本书,说的不会很晦涩(虽然没看过别的),很多方面可以理解,但是涉及到一些算法原理的时候就有点头疼了,自己底子太差了- 这次看到了 第三 ...

  4. TCP头部分析与确认号的理解

    TCP头部分析与确认号的理解 https://www.cnblogs.com/xcywt/p/8075623.html TCP协议(1)--TCP首部 https://blog.csdn.net/la ...

  5. 网络原理 --- 传输层Ⅱ TCP协议中的确认应答,超时重传和连接管理

    文章目录 网络原理 传输层 TCP 协议 TCP的基本特性 1.确认应答 2.超时重传 3.连接管理 ❗❗①建立连接(三次握手) ②断开连接(四次挥手) 总结 网络原理 介绍TCP/IP协议中每一层里 ...

  6. 【TCP 协议2】确认应答、超时重传机制

    文章目录 前言 一.确认应答 1, 什么是确认应答 2, 序列号和确认应答号 二.超时重传 1, 什么是超时重传 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:

  7. TCP 序列号和确认号是如何变化的?

    大家好,我是小林. 在网站上回答了很多人的问题,我发现很多人对 TCP 序列号和确认号的变化都是懵懵懂懂的,只知道三次握手和四次挥手过程中,ACK 报文中确认号要 +1,然后数据传输中 TCP 序列号 ...

  8. TCP协议的特点和TCP报文段格式

    参考:https://www.bilibili.com/video/BV19E411D78Q?p=62 传送数据之前必须建立连接,数据传送结束后要释放连接.不提供广播或多播服务.由于TCP要提 供可靠 ...

  9. TCP协议详解----Linux学习笔记

    传输层概述 传输层协议主要有两个:TCP协议和UDP协议 TCP服务特点: TCP协议的特点是:面向连接.字节流和可靠传输.(相对UDP协议而言的) 面向连接: 1.使用TCP协议的双方必须先建立连接 ...

最新文章

  1. 表格行与列边框样式处理的原理分析及实战应用
  2. 《Python核心编程》第二版第八章练习题答案 第二部分
  3. 就业局培训计算机心得,人社局计算机培训心得体会.doc
  4. .NET Core中的验证组件FluentValidation的实战分享
  5. 【C++深度剖析教程10】C++中的字符串类
  6. Python学习笔记之列表(三)
  7. eclipse 安装egit插件
  8. MyBatis--动态插入多条数据
  9. CGI,FASTCGI,PHP-CGI,PHP-FPM 概念
  10. JCR分区与中科院分区详解-中科院基础版和升级版详解
  11. 安装Kubuntu至U盘
  12. 【通过STLINK Utility下载程序和加解密方法】
  13. OpenVINO系列19_face_detection检测人脸并做标记
  14. 367. 有效的完全平方数【我亦无他唯手熟尔】
  15. 你是万能的数据分析师?干什么呢?
  16. 微软认证一览表(附图)
  17. 基于树莓派4B搭建64位树莓派系统
  18. Windows 安装与配置IIS
  19. Spring框架——加载属性(properties)文件
  20. AXURE RP9——SVG图片的操作设置

热门文章

  1. 【LAS 】 SRS 开启ATC功能 时间戳测试
  2. 河海大学软件工程学硕考研复试经验贴
  3. 【转帖】中国芯暗流涌动,龙芯/飞腾都在走什么样的路
  4. 双目立体匹配步骤详解
  5. 关于ArcGIS中选择属性值为空的语句
  6. [转]Unix下针对邮件,搜索,网络硬盘等海量存储的分布式文件系统项目(关于GFS、MogileFS分布式文件系统邮件列表)
  7. Boundary Sensitive Network (BSN) 源码运行
  8. 什么是项目成本估算?项目成本的估算方法有哪些?
  9. 【分布式】聊一聊分布式事务
  10. php rot13解密,用PHP实现ROT13