调用 close(clientsocket)
然后用sniffer抓包,本以为客户段会发一个fin包,发现客户端发的是rst包;
,请问什么时候调用close关闭套接字会发送fin,两种包有什么不同呢?谢谢

解决方案 »

  1.   

    shutdown——半关闭:shutdown端发送fin包,接收到fin包端仍可以发送数据,所以MSDN上说shutdown是“从容关闭”,就是限制自己发送数据的同时,接收网络未及时接收到的数据close——全关闭:双方都不能接收和发送数据
    终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端几经终止了那个方向的数据传送。发送F I N通常是应用层进行关闭的结果。收到一个F I N只意味着在这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的TCP应用程序这样做。正常关闭过程如图1 8 - 3所示。我们将在1 8 . 5节中详细介绍半关闭。首先进行关闭的一方(即发送第一个FIN)将执行主动关闭,而另一方(收到这个FIN)执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭,