Chinaunix

标题: 键盘兄请进!TCP状态机的实现问题。 [打印本页]

作者: hjs6142    时间: 2003-05-29 22:33
标题: 键盘兄请进!TCP状态机的实现问题。
TCP协议的状态机为:
  1.                        
  2.                               +---------+ ---------\      active OPEN  
  3.                               |  CLOSED |            \    -----------  
  4.                               +---------+<---------\   \   create TCB  
  5.                                 |     ^              \   \  snd SYN   
  6.                    passive OPEN |     |   CLOSE        \   \           
  7.                    ------------ |     | ----------       \   \         
  8.                     create TCB  |     | delete TCB         \   \      
  9.                                 V     |                      \   \     
  10.                               +---------+            CLOSE    |    \   
  11.                               |  LISTEN |          ---------- |     |  
  12.                               +---------+          delete TCB |     |  
  13.                    rcv SYN      |     |     SEND              |     |  
  14.                   -----------   |     |    -------            |     V  
  15. +---------+      snd SYN,ACK  /       \   snd SYN          +---------+
  16. |         |<-----------------           ------------------>;|         |
  17. |   SYN   |                    rcv SYN                     |   SYN   |
  18. |   RCVD  |<-----------------------------------------------|   SENT  |
  19. |         |                    snd ACK                     |         |
  20. |         |------------------           -------------------|         |
  21. +---------+   rcv ACK of SYN  \       /  rcv SYN,ACK       +---------+
  22.    |           --------------   |     |   -----------                  
  23.    |                  x         |     |     snd ACK                    
  24.    |                            V     V                                
  25.    |  CLOSE                   +---------+                              
  26.    | -------                  |  ESTAB  |                              
  27.    | snd FIN                  +---------+                              
  28.    |                   CLOSE    |     |    rcv FIN                     
  29.    V                  -------   |     |    -------                     
  30. +---------+          snd FIN  /       \   snd ACK          +---------+
  31. |  FIN    |<-----------------           ------------------>;|  CLOSE  |
  32. | WAIT-1  |------------------                              |   WAIT  |
  33. +---------+          rcv FIN  \                            +---------+
  34.    | rcv ACK of FIN   -------   |                            CLOSE  |  
  35.    | --------------   snd ACK   |                           ------- |  
  36.    V        x                   V                           snd FIN V  
  37. +---------+                  +---------+                   +---------+
  38. |FINWAIT-2|                  | CLOSING |                   | LAST-ACK|
  39. +---------+                  +---------+                   +---------+
  40.    |                rcv ACK of FIN |                 rcv ACK of FIN |  
  41.    |  rcv FIN       -------------- |    Timeout=2MSL -------------- |  
  42.    |  -------              x       V    ------------        x       V  
  43.     \ snd ACK                 +---------+delete TCB         +---------+
  44.      ------------------------>;|TIME WAIT|------------------>;| CLOSED  |
  45.                               +---------+                   +---------+

  46.                       TCP Connection State Diagram
复制代码


我现在要做服务器端的程序,我也不管客户端的情况,不过客户端肯定也是根据TCP状态机来实现的,这一点已经足够了。
现在有一个问题,就是当我把所有数据发送给客户端后,怎样告诉客户端所有数据已经发送完,状态图上好象只有服务器端的被动关闭与双方同时关闭,能不能让服务器端发起主动关闭?那么服务器ESTABLISHED的下一个状态该是什么?谢谢!
由于马上要下机,可能我问的不是很清楚。
作者: gadfly    时间: 2003-05-29 22:54
标题: 键盘兄请进!TCP状态机的实现问题。
可以用半关闭,shutdown。

