TCP协议中的Ack和Seq号
作者:互联网
一、基本概念
seq:表示本次发送数据的偏移量,也就是从哪里开始发送数据。
len:表示本次tcp携带的数据长度。
ack:首先意味着已经收到对方多少字节数据,其次告诉对方接下来的包的seq
要从ack
确定的数值继续接力。
二、Wireshark抓包
本地请求61.135.185.32
这个ip
,这个过程的抓包如下。
三次握手
(客户端)1
号包:我能和你建立连接吗?
seq=0
,表示这是一个新的开始- 没有
ack
,因为还没有建立连接,也就不存在我收到了对方多少的数据的说法 Len=0
,表示我没有传输数据,就是一个想要建立连接的tcp
包而已。
(服务端)2
号包:我收到了,我们能进行连接,快来玩吧。
seq=0
ack=1
暗示了两点,第一表示我收到了你刚才的那个seq=0
的连接请求,另外告诉对方接下来请从seq=1
开始给我传输数据Len=0
,表示同样没有传输数据。
(客户端)3
号包:好的,那我们就连接吧。
seq=1
,响应上面的包,我真的从seq=1
开始传输哦ack=1
,表示我收到了你的seq=0
同意连接,下面你也请从seq=1
给我传输数据吧Len=0
好了,三次握手愉快的结束,建立起来了连接。
总结一下三次握手的过程:
- 起始包的
seq
都等于0
- 三次握手中的
ack=对方上一个的seq+1
seq
等于对方上次的ack
号
数据传输过程
(客户端)4
号包:我要你的首页信息
客户端发送http
请求,http
请求需要tcp
进行控制,然后交给ip
层,然后由网卡发出...
注意4
号帧tcp
包的内容
seq=1
,因为上次没有传输数据,seq
号不变,也就是3
号包的seq=1,len=0
ack=1
,告诉服务端你要是发送数据,得从seq=1
开始哈len=77
,表示我这次传输的数据字节数
(服务端)5
号包:好的,我收到你的请求了。
seq=1
,如4
号包的ack
所要求的ack=78
,ack=4
号包的seq+4号包的len = 1+77=78
表示客户端啊,你要是再发就从seq=78
开始发送哈len=0
(服务端)`6
`号包:诺,给你的数据
5、6
号均为服务端发送的包,在这期间没有接收到包,理所应当的,5、6
号包的seq、ack
是一样的。
seq=1
ack=78
len=1440
,数据的长度
(客户端)7
号包:收到啦
seq=78
,你让我从78
发,我就从78
发ack=1441
,1441=6
号包的seq+6
号包的len=1+1440=1441
,表示我收到啦len=0
总结
发送方的包,包括seq
和len
,接收方如何告知对方数据已经收到呢?
答案就在于接收方的ack=发送方的seq+发送方的len
。
整体来讲,就是这样。
特殊情况在于三次握手时,客户端、服务端握手时,len=0
,此时对方就不是ack=seq+0
,而是ack=seq+1
。
参考链接:
https://blog.csdn.net/zhangdaxia2/article/details/107760114
https://zhuanlan.zhihu.com/p/439614017
标签:Seq,seq,Ack,TCP,ack,len,客户端,服务端,78 来源: https://www.cnblogs.com/superbaby11/p/16295671.html