注册 登录
编程论坛 Linux教室

简述 TCP 连接中的 half-close 状态

madfrogme 发布于 2012-11-11 22:25, 1860 次点击
TCP Half-close 状态可以通过指定shutdown() 函数的第二个参数,SHUT_WR  或者是 SHUT_RD

来实现 而不是使用close() 函数, 但这个特性很少被应用程序使用。 为什么需要half-close

举个例子

 sun  % rsh bsdi sort < datafile

上面一行命令的的意思是从 sun 机器上连接到 bsdi ,

然后在 bsdi 上执行 sort 命令, 而datafile则是从 本地(sun)传到bsdi上的。

 因为sort 程序需要等到datafile 全部传到bsdi 上之后才可以执行排序操作

所以当sun 把文件传完之后(到达end-of-file),

就可以对这个TCP连接执行half-close 操作了(shutdown, 发送一个FIN)

因为执行half-close 操作之后还是可以读 从bsdi上发来的结果。 所以sort 结束之后把结果发送给sun,

结果发送完毕之后,bsdi就可以执行close()操作(发送FIN),这样TCP连接就完全被断开了
2 回复
#2
madfrogme2012-11-12 19:34
检测Half-Open

对于一个TCP 连接来说, Half-Open 就是一个连接的其中任何一端突然关闭或突然退出,

都没来得及给对方发送一个FIN,

比如  bsdi % telnet svr4 discard

从bsdi 连入svr4 的discard 服务, 发送若干条消息之后,

服务器svr4突然crash 了(突然断电), 然后重启, 总共花掉190秒,

bsdi因为在此期間没有再发消息, 所以对此毫不知情,

当svr4重启之后,bsdi再次向svr4发送消息, 这时svr4 就会用一个Reset 来回应bsdi

当然回应之前, 因为svr4的重启了,ARP 缓存已经丢失, 在用Reset回应bsdi之前

它还会发送一个ARP request

1