SEQ序号于ACK序号理解总结(一)

Seq:就是我们常说的序号。对于要发送的数据的第一个序号而言这个序号是通过一个算法计算得到一个初始序号(ISN)加1。至于ISN怎么计算而来这里不讨论。这里我们以wireshark序号为准。假设某时序号为1000,简单的理解就是发送方告诉接收端“我发送的数据是从第1000开始的”。

ACK序号:就是我们常说的确认序号。确认序号是上一次已经成功接收到数据字节序号加1。还可以理解为接收端告诉发送端下一次想接收开始序号。假设某时确认序号为1000,简单的理解就是接收方告诉发送方“我已经收到第999序号了,我下一次想接收的数据是从1000开始的”。

首先注意一下3点:

1,  当发送syn标记时将消耗一个序号;

2,  发送fin标记时将消耗一个序号;

3,  数据是每个字节一个序号;

以上知识可以在《tcp/ip详解-卷1》第172页找到。我们根据具体报文来理解这两个概念。Seq序号以下直接简称seq,ack序号以下直接简称ack。

1,  最简单的三次握手

2,  最简单完整数据报文

3,  上面一大堆比较啰嗦。这里只给出这些阶段状态,本文不讨论。

1:syn_send;

2:syn_rcvd;

3:established;

4:established;

5:发送get请求;

6:回复get请求;

7:fin_wait1;

8:close_wait;

9:fin_wait2;

10:last_ack;

11:time_wait;

12:closed。

4,  以上统统总结,就是两句话:

  1. Seq:就是告诉接收方:我发送的数据是从seq开始的。
  2. Ack:就是告诉接收方:我希望下次收到对端发过来的seq序号。
  3. 二、现在举例通过seq与ack来分析报文。

1,先看一个最简单的异常报文。注意这里说的异常报文不一定是错误报文。

分析:从seq与ack的序号角度来理解,一点问题都没有,服务器端s成功地接收了发过来的数据。但你可能会疑问:“不是会话建立需要三次握手么?这里没看到三次握手完怎么就发数据了呢”。这里需要理解一点是tcp中ack是一个标记位,与ack序号是两个概念。只有当ack标记位置位时ack序号才有效。看第三个报文,它的ack置位,对服务器来说收到这个报文表示是确认报文,并且确认序号正好是之前发送的seq序号加1。服务器认可这个确认报文,也就接受了发过来数据。

这里还用到一个原则:数据带ack。就是发送数据的同时对上次收到的报文进行确认。这样做是为了减少网络中过多的ack报文,因为ack只是个标记确认用的,单独发送一个确认报文浪费了资源。那你肯定会想“如果没有数据要发送了,那确认报文怎么发送,不发了?”。当然不是这样的,数据带ack只是发送确认报文原则之一。其他发送碰到再讲,这里就不讲了。

2,再来看最常见的一个异常报文——重复确认报文(tcp dup ack)

分析:有重复报文,一般是是丢包或延迟引起的,从这个报文看应该是丢包了。因为接收到告诉发送端想收到的报文序号,发送端立马重传了这个报文。对于wireshark来说,之前收到了ack为9224的报文(17号),现在又收到ack为9224的报文(19号),故wireshark标记为tcp dup ack报文。

3,既然有重复确认,那有没有重复发送的数据呢?答案是当然有。但是不叫重复发送数据,而称为重传报文(tcp Retransmission)

分析:对于wireshark来说收到两次seq为40206的数据报文,就认为这是一个重传的报文。为什么会有重传报文呢?1,丢包;2,延迟。从这个报文上一个报文ack为40206,说明接收端告诉发送端要发送的seq为40206。然后发送了一个seq为40206的报文,然后等待接收端回确认,但等了很久(200ms)还没有收到确认报文,发送端就认为这个包丢包了(注意:只是从发送端的角度来说认为这个包丢包了,到底是丢包还是延迟,不必关心)。这就超时重传的原则。

4,  网络总是存在延迟的,而且可能走不同的路由导致报文产生乱序,这就是乱序报文(out –of- order)。报文乱序wireshark还有一个解析:tcp提前片段(tcp Previous segment no captured)。

