之前在《深入理解并行编程》的群里,有个小米的兄弟问了一个问题,服务器A发包给服务器B,Seq是1,但是在未能收到服务器B的报文回复的情况下,发送了rst,但是rst报文中,对应的seq是1461,一堆人都在猜测,为什么seq跳变了,由于当时只看到一半的图片,所以我让他发送完整报文出来之后,我发现其实rst的seq不是1的原因,并不是因为跳变,而是正常的,因为发送给B的报文,长度为1460,但是这个报文没有得到回复,所以在超时之后,应用程序关闭了这条连接,导致内核协议栈发送了一个rst报文,而rst报文选取seq的时候,并不是选取的确定已经发送的seq,而是当前连接已经用掉的seq,也就是当前seq,哪怕这个报文没有收到回复,也会使用。
具体看代码:

其中关注下报文的init过程:

那么传入的seq是多少呢?

注释写得比较清楚,如果窗口没有shrunk,也就是tp->snd_nxt 没有out of window 的话,则取得就是tp->snd_nxt,而这个值,就是报文长度+1了,也就是1461.
-
服务器
+关注
关注
13文章
10094浏览量
90874 -
协议栈
+关注
关注
2文章
146浏览量
34484 -
报文
+关注
关注
0文章
39浏览量
4312
原文标题:干货 | tcp协议栈中rst报文的seq跳变问题
文章出处:【微信号:ZTEdeveloper,微信公众号:中兴开发者社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
14-TCP 协议(连接异常与RST)
怎么使用stm32的LWIP协议栈进行报文调度算法的开发?
LWIP TCP报文基础知识及其LWIP中TCP协议的实现
tcp报文格式详解
Microchip TCP/IP协议栈
Microchip TCP/IP精简协议栈
Microchip TCP/IP协议栈

关于tcp协议栈中rst报文的seq跳变问题
评论