有关TCP包头中的两个序号字段的问题

leon7909 2006-04-07 03:33:34
一直没有搞懂这两个序号字段的用法,今天用IRIS抓包的时候发现怎么三次握手后,发送数据时,用的序号和确认序号这两个值就是两个相同的值在不停的切来切去,就象下面的样子:
A:为客户机,B:为服务器
---------------握手---------------
A:SYN=1,SEQ=51210,ACKSEQ=0
B:SYN=1,ACK=1,SEQ=13352,ACKSEQ=51210
A:ACK=1,SEQ=51210,ACKSEQ=13352
-------------连线已经建立,约一分钟后A向B发送数据------
A:ACK=1,PSH=1,SEQ=51210,ACKSEQ=13352,数据为6个随意的CHAR
B:ACK=1,SEQ=13352,ACKSEQ=51210
-------------一分钟后再发一次数据------------------
A:ACK=1,PSH=1,SEQ=51210,ACKSEQ=13352
B:ACK=1,SEQ=13352,ACKSEQ=51210

不知道我表达清楚我的意思没?请看SEQ和ACKSEQ,总是51210和13352这两个数字在换来换去,不是说这个值会递加的吗?具体是加一还是说加上包长我也没太看明白,书上写得太难看明白了.请了解这个的高手给讲解一下,这个序号要递增的话要依什么递增呢?谢谢了.
...全文
538 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
leon7909 2006-04-10
  • 打赏
  • 举报
回复
嗯,谢谢各位了,非常的清楚了,现在唯一搞不明白的就是为什么抓到的包会没有按照TCP协议要求的那样做了,我的环境是win2000,最简单的TCP/IP程式,用IRIS抓的包.
贵子潘 2006-04-09
  • 打赏
  • 举报
回复
因为我抓的包包含了三个协议的头,所以要减
leon7909 2006-04-08
  • 打赏
  • 举报
回复
上面两位老兄的意思我大概明白了.可是冰风同学下面的描述我还有点不太清楚一个地方:

数据传输阶段:
序号  方向      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
不是说ACK是上次的SEQ+收的应用数据大小吗,每次减的这个54是什么意思呢?还有个困惑就是我在提问时写的那个例子,那个例子是从IRIS抓的包里一个个照例写下来的,为什么抓到的包显示他并没有尊从TCP协议递加ACK呢?难道是IRIS的问题?应该不会啊.
softrain 2006-04-08
  • 打赏
  • 举报
回复
这里应该加的是多少应用层数据,所以计算方法应该是加应用层数据大小,不用搞那么麻烦还加加减减的.
贵子潘 2006-04-08
  • 打赏
  • 举报
回复
54字节是以太网头14字节+IP头20字节+TCP头20字节的
ACK=SEQ+用户层数据包大小,而我的这个size大小包含了上面三个协议头大小,所以要减54
oyljerry 2006-04-08
  • 打赏
  • 举报
回复
ACK应该是SEQ加上接收到的数据多少,TCP中有个滑动窗,因而发送的数据多少会发生变化,每一次不一定一样,因而返回的ACK应该也是变化的……
softrain 2006-04-07
  • 打赏
  • 举报
回复
gzlyb(冰风) 说的正确.
其实在握手和结束时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度.如果从以太网包返回来计算所加的长度,就嫌走弯路了.
另外,如果对方没有数据过来,则自己的确认号不变,序列号为上次的序列号加上本次应用层数据发送长度.
最近做了一个基于UDP的TCP传输,着实也研究了一下,呵呵.
贵子潘 2006-04-07
  • 打赏
  • 举报
回复
打这么多字,累死我了
贵子潘 2006-04-07
  • 打赏
  • 举报
回复
郁闷到了极点,都快写完了,电脑太破,热死了。晕,从重写,不管是不是起到相反的作用。

我觉得你分析得到的结果有点奇怪。
我把我所知的说说:

握手阶段:
序号 方向   seq ack
1  A->B 10000 0
2 B->A 20000 10000+1=10001
3 A->B 10001 20000+1=20001
解释:
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


数据传输阶段:
序号  方向      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=30000,size=1514的数据包
24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。
25:A在收到B发过来的seq为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。
26:一样的啊

愚见,请拍砖:)
laofang 2006-04-07
  • 打赏
  • 举报
回复
up

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