精华区有一篇"网络编程 讨论版1",讲的很详细
作者: hjs6142    时间: 2003-05-30 09:00
标题: 键盘兄请进!TCP状态机的实现问题。
好的,谢谢!我去看看。
作者: fieryfox    时间: 2003-05-30 09:24
标题: 键盘兄请进!TCP状态机的实现问题。
下一个状态就是FIN_WAIT_1
作者: hjs6142    时间: 2003-05-30 10:47
标题: 键盘兄请进!TCP状态机的实现问题。
[quote]原帖由 "fieryfox"]下一个状态就是FIN_WAIT_1[/quote 发表:
     

我现在有一个问题:在我的服务器端实现被动打开,等数据发送完后实行主动关闭,服务器端的状态变迁是不是应该是这样的:EATABLISHED -->; FIN_WAIT_1 -->; TIME_WAIT(收到FIN、ACK,并发送ACK后) -->;CLOSED(超时后);而客户端:ESTABLISHED -->; CLOSED_WAIT(当收到FIN,并发送ACK后) -->; LAST_ACK(发送FIN后) -->; CLOSED(收到ACK后)。

还有,根据状态图,使TIME_WAIT 进入CLOSED 除了2MSL超时外,还有什么原因使他进入?
作者: gadfly    时间: 2003-05-30 12:15
标题: 键盘兄请进!TCP状态机的实现问题。
如果客户端不是同时也主动关闭的话,服务端应该是:
EATABLISHED -->; FIN_WAIT_1 -->; FIN_WAIT_2->;TIME_WAIT(收到FIN、ACK,并发送ACK后) -->;CLOSED(超时后);

被动关闭最后收到ACK包,也可能进入
作者: fieryfox    时间: 2003-05-30 13:39
标题: 键盘兄请进!TCP状态机的实现问题。
TIME_WAIT进入CLOSED状态只能是2MSL超时之后。如果设置socket的SO_REUSEADDR,则如果不是同一个四元组连接,在2MSL之内端口可以重新使用。
作者: hjs6142    时间: 2003-05-30 16:01
标题: 键盘兄请进!TCP状态机的实现问题。
谢谢楼上的两位!

我现在想实现以下的设计:
客户端访问服务器,服务器发送相应的数据(网页)给客户端,然后客户端在HTTP主体中发送信息给服务器(比如客户端按下网页某个选择按钮,要求服务器执行某个动作),请问TCP状态机该怎样处理?服务器是主动关闭好还是被动关闭好?谢谢!
作者: 蓝色键盘    时间: 2003-05-30 16:12
标题: 键盘兄请进!TCP状态机的实现问题。
为了降低服务压力,可以让服务器主动关闭,如果在关闭后操作能够预知的话,用shutdown。

为了提高响应效率,让客户来主动关闭。
作者: hjs6142    时间: 2003-05-30 16:27
标题: 键盘兄请进!TCP状态机的实现问题。
原帖由 "蓝色键盘" 发表:
为了降低服务压力,可以让服务器主动关闭,如果在关闭后操作能够预知的话,用shutdown。

为了提高响应效率,让客户来主动关闭。
   

谢谢键盘大哥!
还有一个问题:因为不知道客户端什么时候提交信息给服务器,所以想当服务器发送数据(网页)给客户端后就关闭连接(服务器主动关闭),等客户端提交信息后双方再建立连接,然后服务器再发送数据给客户端,请问这样可以吗?
还有如果前后两次连接的ISN一样,会出现什么后果?谢谢!
作者: 蓝色键盘    时间: 2003-05-30 16:39
标题: 键盘兄请进!TCP状态机的实现问题。
1、可以。

2、只要上次连接完全断开,就没什么影响,就算上次连接处于TIME_WAIT2状态,LISTEN会保证在队列中重新给新的连接分配资源。
作者: hjs6142    时间: 2003-05-31 11:35
标题: 键盘兄请进!TCP状态机的实现问题。
原帖由 "蓝色键盘" 发表:
为了降低服务压力,可以让服务器主动关闭,如果在关闭后操作能够预知的话,用shutdown。
为了提高响应效率,让客户来主动关闭。
   

原帖由 "蓝色键盘" 发表:
为了降低服务压力,可以让服务器主动关闭,如果在关闭后操作能够预知的话,用shutdown。
为了提高响应效率,让客户来主动关闭。
   

键盘老大,我现在又有一个问题:
我编程实现服务器的功能是这样的,当服务器发送完数据后,发送一个FIN 包,然后直接进入CLOSED状态,等待新的连接接入,也就是与客户机终止连接双方没有经过4次握手;下一次的连接是由客户机发起的。这样的过程我用网络数据截取工具截取的数据包进行分析发现,虽然双方没有4次握手终止连接,但下一次的连接还是能够成功,且双方还能互相传送数据,但是服务器发送给客户机的数据客户机并没有解析(我这里用的是HTTP应用层协议,发送网页),但是客户机已经送数据给服务器了,说明它已经进入ESTABLISHED状态了,好象是客户机并没有收到数据包,请问这是为什么?谢谢!

还有,顺便问个问题:通过WIN98的IE浏览器怎么终止与服务器的连接,工具栏上的“停止”键是什么意思?谢谢!
作者: hjs6142    时间: 2003-06-01 10:28
标题: 键盘兄请进!TCP状态机的实现问题。
up一下。
作者: 蓝色键盘    时间: 2003-06-02 14:01
标题: 键盘兄请进!TCP状态机的实现问题。
但下一次的连接还是能够成功,且双方还能互相传送数据,但是服务器发送给客户机的数据客户机并没有解析(我这里用的是HTTP应用层协议,发送网页),但是客户机已经送数据给服务器了,说明它已经进入ESTABLISHED状态了,好象是客户机并没有收到数据包,请问这是为什么?


回答:上面这堆话以前得描述是正确得,TCP连接诶终止不一定要走4分节终止序列。如果通讯中得一个断点直接得发送终止FIN。可一导致连接提早得到来。上面这几句话描述得情况可以这样得分析问题,以前得连接一旦服务器发送完数据后,发送一个FIN 包,这个连接便不可利用了。在其后得客户重新和服务建立得连接,和以前得终止连接没有任何关系。是由listen队列中取出的全新的连接。这个连接一旦处于你所描述的ESTABLISHED状态,就可以相互转发信息。然而你说客户段不能够解析这种信息。这个你要检查客户段是否接受到的是该服务的响应信息,如果你保证客户接受的数据正确到达,那么为提可能出在了应用逻辑的处理部分。
作者: hjs6142    时间: 2003-06-02 15:31
标题: 键盘兄请进!TCP状态机的实现问题。
非常感谢键盘老大!
作者: 蓝色键盘    时间: 2003-06-02 16:23
标题: 键盘兄请进!TCP状态机的实现问题。
受不了,中午论坛有问题。搞得我发了多次。

各位朋友,见谅!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2