美文网首页
TCP的seq和ack号计算方法

TCP的seq和ack号计算方法

作者: JL_chen | 来源:发表于2019-08-28 15:44 被阅读0次

seq和ack号存在于TCP报文段的首部中,seq是序号,ack是确认号,大小均为4字节(注意与大写的ACK不同,ACK是6个控制位之一,大小只有一位, 仅当 ACK=1 时ack字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。)

seq:占 4 字节,序号范围[0,2^32-1],序号增加到 2^32-1 后,下个序号又回到 0。TCP 是面向字节流的,通过 TCP 传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号。

ack:占 4 字节,期望收到对方下个报文段的第一个数据字节的序号。

1、三次握手过程中seq和ack的值:

一个TCP连接的建立是通过三次握手来实现的

1. (A) –> [SYN] –> (B)

假如服务器B和客户机A通讯. 当A要和B通信时,A首先向B发一个SYN (Synchronize) 标记的包,告诉B请求建立连接.

注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当B受到A发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能主动连接外部任何主机,除非不是TCP协议。

2. (A) <– [SYN/ACK] <–(B)

接着,B收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.

注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (A) –> [ACK] –> (B)

A收到SYN/ACK 包,A发一个确认包(ACK),通知B连接已建立。至此,三次握手完成,一个TCP连接完成

Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位

握手阶段:

序号    方向    seq    ack    SYN    ACK

1    A->B    10000    0    1    0

2    B->A    20000    10000+1=10001    1    1

3    A->B    10001    20000+1=20001    0    1

解释:

1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0

2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001

3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001

2、数据传输过程中seq和ack的值:

序号    方向    seq    ack    size

23    A->B    40000    

70000

1514

24    B->A    

70000

40000+1514-54=41460

54

25    A->B    41460    70000+54-54=70000    1514

26    B->A    70000    

41460+1514-54=42920

54

解释:

23:B接收到A发来的seq=40000,ack=70000,size=1518的数据包

24:于是B向A也发一个数据包,告诉A,你的上个包我收到了。A的seq就以它收到的数据包的ack填充,ack是它收到的数据包的seq加上数据包的大小(不包括:以太网协议头=14字节,IP头=20字节,TCP头=20字节),以证实B发过来的数据全收到了。

25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ack填充,ack 就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。

减去54的原因见下图(链路层使用的是Ethernet II 格式,这个格式有14字节以太网首部+4字节以太网尾部):

应用数据=size-14-20-20=size-54。(假设IP首部和TCP首部都没有可选选项)

为什么不减去以太网尾部的4字节呢?

因为在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目 的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处 理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,

3、四次挥手过程中seq和ack的值:

TCP连接的结束是四次挥手的过程,ACK一直等于1

序号    方向    seq    ack    FIN    ACK

1    A->B    80000    90000    1    1

2    B->A    90000    80000+1=80001    0    1

3    B->A    95000    80001    1    1

4    A->B    80001    95000+1=95001    0    1

1. (A) –> [FIN/ACK] –> (B)

客户端A没有要发送给服务端B的数据了,想要关闭链接,则发送一个FIN=1,ACK=1的包,告诉B可以关闭连接了,我没有什么数据要给你了。

2. (A) <– [ACK] <– (B)

然后B会发送ACK=1的包给A,告诉A我知道你没有什么想给我的了,但是我还有数据要给你,你先等下,我先不想FINISH呢。

3. (A) <– [FIN/ACK] <– (B)

等B把数据都发送给A之后,B会再次发送一个包,这次FIN=1,表示我这边也想关闭了,咱俩一起关把。在2和3之间,可能还会有很多B->A的传递,ack均为80001。

4. (A) –> [ACK] –> (B)

然后A回应一个ACK,表示我知道了,一起关吧。B收到这个ACK后,就会CLOSE。但是实际上A不会直接CLOSE,还会进入一个等待时间状态TIME_WAIT,持续2倍的MSL(Maximum Segment Lifetime,报文段在网络上能存活的最大时间)。过了这个状态,才会CLOSE。为什么要等待一段时间?原因有二:

