呵呵呵呵呵

萝莉有三好,柔体 轻音 易推倒。女神有三宝,干嘛 呵呵 去洗澡。宅男有三好:Dota 基友 破电脑。


TCP连接的半连接与半关闭

TCP连接的半连接与半关闭

TCP本身是全双工(Full-Duplex)的协议,这就是“全”的概念。而“半”就允许TCP把自己当做单工的来使用,这就是半开与半关闭的概念。
单工就相当于二极管,数据只能从一端流向另一端。全双工就相当于一个完整的电路,数据可以从A流到B,也可以从B流动会到A,他们甚至还可以同时进行。这篇文章要用到的概念就是这俩。当然还有半双工的概念,虽然这篇文章没用到。它相当于一条导线,数据可以从A流到B,也可以从B流动会到A,但是不能同时进行。
在NodeJS的文档的net部分可以找到关于halfOpen的资料(见 net.createServer http://nodejs.org/api/net.html#net_net_createserver_options_connectionlistener)。
其中有这样一段描述: 如果allowHalfOpen为true,在连接的另一端发送FIN包时socket不会自动发送FIN包。它为被标识为不可读但可写的状态。
     把socket标识为可写不可读的状态就意味着它并没有断开,只是认为对方告诉自己将不再发送数据了而已。

By default (allowHalfOpen == false) the socket will destroy its file descriptor once it has written out its pending write queue. However, by setting allowHalfOpen == true the socket will not automatically end() its side allowing the user to write arbitrary amounts of data, with the caveat that the user is required to end() their side now.


如果是Socket程序,就需要手动调用方法去关闭这个连接,否则它会一直工作。有些恶意攻击的程序就利用这个机制让没有限制半开连接的服务器打开大量的半开连接,使对方的连接数消耗殆尽。所以很多操作系统都自带了半开连接数的使用限制。
    

这里要着着说一下半关闭的概念,在TCP断开连接的四次分手过程中:

    第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
    第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
    第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;
    第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

那么,为什么要四次分手呢?

注意注意:TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;

更多内容:

网络性能测量概述与netperf测量工具使用方法
VC6工程升级VS2015遇到的问题解决办法
bcb 获取程序命令行CmdLine参数
Linux内核模块操作相关命令depmod,lsmod,modinfo,insmod,rmmod,mdprobe
php 使用soap方式提供web service

本文链接地址:http://www.hehehehehe.cn/i/771.html