TCP连接一旦建立,服务器端和客户端就成为了对等关系,任何一方都可以发出关闭握手请求,甚至可以同时发出关闭握手请求。TCP的连接建立需要3次握手,而正常关闭则需要4次握手。
1、主动关闭的一方A调用close(),SendQ不再接收send()写入信息,在SendQ队列的最后,向被动关闭的一方发送TCP的IP数据报作为关闭握手的请求。这个数据报中包含着标志FIN,也包含着此刻的字节序号m。
2、B接收到第一次关闭握手请求后马上返回一个数据报作为回应。因为B接收到了FIN作为关闭连接的一个字节的数据,所以返回的字节序号是m+1。当A接收到B的这个回应,也即是第二次握手以后,表明确认在A到B的方向上不再有数据传送,A即转入所谓半关闭状态,等待B的关闭请求。而B收到FIN会导致recv()返回零,让应用层知道A到B的连接已经断开。
3、B方通知了应用层后也就进入等待关闭的状态。当B开始进入关闭流程,也会由B向A发送一个FIN,同时包含着B到A通讯方向上此刻的字节序号n。
4、A接收到B的这个FIN之后,也会将序号n+1反馈给B,自此,表明B到A的方向上不再有数据传送,TCP连接正式成功关闭。
以上只是对TCP连接关闭的简单描述,事实上,除了使用close()关闭,还可以使用shutdown(),这样在“半关闭”状态下还可以对TCP做其他的利用,具体内容就请大家自己查阅相关资料了。
最后,送上本人对于TCP连接的理解——“双向的单行道”——分别建立连接,也分别断开连接。
posted on 2010-06-07 20:58
lf426 阅读(2927)
评论(0) 编辑 收藏 引用 所属分类:
SDL入门教程 、
socket 编程入门教程