(1)保证TCP的全双工连接能够可靠关闭

假如A发送的最后一次ACK丢包了,没有被B收到,那B超时之后,会再次发送一个FIN包,然后这个包被处于TIME_WAIT状态的A收到,A会再次发送一个ACK包,并重新开始计时,一直循环这个过程,直到A在TIME_WAIT的整个过程中都没有收到B发过来的FIN包,这说明B已经收到了A的ACK包并CLOSE了,因此A这时候才可以安心CLOSE。如果A没有TIME_WAIT状态而是直接close,那么当ACK丢包之后,B会再次发送一个FIN包,但是这个包不会被A回应,因此B最终会收到RST,误以为是连接错误,不符合可靠连接的要求。因此需要等待ACK报文到达B+BRST是TCP数据报中6个控制位之一,6个控制位的作用如下:

URG 紧急:当 URG=1 时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与紧急指针字段配合使用。

ACK 确认:仅当 ACK=1 时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。

PSH 推送:若 TCP 连接的一端希望另一端立即响应,PSH 字段便可以“催促”对方,不再等到缓存区填满才发送。

RST复位:若 TCP 连接出现严重差错,RST 置为 1,断开 TCP 连接,再重新建立连接。

SYN 同步:用于建立和释放连接,稍后会详细介绍。

FIN 终止:用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放 TCP 连接。

(2)保证这次连接的重复数据段从网络中消失

如果A直接close了,然后向B发起了一个新的TCP连接,可能两个连接的端口号相同。一般不会有什么问题,但是如果旧的连接有一些数据堵塞了,没有达到B呢,新的握手连接就已经到B了,那么这时候,由于区分不同TCP连接是依据套接字,因此B会将这批迟到的数据认为是新的连接的数据,导致数据混乱(源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字,新旧连接的套接字很有可能相同)

相关文章

  • TCP的seq和ack号计算方法

    seq和ack号存在于TCP报文段的首部中,seq是序号,ack是确认号,大小均为4字节(注意与大写的ACK不同,...

  • TCP三次握手四次挥手

    TCP三次握手四次挥手 重要字段 序号(Seq) 确认号(Ack) 32位,只有ACK标志位为1时,Ack序号才有...

  • TCP三次握手,四次挥手、状态图

    1,TCP三次握手 1)ACK确认位、SYN同步位、ack确认号、seq序号。image.png2)三次握手的必要...

  • TCP/IP

    tcp 首包 包括 : 源端口,接收端口, 序列号(seq),包括确认号(ACK) ,首部偏移量 标志位包括 sy...

  • TCP连接

    1. TCP连接过程 SYN 和ACK是报文标识位,前者表示请求建立一个新的连接,后者表示确认序列号有效seq:字...

  • TCP协议的三次握手和四次挥手

    seq: "sequance"序列号;ack: "acknowledge"确认号;SYN: "syn...

  • TCP序列号(Seq)与确认号(Ack)

    上一文章中我们讲到TCP/IP四层模型组分别有传输层,网络层,链路层,应用层。而传输层中存在两大协议分别为TCP协...

  • 技能树-网络-TCP

    必备知识: SYN :请求报文 是TCP/IP建立连接时使用的握手信号ACK :确认字符FIN :释放报文seq:...

  • TCP的几个标志位

    seq:序号ack:确认标志位的 参考 [理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程]...

  • TCP 保活 "TCP/IP详解" 第十七章 读书笔记

    TCP的保活包的序号是当前应发送的SEQ的-1, 这样不会干扰到正常的SEQ流,对方返回的仍然是之前的ACK值(因...

网友评论

      本文标题:TCP的seq和ack号计算方法

      本文链接:https://www.haomeiwen.com/subject/ebqmectx.html