Eclipse-Unix http://umlfact.berlios.de/~s_xsun/
posted on 2008-08-07 09:20 Xiaobo Sun 阅读(9660) 评论(4) 编辑 收藏 所属分类: TCP/IP UDP
握手阶段: 序号 方向 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=70000,size=1514的数据包 24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。 25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。 26:一样的啊 回复 更多评论
其实在握手和结束时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度.如果从以太网包返回来计算所加的长度,就嫌走弯路了. 另外,如果对方没有数据过来,则自己的确认号不变,序列号为上次的序列号加上本次应用层数据发送长度. 回复 更多评论
请教一下:socket 远程通信,为什么同一个socket 会有 多个TIME_WAIT 的状态?如下tcp 0 0 58.248.1*1.*:80 124.65.82.194:2922 TIME_WAIT - tcp 0 0 58.248.1*1.*:80 124.65.82.194:2922 TIME_WAIT - tcp 0 0 58.248.1*1.*:80 124.65.82.194:2922 TIME_WAIT - tcp 0 0 58.248.1*1.*:80 124.65.82.194:2922 TIME_WAIT - tcp 0 0 58.248.1*1.*:80 124.65.82.194:2922 TIME_WAIT - tcp 0 0 58.248.181.4:80 124.65.82.194:2922 TIME_WAIT - tcp 0 0 58.248.181.4:80 124.65.82.194:2922 TIME_WAIT - 回复 更多评论
Hi想请教一个问题,一般产生RST报文的时候win位是否为0?或者,win=0直接就引起server端发送RST报文?我联系方式 403921798谢谢,望给与指导 回复 更多评论
Powered by: BlogJava Copyright © Xiaobo Sun