精华内容
下载资源
问答
  • linux 关闭特定tcp连接
    2021-05-18 00:25:51

    tcp-keepalive 是什么

    1. tcp-keepalive,顾名思义,它可以尽量让 TCP 连接“活着”,或者让一些对方无响应的 TCP 连接“宣告死亡”。

    2. 一些特定环境,防火墙会自动断开长期无活动的 TCP 连接,tcp-keepalive 可以在连接无活动一段时间后,发送一个空 ack,使 TCP 连接不会被防火墙关闭。

    3. 一些时候,对方的服务器可能出现宕机或者网络中断等问题, tcp-keepalive 可以帮助断开这些无响应的连接。

    4. tcp-keepalive 需要在应用程序层面针对其所用到的 Socket 进行开启。操作系统层面无法强制所有 socket 启用 tcp-keepalive. (本文在 CentOS/RHEL 6/7 环境进行测试)

    Linux 中的相关参数

    在 Linux 中,可以以下3个参数来调整 tcp-keepalive:

    net.ipv4.tcp_keepalive_time = 30

    net.ipv4.tcp_keepalive_probes = 2

    net.ipv4.tcp_keepalive_intvl = 5

    1. 距离 TCP 最后一次活动后,等待 tcp_keepalive_time (30s),之后触发 TCP keepalive 的 probe 行动。

    2. 如果 probe 没有得到对方回应,则每隔 tcp_keepalive_intvl (5s) 进行一次重试。一共发送 tcp_keepalive_probes (2个) probe.

    Probe 实际上是向对方发送一个 ack,这个 ack 包不带实际数据。

    如何启用 TCP Keepalive

    tcp-keepalive 需要在应用程序层面启动。以 C 语言为例,首先应用程序会创建一个 socket:

    /* Create the socket */

    if((s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {

    perror("socket()");

    exit(EXIT_FAILURE);

    }

    然后为这个 socket 添加 SO_KEEPALIVE 选项,即可启用 tcp-keepalive:

    if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {

    perror("setsockopt()");

    close(s);

    exit(EXIT_FAILURE);

    }

    我们可以参考 openssh-server. 它默认开启了 tcp-keepalive:

    # man 5 sshd_config

    TCPKeepAlive

    Specifies whether the system should send TCP keepalive messages to the other side. If they are sent, death of the connection or crash of one

    of the machines will be properly noticed. However, this means that connections will die if the route is down temporarily, and some people

    find it annoying. On the other hand, if TCP keepalives are not sent, sessions may hang indefinitely on the server, leaving “ghost” users and

    consuming server resources.

    The default is “yes” (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. This

    avoids infinitely hanging sessions.

    To disable TCP keepalive messages, the value should be set to “no”.

    从 openssh-server 的源码中,我们可以看到它使用了 SO_KEEPALIVE 选项:

    /* openssh-5.3p1/sshd.c */

    1774 /* Set SO_KEEPALIVE if requested. */

    1775 if (options.tcp_keep_alive && packet_connection_is_on_socket() &&

    1776 setsockopt(sock_in, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)) < 0)

    1777 error("setsockopt SO_KEEPALIVE: %.100s", strerror(errno));

    查看 tcp-keepalive 状态

    我们可以用 `# netstat -no` 命令来查看当前哪些 tcp 连接开启了 tcp keepalive.

    [root@rhel674 ~]# netstat -no | grep ESTAB

    tcp 0 0 192.168.122.91:22 192.168.122.1:52646 ESTABLISHED keepalive (3187.25/0/0) <

    参考文档

    更多相关内容
  • 可以在Linux系统中使用netstat命令来查看TCP连接状态。简介TCP(Transmission Control Protocol)传输控制协议是一种标准,它定义了如何建立和维护两个系统之间的网络会话,以促进应用程序之间的数据交换,Internet...

    可以在Linux系统中使用netstat命令来查看TCP连接状态。

    简介

    TCP(Transmission Control Protocol)传输控制协议是一种标准,它定义了如何建立和维护两个系统之间的网络会话,以促进应用程序之间的数据交换,Internet协议(IP)定义了系统如何相互发送数据包。

    Linux中的TCP状态列表

    下面是可以在Linux中使用netstat或ss命令(ss命令_Linux ss命令使用详解:获取socket统计信息)查看的TCP连接状态列表:

    957ace792d31fa767c7f860fc781b2b2.png

    检查程序TCP状态

    使用以下命令检查Linux服务器上的所有应用程序TCP状态,它将为你提供每种状态下的进程数:

    # netstat -nat | awk '{print $6}' | sort | uniq -c | sort -r

    aebed35416c5f65a548fa5112062a67a.png

    通过将输出传递给grep来获取特定状态的进程列表

    例如,要使进程处于CLOSEWAIT状态,请使用# netstat -apn | grep CLOSE_WAIT,可以进一步过滤此输出以获取处于CLOSEWAIT状态的进程的进程ID:

    netstat -apn | grep CLOSE_WAIT | awk '{ print $7 }' | sort | uniq -c | sort -nr

    使用head将输出限制为前10个进程

    如果要使用CLOSE_WAIT TCP连接状态将输出限制为前10个进程,请使用head:

    # netstat -apn | grep CLOSE_WAIT | awk '{ print $7 }' | sort | uniq -c | sort -nr | head -n 10

    8f2cf28c6e5a3a245537840c4749f737.png

    上图中,表明ID为8166的进程具有3856个CLOSE_WAIT连接状态。

    如果缺少TCP连接或进行故障排除,则可能需要使用大量CLOSE_WAIT连接状态来识别此过程,这可能意味着应用程序不会按预期关闭连接:

    # ps 8166

    d780afc80d0b81bb5a2e0c68c05c38ab.png

    识别TCP连接状态的计数以及CLOSE_WAIT中具有多个状态的进程脚本

    我创建了一个简单的bash脚本,它使用netstat命令来识别TCP连接状态的计数以及CLOSE_WAIT中具有多个状态的进程:

    #!/bin/bash

    # Script to print Linux TCP connections using netstat

    # Guthub: https://github.com/jmutai

    #

    #    vvvv vvvv-- the code from above

    RED='3[0;31m'

    NC='3[0m' # No Color

    echo ""

    echo -en "${RED} ALL TCP Connections Count: ${NC}\n"

    netstat -nat | awk '{print $6}' | sort | uniq -c | sort -r

    echo ""

    echo -en "${RED} Top CLOSE_WAIT state TCP Connections: ${NC}\n"

    netstat -apn | grep CLOSE_WAIT | awk '{ print $7 }' | sort | uniq -c | sort -nr | head -n 10

    输出内容如下:

    e8046ab50ce2a0f4e9ba79e1b3350980.png

    相关主题

    展开全文
  • TCP连接中的异常断开情况处理

    千次阅读 2021-05-15 17:58:33
    1.TCP连接中可能出现的异常断开情况假设存在这样一种情况:在两个不同的主机Machine1、Machine2系统上分别运行两个应用程序Application1、Application2,在Application1与Application2的进程中存在一个TCP链接...

    1.TCP连接中可能出现的异常断开情况

    假设存在这样一种情况:在两个不同的主机Machine1、Machine2系统上分别运行两个应用程序Application1、Application2,在Application1与Application2的进程中存在一个TCP链接TCPLink。它们的实际传输取决于物理链路的沟通PhysiLink。

    图一:TCP通信情况模拟图

    1.1程序/进程异常

    如果TCPLink异常而Application1正常,TCPLink会被关掉并且告诉Application2,Application2也就关闭了该异常的TCPLink。这种情况会在TCPLink异常后的一次Socket调用中通过返回值(C/C++)或者异常代码(C#)得知。因此在做程序开发的时候比较容易处理。

    1.2物理链路异常

    如果出现Machine1或者Machine2任何一个系统死机:假设Machine1系统异常,此时Machine2无法知道此TCP连接的失效,并一直认为连接正常。如果网络硬件故障(如网线拔掉、交换机断电):Machine1与Machine2都无法知道此TCP连接的失效,并一直认为连接正常。

    以上这两种情况在编程时会变的非常糟糕,因为TCP连接将一直被认为有效,所有对此TCP Socket的调用都会正确返回,这显然是错误的。并且这种错误情况通常会持续很久。

    2.异常断开情况影响分析

    对于程序/进程异常,由于Socket调用中可以得到返回值。因此在做程序开发的时候比较容易处理。

    对于物理链路异常,如果Machine1系统异常,如果Application2是FTP之类的服务器程序倒也无妨(一个连接存在时间比较长对它没有多大影响),如果是需要实时知道连接用户状态的即时通讯类服务器或者Application2是客户端则就会产生一系列的问题了。如果Machine1与Machine2都异常,Application1和Application2都会一直等下去,两端需要进行相似的处理。

    3.异常断开情况的判断与处理

    对于这种情况在MSDN里面是这样处理的,原文如下:

    如果您需要确定连接的当前状态,请进行非阻止、零字节的Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。

    但是,在试验中发现,这种处理方法在很多时候根本无效,尤其对发生在物理链路层上的问题,很多情况下无法检测出网络已经异常断开了。

    下面探讨一下能够使用的判断与处理方式以及优缺点。

    3.1定时发送简单约定帧

    一般是服务器程序和客户端程序达成某种协议,客户端定时向服务器发送很小的数据包,即约定的简单帧,来告诉自己的状态,而服务器端程序则需要在每次收到用户的后更新用户超时的时间计数,当用户的时间计数超过指定时间,就可以认为这个用户已经系统异常终止,而终止之间的连接,并转告其他用户。客户端也可以通过接收服务器端返回的小数据包来判断服务器端的状态。

    3.2Ping + Send/Receive

    用Ping命令来判断网络本身状态,即确定物理链路层的状态。同时,用应用程序层的Send和Receive来进行程序/进程异常的判断。通过这两种方式的组合,一般能够正确得到网络的状态。当网络发生故障时,能够准确的定位其状态。

    但是,当网络正常、应用程序正常时,对端的操作系统的设置可能会影响上述判断。即,当对端禁止向其发送Ping命令时,我们Ping的结果将始终为不通。考虑这种情况下,该方法存在一定的缺陷。

    3.3KeepAlive-Timer

    由于在应用层进行判断存在各种困难,那么是否可以考虑使用TCP底层的一些特性呢?通过思考,我想到可以利用TCP底层协议的KeepAlive-Timer进行网络状态的判断。但是需要改造。通过改造后,这将是一个比较可靠的判断方式。这将在下面作为重点单独介绍。

    4.KeepAlive-Timer

    4.1 TCP/IP协议结构以及底层定时器

    网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统。

    图二:TCP/IP协议族的四个层次以及不同层次的协议

    上面的每一层分别负责不同的功能。链路层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理传输媒介(如网线)的物理接口细节。网络层,处理分组在网络中的活动。运输层主,要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP和UDP。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。应用层,负责处理特定的应用程序细节。

    关键点:应用程序位于应用层,TCP协议在运输层,在数据流从运输层传递到链路层的过程中,TCP协议本身的底层实现正是我们要利用的所在。

    TCP协议在实现的时候为每条连接建立了七个定时器。按照它们在一条连接生存期内出现的次序,分别为:connection establishment timer(连接建立定时器)、retransmission timer(重传定时器)、delayed ACK timer(延迟ACK定时器)、persist timer (持续定时器)、keepalive timer(保活定时器)、FIN_WAIT _ 2 timer、TIME_WAIT timer。

    4.2KeepAlive-Timer (保活定时器)

    在《TCP/IP协议详解 卷2:实现》中,这样描述KeepAlive-Tmer:

    KeepAlive-Tmer在应用进程选取了Socket的SO_KEEPALIVE选项时生效。如果连接的连续空闲时间超过2小时,保活定时器超时,向对端发送连接探测报文段,强迫对端响应。如果收到了期待的响应, TCP可确定对端主机工作正常,在该连接再次空闲超过2小时之前,TCP不会再进行保活测试。如果收到的是其他响应,TCP可确定对端主机已重启。如果连续若干次保活测试都未收到响应,TCP就假定对端主机已崩溃,尽管它无法区分是主机故障(例如,系统崩溃而尚未重启),还是连接故障(例如,中间的路由器发生故障或电话线断了)。

    4.3KeepAlive-Timer工作机理分析

    5.3.1保活定时器在2小时空闲后超时

    收到一个报文段后,将复位连接的保活定时器,重设为2小时,并清零连接的空闲计数器。如果保活定时器超时(收到最后一个报文段2小时后),并且置位了Socket的保活选项,则TCP将向对端发送连接探测报文段。如果定时器超时,且未置位Socket的保活选项,则TCP将只复位定时器,重设为2小时,不向对端发送连接探测报文段。当然,如果应用进程调用了close,即使连接已空闲了2小时,TCP也不会发送连接探测报文段。

    5.3.2进行保活测试

    当保活定时器发送连接探测报文后,如果对端无响应,TCP最多以75秒的间隔发送9个连接探测报文段。TCP在确认连接已死亡之前必须发送多个连接探测报文段的一个原因是,对端的响应很可能是不带数据的纯ACK报文段,TCP无法保证此类报文段的可靠传输,因此,连接探测报文段的响应有可能丢失。如果连接总的空闲时间大于或等于2小时加10分钟,连接将被丢弃。从0秒起,每隔75秒连续9次发送连接探测报文段,直至600秒。675秒时(定时器2小时超时后的11.25分钟)连接被丢弃。

    图三:保活定时器判断对端是否可达

    4.4利用KeepAlive-Timer

    通过上面的分析知道,如果在2个小时没有数据传送,TCP协议会给对端发送一个Keep-Alive数据报,使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号,对端如果收到这个数据,回送一个TCP的ACK,确认这个字节已经收到,这样就知道此连接没有被断开。如果一段时间没有收到对方的响应,会进行重试,每隔75秒探测一次,重试9次后,没有收到回应的话,就会断开这个连接。

    但2个小时对于我们的项目来说显然太长了。我们必须缩短这个时间。

    我们要做的就是,在TCP认为的空闲2小时到达之前,模拟keepAlive-Timer的数据结构,使其按照我们的要求空闲时间、探测间隔来判断TCP的连接状态。

    通过利用Socket类的IOControl()函数可以达到上述的目的:在C#中,其语法为: public int IOControl ( IOControlCode ioControlCode, byte[] optionInValue, byte[] optionOutValue )其中主要参数的意义如下:ioControlCode:一个 IOControlCode 值,它指定要执行的低级操作模式的控制代码。optionInValue:Byte 类型的数组,包含操作要求的输入数据。

    将IOControlCode的值设置为KeepAlive就可以得到对该操作的控制。对于inOptionValues的定义,可以通过查找Wsocket2的文档找到答案:它是一个如下的结构体:

    Struct tcp_keepalive

    {

    u_long onoff; //是否启用Keep-Alive

    u_long keepalivetime;  //多长时间后开始第一次探测(单位:毫秒)

    u_long keepaliveinterval; //探测时间间隔(单位:毫秒)}

    在C#中,将一个tcp_keepalive结构的内容按照顺序写入Byte数组中,然后传递给IOControl函数,我们就可以使用该函数来对网络状态进行准确的判断了。

    可以这样使用:在发送数据前,使用IOControl来确保物理层的状态正确,如果不正确,则通过异常捕获来得到断开的信息,然后进行必要的信息显示,主备切换等工作。

    展开全文
  • Linux下的TCP套接字编程

    千次阅读 2021-12-23 19:22:01
    Linux下的TCP套接字编程 客户端 基本流程 创建socket套接字 设置与服务器ip和服务器端口相关的数据结构 连接服务器 服务器端 基本流程 创建socket套接字 设置与服务器ip和服务器端口相关的数据结构 绑定套接字和...

    客户端

    基本流程

    创建socket套接字

    //函数原型
    #include<sys/types.h>
    #include <sys/socket.h>
    int socket(int family, int type, int protocol);
    /*返回值
    成功:非负描述字,即非负整数值,称为套接字。同文件描述符类似
    出错:-1*/
    /*参数
    family:协议族,一般都是AF_INET(ipv4协议)或者PF_INET6(ipv6协议)
    type:套接字通信类型,一般是SOCK_STREAM(tcp)或者SOCK_DGRAM(udp)
    protocol:制定某个协议的特定类型,一般设置为0
    */
    

    设置与服务器ip和服务器端口相关的数据结构

    #include <netinet/in.h>
    struct in_addr {
       in_addr_t 		s_addr;
    };
    struct sockaddr_in {
       uint8_t          	sin_len;//地址结构长度
       sa_family_t      	sin_family; //协议族,与socket函数第一个参数相同
       in_port_t        	sin_port; //端口号
       struct in_addr   	sin_addr; //IP地址
       char             	sin_zero[8]; //填充字段
    }; 
    sockaddr_in serverAddress;
    //使用前要将其清零
    memset(&serverAddress, 0, sizeof(sockaddr_in);
    //端口赋值
    serverAddress.sin_port = htons(4000);//使用htons()函数是因为主机字节序列(小端)和网络字节序列(大端)不同
    //服务器ip地址赋值
    #include <arpa/inet.h>
    int inet_aton(const char* strptr, struct in_addr *addrptr);//将strptr指向的字符串,转换成32位的网络字节序二进制值,并存储在addrptr指向的结构体中
    in_addr_t inet_addr(const char* strptr); //将strptr指向的字符串,转换成32位的网络字节序二进制值,将其作为返回值返回
    serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
    int inet_pton(int family, const char* strptr, void *addrptr);//addrptr:转换strptr指向的字符串,将网络字节序的二进制值,存储在addrptr指向的内存
    //通常addrptr指向sockaddr_in或sockaddr_in6
    inet_pton(AF_INET, strServerIP, &serverAddress.sin_addr)
    
    

    连接服务器

    //函数原型
    #include <sys/socket.h>
    int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
    connect(nClientSocket, (sockaddr*)&ServerAddress, sizeof(ServerAddress))
    /*
    connect激发TCP的三路握手过程;仅在连接建立成功或出错时才返回
    其中错误有以下几种情况:
    如果客户没有收到SYN分节的响应(总共75秒,这之间需要可能需要重发若干次SYN),则errno被设置为ETIMEDOUT(等于110)。
    如果对客户的SYN的响应是RST,则表明该服务器主机在该端口上没有进程在等待。errno被设置成ECONNREFUSED(等于111);
    如果客户发出的SYN在中间路由器上引发一个目的地不可达ICMP错误,则如第一种情况,连续发送SYN,直到规定时间仍未收到响应,则errno被设置成EHOSTUNREACH(113)或ENETUNREACH(101)。
    如果函数connect失败,则套接字不可再用,必须关闭。不能再对此套接字再调用函数connect。
    */
    

    服务器端

    基本流程

    创建socket套接字

    同客户端

    设置与服务器ip和服务器端口相关的数据结构

    同客户端

    ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY);//设置为本地ip
    

    绑定套接字和服务器ip及端口

    int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
    bind(nListenSocket, (sockaddr *)&ServerAddress, sizeof(sockaddr_in));
    //返回值:成功为0,出错为-1
    /*
    TCP服务器或客户端,都可以不调用或调用bind函数
    TCP服务器通常都要调用bind函数,绑定在一个预先设置好的端口上
    若TCP服务器不调用bind函数,当调用listen函数时,内核将自动分配一个端口
    TCP客户端通常都不要调用bind函数,当调用connect函数时,内核自动分配一个端口
    */
    

    监听

    //函数原型
    #include<sys/socket.h>
    int listen(int sockfd, int backlog);
    //返回值:成功返回0,出错返回-1
    //listen的第二个参数规定了内核应该为相应套接口排队的最大连接个数
    /*当调用完listen函数,无论服务器是否调用accept函数(从监听队列中取出一个连接)
    客户端都可以向服务器发送数据,数据将保存在已连接套接口的接收缓冲区中*/
    listen(nListenSocket, nLengthOfQueueOfListen);
    

    接受客户端连接

    //函数原型
    #include<sys/socket.h>
    int accept(int sockfd, struct sockaddr *cliaddr,  socklen_t *addrlen);
    //cliaddr:当accept函数返回时,内核将从已完成连接队列中,取出一个连接;并将该连接的客户端信息(协议族、IP、Port),保存在cliaddr指向的结构体中
    //可以将cliaddr和addrlen设置为NULL
    sockaddr_in ClientAddress;
    socklen_t LengthOfClientAddress = sizeof(sockaddr_in);
    int nConnectedSocket = ::accept(nListenSocket, (sockaddr *)&ClientAddress, &LengthOfClientAddress);
    

    其他接口

    获取本地和远端协议地址

    //函数原型
    int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
    /*参数
    sockfd:需要查询的套接字
    localaddr:该函数返回时,填充该结构
    addrlen:调用该函数之前,让*addrlen为localaddr指向的套接口地址结构大小;调用之后,为实际套接口地址结构大小
    0:成功,-1:出错*/
    
    //函数原型
    int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
    /*返回远端的地址或端口信息(服务器调用,返回客户,客户调用返回服务器)
    参数
    sockfd:需要查询的套接字
    peeraddr:该函数返回时,填充该结构
    addrlen:调用该函数之前,让*addrlen为localaddr指向的套接口地址结构大小;调用之后,为实际套接口地址结构大小
    0:成功,-1:出错*/
    

    接收数据

    #include <unistd.h>
    int read(int fd, char *buf, int len);
    /*		返回:大于0-读写字节大小;-1-出错;
    调用函数read时,有如下几种情况:
    套接字接收缓冲区接收到数据,返回接收到的字节数;
    tcp协议收到FIN数据,返回0;
    tcp协议收到RST数据,返回-1,同时errno为ECONNRESET;
    进程阻塞过程中接收到信号,返回-1,同时errno为EINTR。*/
    
    

    发送数据

    #include <unistd.h>
    int write(int fd, char *buf, int len);
     /*                    返回:大于0-读写字节大小;-1-出错;
    
    调用函数write,有如下几种情况:
    套接字发送缓冲区有足够空间,返回发送的字节数;
    tcp协议接收到RST数据,返回-1,同时errno为ECONNRESET; ;
    进程阻塞过程中接收到信号,返回-1,同时errno为EINTR。*/
    

    一个简单的示例

    https://download.csdn.net/download/m0_37271605/71979131

    展开全文
  • TCP连接数量最大不能超过65535是错的。 一个连接由一个5元组决定(protocol,local IP,local port,remote ip,remote port),对于TCP,protocol固定是TCP,还有四个元素。对于服务器来说,local port一般是固定...
  • 1、 重启后永久性生效:开启:chkconfig iptables on关闭:chkconfig iptables off2、 即时生效,重启后失效:开启:service iptables start关闭:service iptables stop3、Linux 防火墙开放特定端口iptables是linux...
  • 下面我们介绍典型的TCP连接的建立与关闭过程(不包括任何数据传输) 一、TCP连接的建立(三次握手) TCP连接的建立分为3步: 1.主动开启者(通常称为客户端)发送一个SYN报文段(即一个在TCP头部的SYN位字段置位...
  • Linux下进行TCP简单通信

    千次阅读 多人点赞 2018-05-09 23:03:34
    体会TCP与UDP编程的不同,UDP编程:http://blog.csdn.net/yueguanghaidao/article/details/7055985二、实验平台Linux操作系统三、实验内容编写LinuxTCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦...
  • Linux TCP内核参数设置与调优(详细)!

    千次阅读 2021-08-05 14:27:17
    Linux内核中的TCP参数 /proc/sys/net/ipv4/ /proc/sys/net/ipv4/存放着TCP参数的文件,目录中的内容用来添加网络设置,在其中的许多设置,可以用来阻止对系统的攻击,或用来设置系统的路由功能。 tcp_syn_retries ...
  • 定位某个进程的网络故障时经常需要用到的一个功能就是查找所有连接的信息。通常查找某个端口的连接信息使用 ss 或者 netstat 可以轻松拿到,如果是主动与别的机器建立的连接信息则可以通过 lsof 命令来获得。例如我...
  • Linux-C TCP简单例子

    千次阅读 多人点赞 2019-03-13 20:07:44
    Linux-CTCP简单例子 一、简述 记-使用TCP协议通信的简单例子。 例子1:一个客户端,一个服务端,客户端发送信息,服务端就收信息。 例子2:使用多线程实现服务器与客户端的双向通信。 例子3:使用多路复用...
  • 如何分析linux tcp/ip 丢包问题

    千次阅读 2020-09-15 21:25:11
    引用 手把手教你用Dropwatch诊断问题 通过dropwatch定位系统内核丢包 Finding out if/why a server is dropping packets github source coed: pavel-odintsov/drop_watch ... How to Use IP Command in Linux w
  • TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放。网络服务器程序要同时管理大量连接...
  • Linux中MySQL连接本机数据库客户端

    千次阅读 2021-05-13 05:59:51
    Linux中MySQL连接本机数据库客户端Linux中MySQL连接本机数据库客户端1.登入mysql数据库2.找到要修改的位置// 选定要用的数据库(用show databases;看完再use mysql;)use mysql;这句可以不用写// 只查询host这栏select...
  • linux网络编程之TCP接口详解

    千次阅读 2016-06-26 17:52:22
    对于linux网络编程基于TCP的API做了详细的描述
  • 在任意位置Reset掉任意的TCP连接

    千次阅读 2018-11-07 22:10:24
    漫漫长夜又要降临…黑夜里,我不敢点灯,复明日,阳光下,我不敢睁眼。...其实我是不怎么懂Python的,折腾了大半天之后,竟然对Python产生了兴趣,正好旁边有人碰到了TCP连接被莫名Reset掉的案例,借这个...
  • 紧跟网络应用层协议 ... 文章目录端口 端口 数据经过网络传输到主机后,系统根据端口号确认数据给那个应用程序。...在TCP/IP协议中使用源IP,源端口号,目的IP,目的端口号来标识一个通信(netstat -n)。 ...
  • linux TCP 和 socket 参数设置

    千次阅读 2016-04-30 00:37:41
    tcp_syn_retries :INTEGER 默认值是5 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。...这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的) tcp_synack_retries :INTEGER 默认值是
  • Linux网络连接命令

    千次阅读 2019-03-28 14:04:08
     netstat –ta // 显示有效的TCP连接。  netstat –ua // 显示有效的UDP连接。  netstat –s // 显示各个协议的统计信息。  netstat -an | grep 2811 // 显示端口号为2811的网络连接信息。 操作如下图...
  • TCP 连接断连问题剖析

    千次阅读 2018-05-14 10:11:22
    TCP 连接的保持并不需要任何额外的操作,但在实际应用中,要长时间保持一个 TCP 连接则会受到诸多因素的影响。本文介绍了几种常见的导致 TCP 连接断连的原因,并在此基础上,以 AIX 系统上 TCP 连接的异常断连为例,...
  • linux TCP连接配置

    千次阅读 2013-11-15 13:58:56
    tcp_syn_retries :INTEGER 默认值是5 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃...这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的) tcp_synack_retries :INTEGER 默认值是5
  • 当一个新的连接请求到达服务器时,服务器接受该连接,并调用一个新的进程或线程来处理新的客户端。根据不同的操作系统,各种其他的资源也可以被分配来调用新的服务器。我们对多个并行服务器间的TCP交互非常感兴趣,...
  • 断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类 的函数开始主动终止一个连接。这里先暂时说正常情况。当调用close函数断开一个连接时,主动断开的 一方发送FIN...
  • Linux TCP服务器

    千次阅读 2015-12-01 13:39:48
    一、TCP编程框架  TCP网络包括服务器(server)和...二、LinuxTCP编程流程  根据系统给出API接口,根据上面流程,很容易写出一个简单的TCP应用程序。  TCP服务模式API使用流程:  创建socket()套接字  绑定bind
  • 最近发现几个监控用的脚本在连接监控数据库的时候偶尔会连不上,报错: Couldn'tconnecttohost:3306/tcp:IO::Socket::INET:connect:Cannotassignrequestedaddress 查看了一下发现系统中存在大量处于TIME_WAIT状态的...
  • linux 丢包排查思路简述(tcp+rdma)

    千次阅读 2021-04-16 09:35:46
    linux 丢包排查思路简述概述网络包接收流程网络包发送流程丢包排查的思路tcp排查方法rdma排查方法网络工具汇总参考链接 概述 我们首先以tcp网络为例,谈谈linux系统如何收发网络包 在进行网络传输时,数据包就会...
  • TCP 是一个非常非常重要的协议,不光在实际开发中广泛使用,同时也是面试中的高频问题 源/目的端口号:表示数据是从哪个进程来,到哪个进程去 2、TCP中的一些核心机制 有连接,面向字节流,全双工: 这三点在代码...
  • TCP/IP在Linux下编程实现

    千次阅读 多人点赞 2019-05-14 20:49:19
    1.4 基于Windows平台的网络初始化和注销(Linux平台无需该操作) 二、套接字类型与协议设置 2.1 套接字函数socket(以Linux系统为例) 2.2 协议簇 2.3 数据传输类型 2.4 协议类型 三、地址簇与数据序列 3.1 ...
  • 基于linuxTCP网络聊天室设计与实现

    万次阅读 多人点赞 2016-06-12 09:12:54
    利用Linux实现基于TCP模式的网络聊天程序 主要完成的两大组成部分为:服务器和客户端。 服务器程序主要负责监听客户端发来的消息。 客户端需要登录到服务器端才可以实现正常的聊天功能。该程序是利用进程以及共享...
  • 基于linux的网络聊天室 服务器端功能: 1)能够实现同时监听10个客户端 2)新的客户进入聊天室,发送新客户进入的系统消息给所有在线客户 3)在线客户实现基本的群聊功能 4)保存聊天记录,并支持查询聊天记录 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,851
精华内容 21,540
关键字:

linux 关闭特定tcp连接