从TCP协议的角度来看,有两种
方法可以
关闭构建的TCP
连接。一种是正常关闭,即四次关闭连接,另一个是关闭重置。我们通常称之为连接重置。
首先,让我们讨论一下正常关机时四波状态的变化。状态变化的主动方关闭连接是fin_wait_1 -> fin_wait_2 -> time_wait,而状态改变被动方紧密连接close_wait -> last_ack -> time_wait.during四波过程中,ACK包的协议栈自动完成,而必须用鳍包closesocket或关闭应用层发送。在正常关闭连接,recv会返回0值,并将会得到
错误代码10058。
此外,在我们的日常应用中,我们的日常应用中有很多异常关闭,例如,
应用程序被迫关闭,
本地网络突然中断(丢弃网卡、网络电缆
退出)、程序
处理不合适等,都将导致连接重置。当连接重置时,将生成RST包。同时,在没有收到网络缓冲区的数据将丢失。连接后复位,发送或接收的党将得到错误代码10053(closesocket是10038),对方收到会得到错误代码10054,并将会得到错误代码10053(closesocket 10054)。
操作系统为我们提供了两个
函数关闭一个TCP连接,分别closesocket和
关机。通常
情况下,closesocket发送一个FIN报文给对方,但也有例外。比如,一个
工作线程调用recv接收数据。同时,外部closesocket被调用,从而导致连接复位和发送一个RST包的另一面。第一个包由该方自身生成。
关机可用于关闭连接在指定的方向。这个函数接受两个
参数,一个是插座,另一是封闭的方向,可利用价值sd_send,sd_receive和sd_both.when方向值sd_send,无论什么样的插座是国家(recv阻塞或空闲状态),它将发送一个FIN报文给对方,并注意到这一点和closesocket之间的
区别。在晚会进入fin_wait_2状态的这段时间,在close_wait状态,各方仍可以调用recv接收数据;方向值sd_receive,双连接状态没有改变,仍然在既定的状态,各方仍可以发送数据,但是,如果人调用Send方法,连接将被立即复位,并发送一个RST PAckage彼此,RST包是被动的注意和closesocket之间的差异。