lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1225回复:8

一个tcp连接的基础问题:

楼主#
更多 发布于:2003-08-25 14:40
我使用一个sniffer工具查看了两台机器之间的包传递过程:

1、A->B   SYN  
2、B->A   SYN+ACK
3、A->B   ACK
4、A->B   PSH+ACK
5、B->A   ACK

请问各位老大:
4是什么意思啊?书上介绍psh是尽快传给应用层
5又是什么意思呢?握手不是三次就可以了么?

我自己写了一个程序大体流程如下:
其中:A为客户端,B为服务器,DRIVER为服务器B的IMD驱动程序
1、A->DRIVER       SYN  
2、DRIVER->A       SYN+ACK
3、A->DRIVER       ACK 此时,DRIVER->B发送1中的SYN
4、B->A            SYN+ACK
5、A->B            ACK
6、A->B            PSH+ACK
7、B->A            RST(?????????????)

上面的流程第7个让我看不懂,明明握手已经建立了,怎么服务器会给客户端发送rst包呢?可能是什么原因呢? :(
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-25 17:36
自己悟了一天,好像明白了,第三步中不能直接转发第一步中的syn包,对客户端来讲,序号错了,可是:
想请教各位大侠,我如何能得到客户端的当前的sequence number呢?
zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-25 23:04
第一个请求就有客户端的随机产生的初始序列号了
服务端返回时使用客户端初始序列号和自己随机产生的初始序列号,以后各端发出新的包时将自个的序列号加一,而对方的序列号使用对方传过来的最新的序列号,应该是这样子吧!
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-26 09:28
有些明白了。
给分先。
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-28 14:02
麻烦帮我看一下下面的流程有什么问题啊?


                          SYN=15 11 28 fc  ACK=0
1、CLIENT------------------->DRIVER                             SERVER
                         SYN=00 00 00 02 ACK=15 11 28 fd
2、CLIENT<-------------------DRIVER                             SERVER
                         SYN=15 11 28 fd  ACK=00 00 00 03
3、CLIENT------------------->DRIVER                             SERVER
  
 现在客户端认为连接已经建立,可以传数据了。    

                                                                      SYN=15 11 28 fc  ACK=0
4、CLIENT                       DRIVER--------------------> SERVER(就是1中的包直接转发)

                                    SYN=32 b6 8a de (系统分配的)   ACK=15 11 28 fd
5、CLIENT<------DRIVER<-------------------- SERVER

现在客户端认为以前的连接1可能以前的连接是错的,client将会发送连接1确认报文6过来(也就是3的确认报文,syn数值应该变么???)
                                    SYN=15 11 29 61    ACK=00 00 00 03
6、CLIENT------>DRIVER-------------------- >SERVER

比较奇怪的是下面这个报文7:syn=ack???? (服务器直接返回一个rst包)
                                    SYN=00 00 00 03   ACK=00 00 00 03
7、CLIENT<------DRIVER<-------------------- SERVER

随后服务器重新发送5的确认包8:(而且sequence number 没有变??????)
                                    SYN=32 b6 8a de ACK=15 11 28 fd
8、CLIENT<------DRIVER<-------------------- SERVER                        

客户端对数据报8返回rst包9:syn=ack????
                                    SYN=15 11 28 fd    ACK=15 11 28 fd
9、CLIENT------>DRIVER-------------------- >SERVER
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-28 14:08
上面的是在服务器端安装了驱动程序后,客户端和服务器端进行握手交互的syn和ack的值,其中第二步中的syn=00 00 00 02是我自己指定的。

不明白的是:
1、
第三步客户端发来的ack包如果我不理会,客户端会再次发确认包,服务器(真实的服务器,非我的DRIVER)会发rst包断掉,可是,第5步的syn+ack包为什么客户端就不管了呢?

2、
我这样前三步由DRIVER和客户端握手,以后由真实服务器和客户端握手的方法是不是有问题啊?
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-28 14:10
终于可以上开发网了,老大会过来啊
zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-28 14:40
有些晕,你用正确的驱动,然后使用netspy看一下包的过程,跟你自己的对比一下,也许会找到原因!
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-08-28 15:08
这些是用sniffer看的,和正确的对比得到的这许多疑问。

前三个是driver代替服务器和客户端握手
后面的是driver只作中间传递作用,由服务器和客户端之间建立握手
游客

返回顶部