当前位置:  技术问答>linux和unix

继续探讨关于TCP编程中ACK的奇怪问题,高手请进(有详细抓包过程)

    来源: 互联网  发布时间:2016-06-23

    本文导语:  我的目的是要利用ISCSI协议和server端进行通信。 client和server在WINDOWS中都有现成的软件(MICROSOFT ISCSI INITIATOR和ISCSI CAKE),而我是要模拟client的功能(我的client程序放在arm中跑)。本人网络编程应该算入门了,写过一些...

我的目的是要利用ISCSI协议和server端进行通信。 client和server在WINDOWS中都有现成的软件(MICROSOFT ISCSI INITIATOR和ISCSI CAKE),而我是要模拟client的功能(我的client程序放在arm中跑)。本人网络编程应该算入门了,写过一些网络编程的代码。但是这个问题真的比较奇怪,百思不得其解,google也找不到答案。

首先看现成软件的正确的通信过程1:
包1:FLAG(SYN)        方向(C->S)  SEQ(2304958692) ACK(0)          大小(74)
包2:FLAG(ACK+SYN)    方向(S->C)  SEQ(3902452458) ACK(2304958693) 大小(78)
包3:FLAG(ACK)        方向(C->S)  SEQ(2304958693) ACK(3902452459) 大小(66) (握手握好了)
包4:FLAG(ACK+PSH)    方向(C->S)  SEQ(2304958693) ACK(3902452459) 大小(114)(发送了一个命令头,内容部不贴了,就叫它头1吧)
包5:FLAG(ACK+PSH)    方向(C->S)  SEQ(2304958741) ACK(3902452459) 大小(290)(发送了一个命令数据,简称数据1)
包6:FLAG(ACK)        方向(S->C)  SEQ(3902452459) ACK(2304958965) 大小(66)
包7:FLAG(ACK+PSH)    方向(S->C)  SEQ(3902452459) ACK(2304958965) 大小(114)(返回一个命令头,头2)
包8:FLAG(ACK)        方向(C->S)  SEQ(2304958965) ACK(3902452507) 大小(66)
包9:FLAG(ACK+PSH)    方向(S->C)  SEQ(3902452507) ACK(2304958965) 大小(186)(返回一个数据头,数据2)(正确的通信会收到头2的数据2)

然后是我写的程序的通信过程2:
包1:FLAG(SYN)        方向(C->S)  SEQ(306076103 ) ACK(0)          大小(74)
包2:FLAG(ACK+SYN)    方向(S->C)  SEQ(741538317 ) ACK(306076104 ) 大小(78)
包3:FLAG(ACK)        方向(C->S)  SEQ(306076104 ) ACK(741538318 ) 大小(66) (握手也握好了)
包4:FLAG(ACK+PSH)    方向(C->S)  SEQ(306076104 ) ACK(741538318 ) 大小(114)(发送了一个命令头,内容和正确通信绝对是一样的!)
包5:FLAG(ACK)        方向(S->C)  SEQ(741538318 ) ACK(306076152 ) 大小(66)
包6:FLAG(ACK+PSH)    方向(C->S)  SEQ(306076152 ) ACK(741538318 ) 大小(290)(发送了一个命令数据,和正确通信业绝对是一样的!)
包7:FLAG(ACK+PSH)    方向(S->C)  SEQ(741538318 ) ACK(306076376 ) 大小(114)(返回一个命令头,头2,到此结束,头2的格式不正确,通信不成功)


问题:过程1和过程2没有随机性,每次测试,结果都是一样的(当然每次测试SEQ和ACK的初始值不一样)。过程2和过程1唯一不同的地方就是,在过程2中,我发了包4,SERVER马上就回了相应的包5,然后我才发包6(我是调用两次send)。而在过程1中,client连续发了包4和包5,然后server回应一个包6。这个就是奇怪的地方,这个client是如何做到连续发了包4和包5?它的包5是怎么产生的?在程序中要怎么设置?(注意包5的SEQ,它并不是之前的包的回应)
注:请不要叫我去看什么TCP/IP详解,如果人人都有时间时不时的把那书再查一遍,CSDN就没有存在的意义了。

|
然后我才发包6(我是调用两次send)。而在过程1中,client连续发了包4和包5,然后server回应一个包6。这个就是奇怪的地方,这个client是如何做到连续发了包4和包5?它的包5是怎么产生的?在程序中要怎么设置?(注意包5的SEQ,它并不是之前的包的回应) 


连续2次send倒是全部可以发到缓冲区.只要没有发生数据交叉的话,那server可以从缓冲区正确的解析.

|
是否可以将其详细的dump packet情况贴上来,包括时间、option等!

|
如果可以,請抓wireshark的log上來,我對你寫的這個過程不感冒...

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • make过程中还能继续?
  • MySQL存储过程中游标循环的跳出和继续操作示例
  • CentOS下PHP安装完成后继续安装GD扩展库
  • 父进程等待子进程n秒,如果子进程正常退出,父进程立即继续向下执行,如果子出现进程故障一直不退出,父进程等待n秒后继续向下执行,请问
  • 继续继续RAID5问题
  • 停在断点后AppletViewer不能再继续了……
  • 如何让一个daemon线程 重启后来继续运行呢?
  • 父进程等待子进程n秒,如果子进程正常退出,父进程立即继续向下执行,如果子出现进程故障一直不退出,父进程等待n秒后继续向下执行,请问 iis7站长之家
  • 继续给分
  • 怎样使一个线程暂停,还有继续
  • 发现一个有趣的东西,继续散分。
  • suse linux 网络管理器小程序找不到所需的资源。无法继续。
  • 请教下:是否有方法 在vim中执行make命令的同时继续编辑和查看文件呢?
  • sh脚本 用户退出后继续执行
  • 郁闷,继续散分
  • 继续请教机器死机问题
  • 继续散分!贿赂各位大虾和小虾
  • 土土的问,gdb中如何从一个断点继续执行到下一个断点?(不是单步)
  • 接前面的《继续讨论文件目录处理的,高手指点!!》
  • 急!急!急!继续提问!简单问题!
  • 直到线程执行完后,才让程序继续执行下去,怎么实现??
  • 继续问:使用Motif库的OverrideShell创建的窗口怎么放在屏幕的中央?
  • 继续散分:代码管理助手1.0


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3