TCP状况

TCP(传输操控协议)是一种面向衔接的、牢靠的传输协议,它界说了一套状况转化进程来办理通讯的衔接状况。以下是TCP状况转化的常见进程:

  1. CLOSED状况:初始状况,表明没有任何衔接存在。

  2. LISTEN状况:服务端进入此状况,等候客户端的衔接请求。

  3. SYN_SENT状况:客户端发送SYN(同步)包后进入此状况,表明请求衔接。

  4. SYN_RECEIVED状况:服务端接纳到客户端的SYN包后进入此状况,并发送回一个SYN和ACK(应对)包。

  5. ESTABLISHED状况:客户端收到服务端的SYN+ACK包后,发送一个ACK包承认衔接,进入此状况,表明衔接已建立。

  6. FIN_WAIT_1状况:自动封闭衔接的一方发送FIN(结束)包后,进入此状况,等候对方承认。

  7. CLOSE_WAIT状况:被迫封闭衔接的一方接纳到FIN包后,进入此状况,表明需求封闭衔接。

  8. FIN_WAIT_2状况:自动封闭衔接的一方等候对方发送ACK包的承认。

  9. LAST_ACK状况:被迫封闭衔接的一方发送ACK承认包后,进入此状况,等候对方的最终承认。

  10. TIME_WAIT状况:自动封闭衔接的一方接纳到对方最终承认后,进入此状况,等候一段时刻后开释衔接。

  11. CLOSED状况:最终一个ACK包发送完结后,衔接正式封闭,回到初始状况。

这些状况转化是TCP衔接的常见进程,通过这些状况的改变,TCP协议可以完结牢靠的、面向衔接的数据传输。

TCP状况转化图

TCP状态转换

TCP状态转换

TCP状态转换

TCP状况转化的典型流程如下:

  1. 服务端启动并进入LISTEN状况,等候客户端的衔接请求。

  2. 客户端建议衔接请求,向服务端发送SYN包。

  3. 服务端接纳到SYN包后,会发送SYN+ACK包作为应对。

  4. 客户端接纳到SYN+ACK包后,发送ACK包来承认衔接。此刻,衔接现已建立,进入ESTABLISHED状况。

  5. 数据传输阶段:在衔接建立的基础上,客户端和服务端进行数据的发送和接纳。

  6. 封闭衔接:当任一方决议封闭衔接时,会发送一个FIN包来表明结束。

  7. 接纳方收到FIN包后,会发送一个ACK包作为承认。

  8. 发送方接纳到ACK包后,进入FIN_WAIT_2状况,等候接纳方的最终承认。

  9. 接纳方发送完最终承认后,进入LAST_ACK状况,等候发送方的最终承认。

  10. 发送方收到接纳方的最终承认后,发送最终一个ACK包。

  11. 接纳方收到发送方的最终ACK包后,进入TIME_WAIT状况,等候一段时刻(通常是2倍的最大报文段生计时刻)。

  12. 彻底封闭衔接:在通过等候时刻后,接纳方封闭衔接并进入CLOSED状况。

这是TCP衔接的根本流程,通过这样的状况转化,两边可以进行牢靠的数据传输,并可以正确封闭衔接。这种面向衔接的机制保证了数据的牢靠性和次序性。

TIME_WAIT状况必要性