分析:对于wireshark来说是根据收到seq去判断是否乱序。乱序一般是因为报文在传输的过程中产生的,但实际上wireshark标记out-of-order只是对于wireshark角度去分析的。实际上这个报文可能是重传报文,需根据实际情况分析。

时间: 2024-08-26 02:28:48

SEQ序号于ACK序号理解总结(一)的相关文章

SEQ序号与ACK序号理解总结(一)

Seq:就是我们常说的序号.对于要发送的数据的第一个序号而言这个序号是通过一个算法计算得到一个初始序号(ISN)加1.至于ISN怎么计算而来这里不讨论.这里我们以wireshark序号为准.假设某时序号为1000,简单的理解就是发送方告诉接收端"我发送的数据是从第1000开始的". ACK序号:就是我们常说的确认序号.确认序号是上一次已经成功接收到数据字节序号加1.还可以理解为接收端告诉发送端下一次想接收开始序号.假设某时确认序号为1000,简单的理解就是接收方告诉发送方"我

TCP传输中序号与确认序号的交互

本实验通过SSH远程登录服务器,然后使用Wireshark抓包分析.开头的三次握手已经省略.关于序号的交互过程,需要记住一点:TCP首部中的确认序号表示已成功收到字节,但还不包含确认序号所指的字节,希望下一次能收到确认序号所指的字节. 当在远程登录软件上键入命令时,客户端便开始了数据的发送,TCP头如下: 初始化序列号ISN = 1,这个序列号是客户端对发送数据的一个标记,以1作为起始值.根据SSH包长度计算下一次将会发送的起始序号为65.确认序号为1表示我希望下次收到起始序号为1的TCP包.

理解TCP/IP三次握手与四次挥手的正确姿势

背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声音,过一会儿之后才会恢复. 中间双方可能就要不断的确认网络是否恢复,但是有时候会: 她:"你可以听到了吗?" 我:"可以了,你呢?". 她:"喂喂,你可以听到了吗?" 我:"可以了,我可以听到了,你呢?" 她:"你可以听

对TCP协议握手的理解(转)

目录: 31.Tcp握手的一些问题? 21.Tcp三次握手及SYN攻击: 四次握手? 为什么建立连接是三次握手,而关闭连接却是四次挥手? 13.TCP释放连接四次握手 12.TCP建立连接三次握手 11.TCP报文段首部格式? ----------------  31.连接建立,为什么要进行三次握手呢(两次确认)? 为什么要采用三次握手,两次不行吗? Tcp4次释放连接的过程? 四次挥手图示: 当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为

C++基本知识点总结(网摘)

原文出处:[Fei Guo] 1. 结构体和共同体的区别. 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型. 共同体union:使几个不同类型的变量共同占用一段内存. 地址: struct和union都有内存对齐,结构体的内存布局依赖于CPU.操作系统.编译器及编译时的对齐选项. 关于内存对齐,先让我们看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,

转载c++面试题

转载地点:http://www.cnblogs.com/LUO77/p/5771237.html  1. 结构体和共同体的区别. 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型. 共同体union:使几个不同类型的变量共同占用一段内存. 地址: struct和union都有内存对齐,结构体的内存布局依赖于CPU.操作系统.编译器及编译时的对齐选项. 关于内存对齐,先让我们看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于shor

常见C++面试题及基本知识点总结

1. 结构体和共同体的区别. 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型. 共同体union:使几个不同类型的变量共同占用一段内存. 地址: struct和union都有内存对齐,结构体的内存布局依赖于CPU.操作系统.编译器及编译时的对齐选项. 关于内存对齐,先让我们看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节. 2.结构体或者类的

TCP 的三次握手 与 四次挥手详解(转载)

建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了. 那如何断开连接呢?简单的过程如下: [注意]中断连接端可以是Client端,也可以是Server端. 假设Client端发起中断连接请求,也就是发送FIN报文.Server端接到FIN报文后,

理论经典:TCP协议的3次握手与4次挥手过程详解

1.前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接.这一过程与打电话很相似,先拨号振铃,等待对方摘机说"喂",然后才说明是谁. 本文将分别讲解经典的TCP协议建立连接(所谓的"3次握手")和断开连接(所谓的"4次挥手")的过程.有关TCP协议的权威