目录
2.2 确认号(Acknowledgment Number)
1. TCP定义
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在网络通信中,TCP确保数据包能够正确无误地从源传送到目的地。之前我们在讲解TCP三次握手时,提到过TCP包头结构,其中有序列号和确认号,而TCP 实现可靠传输的方式之一,就是通过序列号和确认应答。
2. 序列号和确认号
在TCP协议中,序列号(Sequence Number)和确认号(Acknowledgment Number)是两个非常重要的概念,它们对于确保数据传输的可靠性和顺序性起着关键作用。
2.1 序列号(Sequence Number)
-
作用:占 4 字节,序号范围[0,2^32-1],序号增加到 2^32-1 后,下个序号又回到 0。TCP是基于数据流的,序列号用于标识数据流中的字节位置,它表示数据包中的第一个字节在整个数据流中的位置。接收方在接收到数据包后,会根据序列号对数据包进行排序和重组,确保数据的顺序正确。
-
初始化:在TCP连接建立时(三次握手过程中),双方会交换初始序列号(ISN,Initial Sequence Number)。这个序列号是随机生成的,以确保安全性。
-
用途:序列号使得接收方能够正确地重新组装从发送方接收到的数据段。即使数据段在传输过程中乱序到达,接收方也能够根据序列号将它们正确地排序。
2.2 确认号(Acknowledgment Number)
-
作用:占 4 字节,当接收方收到一个数据包后,它会发送一个确认应答(ACK)给发送方,表明数据包已被成功接收。并且期望下一个接收到的数据包的序列号是多少。
-
计算方式:确认号通常是接收方期望接收的下一个字节的序列号。例如,如果接收方成功接收到序列号为300到700的数据,那么它发送给发送方的确认号将是701。
-
用途:发送方根据接收方的确认号来确定哪些数据已经被成功接收。如果发送方收到一个确认号,它就知道所有序列号小于或等于该确认号的数据段已经被接收方接收。
注意:SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加1,但是ACK的传输,不会让下一次的传输packet加1。
2.3 工作机制
-
数据发送:发送方在发送数据时,会在TCP头部的序列号字段中填入数据的第一个字节的序列号,并在数据发送后等待接收方的确认。
-
数据接收:接收方在接收到数据后,会在发送给发送方的TCP段的确认号字段中填入它期望接收的下一个字节的序列号。
-
乱序处理:如果数据段乱序到达,接收方会根据序列号重新组装数据,并只发送一个确认号,表明它期望接收的下一个字节的序列号。
-
重传控制:如果发送方在超时时间内没有收到某个数据段的确认,它会重传该数据段。
在TCP通信中,接收方会向发送方发送一个确认数据包,其中包含了确认号,表示接收到的数据包中的最后一个字节的下一个字节的序列号。
我们可以用wireshark抓包来看一下TCP的序列号和确认号:
通过上图我们可以看到:
-
进行三次握手时,客户端的初始序列号是2924706275,服务端的初始序列号是1859008164。
-
发送第一个包时,序列号是2924706276,是初始序列号+1,表示当前数据是第一个字节,数据长度8字节。
-
服务端回复ACK时,确认号是2924706284,是客户端的初始序列号+9,表示已经接收到前8个字节,现在期待第9个字节。
-
客户端继续发第二个包,序列号2924706284,表示当前数据是第9个字节。
-
服务端回复ACK时,确认号是2924706292,是客户端的初始序列号+17,表示已经接收到前16个字节,现在期待第17个字节。
在wireshark中,可以显示相对的序列号,可以更直观地看到序列号的变化:
这里我们可以看到,服务端发的包,序列号一直是1,因为当前服务端只是接收数据,并没有发送数据,所以服务端的序列号一直是1,而客户端的确认号也一直是1,表示期待服务端发送第一个字节过来。
实战列表:
4、
seq:上一次发送时为【1】,【1】中seq为0且为SYN数据包,所以这一次的seq为1(0增加1)。
ack:上次接收到时为【2】,【2】中seq为0,且为SYN数据包,所以可预计,server端下一次seq为1(0增加1)。
5、
seq:上一次发送时为【2】,【2】中seq为0,且为SYN数据包,所以这一次的seq为1(0增加1)。
ack:上一次接收时为【4】,【4】中的seq为1,数据包的长度为725,所以可以预计,下一次client端的seq为726(1+725)。
6、
seq:上一次发送时为【5】,【5】中seq为1,但【5】为ACK数据包,所以数据长度为0且不会驱使seq加1,所以这一次的seq为1(1+0)。
ack:上一次接收时为【4】,【4】中的seq为1,数据包的长度为725,所以可以预计,下一次client端的seq为726(1+725)。
总结:序列号和确认号的机制是TCP确保数据可靠传输的核心,它们使得TCP能够在不可靠的网络环境中提供可靠的数据传输服务。
结束语