免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5471 | 回复: 15
打印 上一主题 下一主题

键盘兄请进!TCP状态机的实现问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-29 22:33 |只看该作者 |倒序浏览
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的下一个状态该是什么?谢谢!
由于马上要下机,可能我问的不是很清楚。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-05-29 22:54 |只看该作者

键盘兄请进!TCP状态机的实现问题。

可以用半关闭,shutdown。

精华区有一篇"网络编程 讨论版1",讲的很详细

论坛徽章:
0
3 [报告]
发表于 2003-05-30 09:00 |只看该作者

键盘兄请进!TCP状态机的实现问题。

好的,谢谢!我去看看。

论坛徽章:
0
4 [报告]
发表于 2003-05-30 09:24 |只看该作者

键盘兄请进!TCP状态机的实现问题。

下一个状态就是FIN_WAIT_1

论坛徽章:
0
5 [报告]
发表于 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超时外,还有什么原因使他进入?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2003-05-30 12:15 |只看该作者

键盘兄请进!TCP状态机的实现问题。

如果客户端不是同时也主动关闭的话,服务端应该是:
EATABLISHED -->; FIN_WAIT_1 -->; FIN_WAIT_2->;TIME_WAIT(收到FIN、ACK,并发送ACK后) -->;CLOSED(超时后);

被动关闭最后收到ACK包,也可能进入

论坛徽章:
0
7 [报告]
发表于 2003-05-30 13:39 |只看该作者

键盘兄请进!TCP状态机的实现问题。

TIME_WAIT进入CLOSED状态只能是2MSL超时之后。如果设置socket的SO_REUSEADDR,则如果不是同一个四元组连接,在2MSL之内端口可以重新使用。

论坛徽章:
0
8 [报告]
发表于 2003-05-30 16:01 |只看该作者

键盘兄请进!TCP状态机的实现问题。

谢谢楼上的两位!

我现在想实现以下的设计:
客户端访问服务器,服务器发送相应的数据(网页)给客户端,然后客户端在HTTP主体中发送信息给服务器(比如客户端按下网页某个选择按钮,要求服务器执行某个动作),请问TCP状态机该怎样处理?服务器是主动关闭好还是被动关闭好?谢谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2003-05-30 16:12 |只看该作者

键盘兄请进!TCP状态机的实现问题。

为了降低服务压力,可以让服务器主动关闭,如果在关闭后操作能够预知的话,用shutdown。

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

论坛徽章:
0
10 [报告]
发表于 2003-05-30 16:27 |只看该作者

键盘兄请进!TCP状态机的实现问题。

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

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

谢谢键盘大哥!
还有一个问题:因为不知道客户端什么时候提交信息给服务器,所以想当服务器发送数据(网页)给客户端后就关闭连接(服务器主动关闭),等客户端提交信息后双方再建立连接,然后服务器再发送数据给客户端,请问这样可以吗?
还有如果前后两次连接的ISN一样,会出现什么后果?谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP