在因特网协议族中,TCP层是位于IP层之上,应用层之下的传输层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。今天小编要给大家分享一篇教程,那就是:学习关闭TCP连接的相关知识。
传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transportlayer)通信协议,由IETF的RFC793说明(specified)。从TCP协议这一个角度来看的话,一个已经建立的TCP连接有两种关闭方式,一种是正常关闭,也就是四次挥手关闭连接;另外还有一种就是异常关闭,一般情况下我们都会将其称之为连接重置(也就是RESET)。
一、四次挥手的状态变迁
首先小编先和大家说一下正常关闭的时候四次挥手的状态变迁,关闭连接的主动方状态变迁如下所示:FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT,而关闭连接的被动方的状态变迁如下所示:CLOSE_WAIT->LAST_ACK->TIME_WAIT.在四次挥手过程里面ACK包都是由协议栈(协议栈是指网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程:由上层协议到底层协议,再由底层协议到上层协议)自动完成的,然而FIN包就一定要由应用层通过closesocket或者是shutdown主动发送。
一般情况下连接正常关闭以后,recv就会得到返回值0,另外一个方面send也会得到错误码10058。除此之外,在我们的日常应用里面,连接异常关闭的情况也非常多。就比如说:应用程序被强行关闭、本地网络突然中断(也就是禁用网卡、网线拔出)、应用程序处理不当等等都会导致连接重置的情况发生,大家在连接重置的时候将会产生RST包,同一时间网络缓冲区里面未接收(或者是发送)的数据都将会丢失。当连接重置以后,本方send或者是recv就会得到错误码10053(closesocket的时候是10038),对方recv会得到错误码10054,send则得到错误码10053(closesocket的时候是10054)。
二、关闭TCP连接
在这里大家可以看到,操作系统为我们提供了两个函数来关闭一个TCP连接,这两个函数分别是closesocket以及shutdown.。在一般情况下面,closesocket就会向对方发送一个FIN包,但是也会有例外的哟。就比如说:有一个工作线程正在调用recv接收数据,在这个时候外部调用closesocket,就会导致连接重置的情况出现,同一时间向对方发送一个RST包,这一个RST包正正就是由本方主动产生的。
另外一个方面shutdown能够直接用来关闭指定方向的连接,这一个函数接收两个参数,一个参数是套接字,另外一个参数就是关闭的方向,可用值为SD_SEND,SD_RECEIVE以及SD_BOTH这两者方向取值为SD_SEND的时候,无论socket处于什么状态(recv阻塞,或者是空闲状态),都会向对方发送一个FIN包,在这里大家都需要注意这一点与closesocket之间的区别。在这个时候本方进入FIN_WAIT_2状态,那么对方就会进入到CLOSE_WAIT这一个状态了,本方依然能够直接调用recv接收数据;方向取值为SD_RECEIVE的时候,大家可以发现双发连接状态依然还是没有任何的改变,还是处于ESTABLISHED的状态,本方依然能够直接send数据。但是小编想说的是,假如说对方再一次调用send方法的话,那么连接就会被立即重置,同一时间还会向对方发送一个RST包,这一个RST包就是被动产生的,但是在这里的话,大家依然还是需要注意这与closesocket之间的区别哟。
小编结语:
通过这篇考试认证教程,不知道大家是否已经学会了关闭TCP连接的相关知识呢?如果还是不太懂,可以看多几遍教程哟,毕竟思科认证还是一种较为受欢迎的考试认证。编程学习网教育每天更新不同的教程,一起来学习吧。