精华内容
下载资源
问答
  • TCP序列号
    2021-02-03 10:36:03

    网上的标题是这样滴,我这里姑且也这么写吧,标题一样,内容有别。
    原文章侧重介绍回绕的判断算法,我这里介绍的是回绕的解决方法。大家如果有意见可以提一下。

    回绕背景介绍

    一个tcp流的初始序列号(ISN)并不是从0开始的,而是采用一定的随机算法产生的,因此ISN可能很大(比如(2^32-10)),因此同一个tcp流的seq号可能会回绕到0。而我们tcp对于丢包和乱序等问题的判断都是依赖于序列号大小比较的。此时就出现了所谓的tcp序列号回绕(sequence wraparound)问题。

    回绕问题解决

    回绕问题的解决很简单,只需要将序列号设置成无符号类型即可
    跟回绕判断算法没有毛线关系,为什么要去判断回绕呢,对于tcp seq场景来说,前后值求差不就OK了嘛!
    为什么这么说呢?举以无符号单字节为例:
    seq1=255(FFH),seq2=5(5H),从seq1到seq2,此时序列号发生了回绕现象。
    那么seq2-seq1=? 答案为6。
    因为无符号嘛,从255跳到0后,溢出位超出8位,然后被扔掉了不是吗?
    所以说,回绕现象并不影响TCP乱序的算法,取后续报文的seq与握手报文seq的差值,永远都是正值,且不会有错,除非存在以下情况:

    • seq本身异常,
      如此一来,报文长度也会变得异常了。
    • 报文长度本身超过了无符号最大值
      4字节时容纳数目为2^31-1,一般情况下也碰不到这样的报文吧。

    附录I 回绕判断逻辑算法介绍

    内核中给出的序列号(解决序列号回绕问题)判断解决方案十分简洁:

    /*
    * The next routines deal with comparing 32 bit unsigned ints
    * and worry about wraparound (automatic with unsigned arithmetic).
    */
    static inline int before(__u32 seq1, __u32 seq2)
    {
    return (__s32)(seq1-seq2) < 0;
    }
    #define after(seq2, seq1) before(seq1, seq2)
    
    更多相关内容
  • TCP序列号攻击的原理及预防方法,对于TCP序列攻击有一定的参考价值
  • tcp 序列号

    千次阅读 2018-03-05 22:51:56
    为了方便你回忆 TCP 首部,这里再次把这个图贴出来,以便对照。 图1 TCP 首部 1. 序号1.1 序号存在的意义首先得弄清楚为什么要有序号。在 APUE 基础中,我们通过 TCP 协议将数据发送给对方,就比如 hel...

    转载请注明出处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,2321]

    ,也就是说一共有 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. 总结

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



    另外一篇:

    理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)


    展开全文
  • TCP序列号回绕问题

    千次阅读 2021-10-04 13:29:56
    我求求你们能别抄来抄去的吗?每次搜个问题全是重复的博客! 参考: ... 简介 这篇笔记记录了TCP如何处理序列号回绕问题。 措施 主要有两种措施用于解决序列号回绕问题: 限制TCP窗口大小 时间戳机制

    我求求你们能别抄来抄去的吗?每次搜个问题全是重复的博客!

    参考:

    • http://m.blog.chinaunix.net/uid-24683784-id-5746959.html
    • https://docs.microsoft.com/en-us/troubleshoot/windows-server/networking/description-tcp-features

    简介

    这篇笔记记录了TCP如何处理序列号回绕问题。

    措施

    主要有两种措施用于解决序列号回绕问题:

    • 限制TCP窗口大小
    • 时间戳机制

    限制TCP窗口大小

    处理回绕问题的关键在于,在回绕发生时,如何判断两个序列号的先后关系

    在内核中,判断先后关系的代码如下:(代码在Linux源码的include/net/tcp.h)

       266 /*
       267  * The next routines deal with comparing 32 bit unsigned ints
       268  * and worry about wraparound (automatic with unsigned arithmetic).
       269  */
       270 
       271 static inline bool before(__u32 seq1, __u32 seq2)
       272 {
       273         return (__s32)(seq1-seq2) < 0;
       274 }
       275 #define after(seq2, seq1)   before(seq1, seq2)
    

    可以看到,内核中判断两个序列号的先后关系实现得非常简单,相减然后强转成有符号32位整数,然后判断是否小于0即可。

    通过一个例子来看这个方法的正确性,TCP序列号是一个32位无符号整数,范围是[0, 4294967295],现在假设要比较两个序列号:

    • seq1 = 4294967295
    • seq2 = 4294967296,超过了可表示的范围,回绕为0

    调用before(seq1, seq2)时,seq1-seq2的结果是4294967295,然后强制转换成有符号整数,4294967295 转换成了-1,小于0,于是函数输出seq1在seq2前面,这和真实情况一致。

    不过这种比较是有条件的,例如,仍然取:

    • seq1 = 4294967295
    • seq2 = 4294967296 + 4294967294,超过了可表示的范围,回绕为4294967294

    这次before(seq1,seq2)返回的结果就与事实不符了。

    上面的算法能使用的前提是:回绕的范围不能太大。

    准确地说,回绕的范围不能超过2**31,或者说,回绕之后的值,一定要小于2**31

    那这个前提在TCP里面能满足吗?

    可以!TCP窗口的最大值是1GB = 2**30 B < 2**31 B 所以使用上面的算法在实际情况中能够解决TCP的回绕问题,正确地区分出哪个序列号在前,哪个在后。

    时间戳机制

    理论上来说,上面的算法可以区分两个序列号,但是实际上可能出现这样的情况:

    • 客户端发送了一个包A给服务器,序列号范围在[seq1, seq2]之间

    • 由于网络原因,这个包A过了很久都没有到达服务器

    • 服务器流量很大,序列号回绕了一次,序列号范围又回到了[seq1, seq2]

    • 包A历经千辛万苦终于到达服务器

    • 问题来了:这个包A是当前的有效包?还是回绕之前的包?

    这个问题可以使用时间戳来解决,通过判断报文段的时间戳,可以判断报文段是否是过时的。

    展开全文
  • 最近在做一个关于TCP的实验,需要了解TCP的seq和ack的发送机制,看了很多文章之后,再结合着实际的测试,归纳出了seq和ack的计算方法 这里不得不说一句,关于怎么计算seq和ack网上的教程和文章实在是太少了,一搜TCP...

    前言

    最近在做一个关于TCP的实验,需要了解TCP的seq和ack的发送机制,看了很多文章之后,再结合着实际的测试,归纳出了seq和ack的计算方法
    这里不得不说一句,关于怎么计算seq和ack网上的教程和文章实在是太少了,一搜TCP,出来的就是三次握手和四次挥手,难道TCP只需要握手和挥手就行了吗。

    结论

    先说结论:
    在已经建立好连接的TCP上(只考虑数据包和ack包),seq和ack的计算规则为
    本次要发送的包的 seq = 上一个发送的包的seq + 上一个发送的包的长度(不含包头)
    本次要发送的包的 ack = 上一个接收到的包的seq + 上一个接收到的包的长度(不含包头)

    分析

    按照我的理解,seq和ack都是指针 。seq指示要发送的包在窗口中的起始位置 ,ack指示已经接收的包的位置
    下面我就用我wireshark抓的包和画的实例图一起分析一下

    第一个包:

    在这里插入图片描述
    在这里插入图片描述
    第一个包是 客户端 发向 服务器 的数据包,长度为 517 字节
    首先,seq和ack的值都是1,这是握手后的状态。
    然后,第一个包对应TCP流行图的第四行
    此时要发送的数据包的起始位置是1,还没有已经接收到的数据包,所以ack 也为 1。

    第二个包

    在这里插入图片描述
    在这里插入图片描述
    再第一个包发完之后,客户端的seq(下一个要发送数据的其实位置)要后移 517 字节
    第二个包是 服务器 发向 客户端 的ack包
    服务器的接收窗口收到数据,所以ack = 已收到的字节 = 1 + 517 = 518 = 上一个收到的包的seq + 包长
    由于服务器并没有发送数据,所以seq(下一个要发送数据起始位置)保持不变
    客户端接收到了ack包,但是这个包没有数据,所以客户端的接收窗口不变。

    第三个包

    在这里插入图片描述
    在这里插入图片描述
    第三个包是 服务器 发往 客户端 的数据包 长度为 96
    seq(发送数据的起始位置)= 1;
    ack (接收数据的末尾)= 518;

    第四个包

    在这里插入图片描述
    在这里插入图片描述

    在服务器发送第三个包之后, seq后移 96 个字节,变成 96 + 1 =97
    客户端收到第三个包,ack后移96,变成 96 + 1 =97
    第四个包是 服务器 发往 客户端 的 数据包长度 6 个字节
    所以这个包的 seq(发送数据的起始位置) = 97
    由于服务器没有接收到新的数据,所以 ack(接收数据的末尾) = 518(不变)

    第五个包

    在这里插入图片描述
    在这里插入图片描述

    服务器发送第四个包后,seq后移6字节(图中蓝色部分),seq = 97 + 6 = 103
    客户端收到第四个包,ack后移6字节 ack = 97 + 6 = 103
    第五个包是 服务器发送 给 客户端 的数据包(长度45字节)
    容易计算 seq = 103
    ack = 518(不变)

    第六个包

    在这里插入图片描述
    在这里插入图片描述
    这是一个由客户端发往服务器的ack包,但是需要注意的是,这个包是对 第四个包(长度为6)的数据包的ack
    seq(发送数据的起始位置) = 518
    ack (已经接收的包)= 1 + 96 + 6 = 103

    以此类推

    以此类推,就可以分析每一个数据包的seq和ack的值了,附上完整的流行图
    在这里插入图片描述

    结语

    我是用指针的方式来理解seq和ack的,经过学习才发现,理论上(自顶向下)的TCP的和实际的TCP还是有非常大的差别的。
    这篇文章是我自己的总结,难免有不对的地方,希望大家指正。

    展开全文
  • TCP序列号和确认序列号

    千次阅读 2019-01-21 18:38:58
    仔细检查序列和确认号码。...您可以看到,序列号继续确认号码。 我们将要解释这些数字如何增加,它们的意思是什么,各种操作系统如何以不同的方式处理它们,最后是什么方式,这些数字可能成为那些需要...
  • 计算TCP序列号

    2018-01-18 09:27:09
    #!/usr/bin/python #coding=utf-8 from scapy.all import * def calTSN(tgt): seqNum = 0 preNum = 0 diffSeq = 0 # 重复4次操作 ... # 若不是第一次发送SYN包,则设置前一个序列号值为上一次SYN/A
  • 目录 解释ARP缓存中毒的基本原理 ARP协议 ARP缓存中毒概念 ARP缓存中毒后果 1)拒绝服务 2)中间人 3)MAC泛洪 ARP缓存中毒缓解技术 TCP序列号预测和TCP重置攻击 TCP概述 TCP序列预测攻击 TCP重置攻击 解释ARP缓存...
  • TCP序列号和确认号详解

    万次阅读 多人点赞 2018-06-29 15:13:00
    TCP序列号和确认号详解在网络分析中,读懂TCP序列号和确认号在的变化趋势,可以帮助我们学习TCP协议以及排查通讯故障,如通过查看序列号和确认号可以确定数据传输是否乱序。但我在查阅了当前很多资料后发现,它们...
  • Kevin Mitnick的TCP序列号预测攻击原理

    千次阅读 2016-10-02 22:26:07
    Kevin Mitnick的TCP序列号预测攻击原理TCP/IP协议栈的设计和利用还是让我觉得太炫酷了!! 环境分析 涉及到四台机器:攻击者:Mitnick 受害者:Shimomura 中间被利用者:Remote 测试ISN算法机器:Tester 攻击入口 ...
  • 一个tcp流的初始序列号(ISN)并不是从0开始的,而是采用一定的...此时就出现了所谓的tcp序列号回绕(sequence wraparound)问题。 内核解决办法 内核中给出的序列号(解决序列号回绕问题)判断解决方案十分简洁: ...
  • TCP序列号和确认号

    千次阅读 2018-06-09 22:00:22
    这里分两种情况来讲:一、三次握手第1步:客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN)是客户端随机产生的一个值,确认号是0;第2步:服务器收到这个同步请求数据包后,会对客户端...
  • #define TCP_SEQ_LT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0) #define TCP_SEQ_LEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0) #define TCP_SEQ_GT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0) ...
  • 通过wireshark理解TCP序列号和确认号

    千次阅读 2020-03-11 15:03:17
    本文通过wireshark抓包来分析帮助理解TCP在建立连接过程、传输数据过程中序列号和确认号的变化
  • 如果你正在读这篇文章,很可能你对TCP“非著名”的“三次握手...这篇文章的目的是让你能够更加熟练的检查Wireshark中的TCP序列号和确认号. TCP三次握手: SYN - 创建一个连接 FIN - 终结一个连接 ACK - 确认接收到的数据
  • 文档撰写背景为学习“科来网络分析系统6.9技术交流版”使用,及TCP抓包分析后,根据《TCP序列号和确认号详解》验证后,所写。
  • TCP序列号与确认号

    千次阅读 2021-02-02 17:24:34
    序列号是TCP协议的可靠性的保证,三次握手就是交换初始序列号...理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number) TCP三次握手及四次挥手详解及常见面试题 “三次握手,四次挥手”你真的懂吗? ...
  • 点击阅读原译文 原文见:http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ 如果你正在读...不幸的是,对很多人来说,对TCP的学习就仅限于此了。尽管年代久远,TCP仍是一...
  • TCP序列号和确认号介绍

    千次阅读 2015-04-07 16:42:57
    TCP是一种可靠的面向连接的数据流协议,TCP之所以可靠,是因为它保证了数据的传输有序,这是通过一个序列号和确认号来保证的。   序列号的作用: TCP将应用层数据和管理数据的每一字节进行顺序编号,序列号用于指出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,614
精华内容 24,645
关键字:

TCP序列号