TIME_WAIT状况在TCP衔接的封闭进程中起着重要的作用,虽然它可能会引起一些人的疑问,但它是必要的。以下是TIME_WAIT状况的几个重要原因:

  1. 保证牢靠的衔接封闭:在TCP衔接封闭后,TIME_WAIT状况答应保证衔接正常终止。在此状况下,它答应相应的ACK包在网络中彻底传输和处理,以保证两边都已彻底封闭衔接。

  2. 牢靠处理重复数据包:TIME_WAIT状况继续一段时刻,可以处理在该状况下可能抵达的重复数据包。重复数据包可能在网络中停留并在一段时刻后抵达,因此TIME_WAIT状况可以正确处理这些数据包,避免与之前的衔接混淆。

  3. 答应端口重用:TIME_WAIT状况保证在相同的本地端口上从头创立衔接时不会出现抵触。如果没有TIME_WAIT状况,新衔接可能会与以前的衔接混淆,导致数据错乱或衔接复用问题。通过等候一段时刻,保证旧衔接彻底封闭后,可以安全地运用相同的端口。

  4. 避免”失序的衔接”问题:TIME_WAIT状况还可以防止来自前期衔接的数据传输到新的衔接中,从而避免了错误的数据传输和衔接失败等问题。

虽然TIME_WAIT状况可能会在一段时刻内占用一些系统资源并导致可用端口数削减,但它是保证TCP衔接正常封闭和保护衔接牢靠性的重要机制。它帮助避免衔接抵触和数据混乱,使TCP协议可以稳定和牢靠地作业。

端口复用

setsockopt()函数的原型如下:

#include <sys/types.h>
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

参数说明如下:

  1. sockfd套接字文件描述符,用于指定需求设置选项的套接字。

  2. level:选项的等级,用于指定选项所属的协议族或套接字类型。常见的选项等级有:

    • SOL_SOCKET通用套接字选项,适用于一切协议族。
    • IPPROTO_TCP:TCP协议特定选项。
    • IPPROTO_IP:IP协议特定选项等。
  3. optname:选项的称号,用于指定要设置的详细选项。常见的选项包括:

    • SO_REUSEADDR:答应重用本地地址
    • SO_KEEPALIVE:启用保持活动检测。
    • TCP_NODELAY:禁用 Nagle 算法,进步小数据包的实时性等。
  4. optval:指向存储选项值的缓冲区的指针。

  5. optlen:选项值的长度。

函数回来值为0表明设置选项成功,回来-1表明设置失败,并设置相应的错误码。

TCP状态转换

 int opt = 1;
 setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

close和shutdown

shutdown()close()都是用于处理网络套接字(socket)的函数,它们在TCP衔接的封闭进程中扮演不同的角色。

  1. shutdown(): shutdown()函数用于封闭套接字的读取或写入功用或两者一起封闭。它供给了对TCP衔接进行精密操控的能力。shutdown()函数有两个参数:套接字描述符和封闭的方向。封闭方向可以是以下三个值之一:

    • SHUT_RD:封闭套接字的读取功用,也便是禁止从套接字中读取数据。
    • SHUT_WR:封闭套接字的写入功用,也便是禁止向套接字写入数据。
    • SHUT_RDWR:一起封闭套接字的读取和写入功用。 例如,shutdown(sockfd, SHUT_WR)会封闭套接字的写入功用,表明不再向套接字发送数据。
  2. close(): close()函数用于彻底封闭套接字衔接。当调用close()时,套接字会被立即封闭并开释相关资源。现已封闭的套接字不能再进行读取或写入操作。close()函数只需求一个参数,即套接字描述符,例如close(sockfd)就会封闭套接字。

在封闭TCP衔接进程中,通常会先运用shutdown()函数进行半封闭操作,然后再调用close()函数彻底封闭衔接。半封闭的作用是答应一方继续接纳对方发送的数据,一起暗示两边现已完结他们的任务,预备封闭衔接。彻底封闭衔接后,网络套接字会被彻底开释。

需求注意的是,封闭套接字后,套接字描述符在当前进程中将不再可用,无法再运用对应的套接字进行网络通讯。如果需求继续进行网络通讯,必须从头创立一个新的套接字。

总结来说,shutdown()函数用于封闭套接字的读取或写入功用,供给对TCP衔接的精密操控;而close()函数用于彻底封闭套接字衔接,开释相关资源。在TCP衔接的封闭进程中,通常会先进行半封闭操作,然后再彻底封闭衔接。