精华内容
下载资源
问答
  • 很早微博上一直讨论比较多的问题,这里转载个知乎的答案:单机单网卡最大tcp连接数真的是65535吗? 作者:许怀远 链接:https://www.zhihu.com/question/66553828/answer/244313925 来源:知乎 著作权归作者...

    很早微博上一直讨论比较多的问题,这里转载个知乎的答案:单机单网卡最大tcp长连接数真的是65535吗?

    TCP四元组(quadruple)的概念,就算培训班出来的也听说过吧?不做解释了。(源IP,源port,目标IP,目标port),最大能有多少连接数,全看这4个参数。从服务端accept客户端的角度,IPv4为例源IP可以有几十亿个,不同客户端都可以connect过来源port理论上65535个,因为local port range缘故,一般只有一半左右目标IP,单网卡也可以多IP,上限多少看操作系统限制目标port理论上65535个,由于port range,一般也只有一半左右四个因子相乘,可以有超过万亿级的连接数,当然只是理论上的一般我们对外的服务,会引入更多的限制,例如HTTP,目标端口是固定的,目标IP通过DNS负载均衡可以有多个,但是一般单机不会这么做。尽管多了限制,上限还是很高啊,仅源IP和源端口相乘就比65535高不知道多少个数量级。除此之外,操作系统层面还有更多限制,比如进程fd上限,32位系统还有内存限制,64位系统单机物理内存也是有限的,现在最大的配置,内存也就T级,还没有到P级。现实一点,一般的服务器,比如阿里云上能买得到的配置,能承受多少连接数呢?100万级是很容易做到的,再往高里去就不是hello world这么容易了。就算傻傻的开多线程,一个线程一个连接,也远远不止65535个啊。

    • 陈硕大神的一个相关文章:

    关于 TCP 并发连接的几个思考题与试验

    展开全文
  • linux下c语言编程,有两个网卡,主网卡已经实现TCP服务器,次网卡怎么实现TCP客户端?**我用connect函数连接主机失败。前边添加bind函数也失败,请问该怎么办?**急求各位大神
  • 使用命令配置网卡TCP/IP参数

    千次阅读 2019-05-20 19:42:39
    使用命令配置网卡TCP/IP参数,确保虚拟机真实机可连通。 1)通过命令行设置网卡的IP地址 将“本地连接”的IP地址获取方式更改为DHCP方式: C:\Users\Administrator>netsh interface ip set address “本地...

    使用命令配置网卡的TCP/IP参数,确保虚拟机与真实机可连通。
    1)通过命令行设置网卡的IP地址
    将“本地连接”的IP地址获取方式更改为DHCP方式:
    C:\Users\Administrator>netsh interface ip set address “本地连接” dhcp
    … …
    查看更改后的IP地址配置信息(DHCP已启用、未获取到地址):
    C:\Users\Administrator> netsh interface ip show config “本地连接”
    接口 “本地连接” 的配置
    DHCP 已启用: 是
    IP 地址: 169.254.72.65
    子网前缀: 169.254.0.0/16 (掩码 255.255.0.0)
    InterfaceMetric: 10
    静态配置的 DNS 服务器: 192.168.0.220
    202.106.0.20
    用哪个前缀注册: 只是主要
    通过 DHCP 配置的 WINS 服务器: 无
    使用静态配置的方式将IP地址重新设置为192.168.4.4,网关为192.168.4.1:
    C:\Users\Administrator> netsh interface ip set address “本地连接” static 192.168.4.4 255.255.255.0 192.168.4.1
    再次确认修改后的结果(DHCP已停用、使用指定的IP地址):
    C:\Users\Administrator>netsh interface ip show config “本地连接”
    接口 “本地连接” 的配置
    DHCP 已启用: 否
    IP 地址: 192.168.4.4
    子网前缀: 192.168.4.0/24 (掩码 255.255.255.0)
    默认网关: 192.168.4.1
    网关跃点数: 1
    InterfaceMetric: 10
    静态配置的 DNS 服务器: 192.168.0.220
    202.106.0.20
    用哪个前缀注册: 只是主要
    通过 DHCP 配置的 WINS 服务器: 无
    2)确认可ping通127.0.0.1
    若成功获得“来自127.0.0.1的回复”,说明本机的TCP/IP协议驱动工作正常:
    C:\Users\Administrator> ping 127.0.0.1
    正在 Ping 127.0.0.1 具有 32 字节的数据:
    来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
    来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
    来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
    来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
    127.0.0.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
    3)确认可ping通本机网卡的IP地址(192.168.4.4)
    若成功获得“来自192.168.4.4的回复”,说明“本地连接”的IP配置可用:
    C:\Users\Administrator> ping 192.168.4.4
    正在 Ping 192.168.4.4 具有 32 字节的数据:
    来自 192.168.4.4 的回复: 字节=32 时间<1ms TTL=128
    来自 192.168.4.4 的回复: 字节=32 时间<1ms TTL=128
    来自 192.168.4.4 的回复: 字节=32 时间<1ms TTL=128
    来自 192.168.4.4 的回复: 字节=32 时间<1ms TTL=128
    192.168.4.4 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
    4)确认可ping通本网段内的其他主机(Windows 7真机192.168.4.110)
    若成功获得“来自192.168.4.110的回复”,说明本机可访问本网段内其他主机:
    C:\Users\Administrator>ping 192.168.4.110
    正在 Ping 192.168.4.110 具有 32 字节的数据:
    来自 192.168.4.110 的回复: 字节=32 时间<1ms TTL=64
    来自 192.168.4.110 的回复: 字节=32 时间<1ms TTL=64
    来自 192.168.4.110 的回复: 字节=32 时间<1ms TTL=64
    来自 192.168.4.110 的回复: 字节=32 时间<1ms TTL=64
    192.168.4.110 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
    若Windows 7真机启用了防火墙服务,则可能会导致“请求超时”:
    C:\Users\Administrator> ping 192.168.4.110
    正在 Ping 192.168.4.110 具有 32 字节的数据:
    请求超时。
    请求超时。
    请求超时。
    请求超时。
    192.168.4.110 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),
    请打开“计算机管理”–>“服务和应用程序”–>“服务”,停用“Windows Firewall”服务后再重新测试。
    5)其他失败性ping测试
    ping本网段内一个实际上无对应计算机的IP地址(如192.168.4.77),或者默认网关不可用时,会获得从本机返回的提示“无法访问目标主机”:
    C:\Users\Administrator> ping 192.168.4.77
    正在 Ping 192.168.4.77 具有 32 字节的数据:
    来自 192.168.4.4 的回复: 无法访问目标主机。
    来自 192.168.4.4 的回复: 无法访问目标主机。
    来自 192.168.4.4 的回复: 无法访问目标主机。
    来自 192.168.4.4 的回复: 无法访问目标主机。
    192.168.4.77 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),

    展开全文
  • C++实现客户端服务器TCP连接,上传,下载,执行指定exe文件,获取目录等功能,平台vs2017可直接运行sln文件。(输入help可查看有哪些指令)
  • TCP 连接断连问题剖析

    千次阅读 2018-05-14 10:11:22
    TCP 连接的保持并不需要任何额外的操作,但在实际应用中,要长时间保持一个 TCP 连接则会受到诸多因素的影响。本文介绍了几种常见的导致 TCP 连接断连的原因,并在此基础上,以 AIX 系统上 TCP 连接的异常断连为例,...
    TCP 连接的保持并不需要任何额外的操作,但在实际应用中,要长时间保持一个 TCP 连接则会受到诸多因素的影响。本文介绍了几种常见的导致 TCP 连接断连的原因,并在此基础上,以 AIX 系统上 TCP 连接的异常断连为例,借助相应的网络分析工具,逐步揭开 AIX 上 TCP 断连的原因,并给出两种可行的解决方案。
    
    引言  
    在官方的正式文档中,TCP/IP 协议簇也称为国际互联网协议簇。TCP/IP 协议簇是目前使用最为广泛的全球互联网技术,其分层结构如图 1 所示:
    图 1. TCP/IP 协议簇分层结构 


    如图 1 所示,数据链路层主要负责处理传输媒介等众多的物理接口细节;网络层负责处理数据分组在网络中的活动,包括上层数据报文的分割、选路 phost2008-08-21T00:00:00 等;传输层则负责为两台主机提供端到端的通信;应用层将负责处理应用程序的特定细节。其中,IP 协议是网络层的核心协议,用来提供不可靠、无连接的数据传递服务;而 TCP 协议则处于传输层,其基于不可靠无连接的 IP 协议能够为两台主机提供面向连接的、可靠的通信。UDP?
    由于 TCP 是面向连接的协议,因此在两台主机通信之前,需要首先建立起一条连接。下面我们将简要介绍 TCP 连接的建立以及通信双方是如何保持已建立的 TCP 连接的。
    TCP 连接的建立及保持 
    一个 TCP 连接的建立需要通过著名的“三次握手”来完成。下面的例子将直观给出一个 TCP 连接的建立过程。
    在本文的下述描述中,客户端主机均为 testClient.cn.ibm.com(Linux),服务器主机均为 testServer.cn.ibm.com(AIX)。在 testClient 主机的一终端上执行 tcpdump –i eth0 host testServer 命令,启动 tcpdump 监听网络数据(其中,eth0 是客户主机与外部网络进行通信所使用的网卡);与此同时,在客户主机的另一个终端上执行下述命令: (root@testClient /)>telnet testServer。此时客户主机上 tcpdump 的输出如清单 1 所示。
    清单 1. 创建一个 TCP 连接的三次握手 
    # tcpdump –S -i en0 host testServer
    1 14:02:38.384918 IP testClient.cn.ibm.com.43370 >  
    testServer.cn.ibm.com.telnet: S 3392458353:3392458353(0) …
    2 14:02:38.629578 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.43370: S 881279296:881279296(0) ack 3392458354 …
    3 14:02:38.629592 IP testClient.cn.ibm.com.43370 >  
    testServer.cn.ibm.com.telnet: . ack 881279297 …
    注意:我们删除了 tcpdump 输出结果中的部分无关信息。为了便于理解,我们将上述输出转换为实际序列图 2。
    图 2. TCP 建立创建三次握手的实际序列 


    从图 2 中我们可以清楚地看到,在 testClient 与 testServer 之间建立连接时,要经过以下三次握手过程:

    • testClient 向 testServer 主动发送握手协议,报文序列号为 3392458353,大小为 1 个字节。 
    • testServer 向 testClient 主动发送握手协议,报文序列号为 881279296,大小为 1 个字节;同时返回 ACK 3392458354,作为对 testClient 发来的 3392458354 包的应答。 
    • testClient 向 testServer 返回 ACK 881279297,作为对 testServer 发来的 881279296 包的应答。

    一个 TCP 连接在完成上述的三次握手之后便建立完毕;此后,连接的两端即可进行信息的相互传递。因此,TCP 连接可以认为是以两端 IP 地址和端口进行标识的一个通信信道,而 TCP 连接的建立就是向通信双方进行上述通信信道注册的过程。TCP 连接一旦建立,只要通信双方之间的中间结点(包括网关和交换机、路由器等网络设备)工作正常,那么在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
    TCP 连接的这种特性,使得一个长期不交换任何信息的空闲连接可以长期保持数小时、数天甚至数月。中间路由器可以崩溃、重启,网线可以被挂断再连通,只要两端的主机没有被重启,TCP 连接就可以被一直保持下来。




    回页首
    导致 TCP 连接断连的因素  
    理想状态下,一个 TCP 连接可以被长期保持。然而,在实际应用中,客户端或服务器端上维持的一个看似正常的 TCP 连接可能已经断连。TCP 连接主要受到两个方面的影响而导致断连:网络中间节点和客户端 / 服务器节点参与通信的两方节点?
    在实际网络应用中,两个主机之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等。因此,两个主机之间 TCP 连接的保持同样会受到中间节点的影响,尤其是会受到防火墙(软件或硬件防火墙)的限制。防火墙是一种装置,有多种不同的实现方式(软件实现、硬件设备实现或是软硬件相结合实现),它需要依据一系列规则对进出的信息流进行扫描,并允许安全(符合规则)的信息交互、阻止不安全(违反规则)的信息交互。防火墙的工作特性决定了要维护一个网络连接就需要耗费较多的资源,并且企业防火墙常常位于企业网络的出入口,长时间维护非活跃的 TCP 连接必将导致网络性能的下降。因此,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 TCP 连接断连。类似的,如果中间节点异常导致来自客户端关闭连接的请求无法传递到服务器端,也将导致服务器端的相应连接发生断连。
    另一方面,对于一个 TCP 连接两端的主机而言,创建 TCP 连接需要耗费一定的系统资源。如果不再使用某个连接,那么我们总是希望进行通信的两个主机能够主动关闭相应的连接,以便释放所占用的系统资源。然而,如果由于客户端出现异常 ( 例如崩溃或异常重启 ) 而导致连接未能正常关闭,这将导致服务器端的连接断连。
    无论是客户端节点或是服务器端节点,断连的 TCP 连接已经不能传递任何信息,因此,维护大量断连的 TCP 连接将导致系统资源的浪费。这种系统资源的浪费可能并不会对客户端节点带来太大问题;然而,对于服务器主机而言,这可能会导致系统资源(尤指内存资源和 socket 资源)被耗尽而拒绝为新的用户请求提供服务。因此在实际应用中,服务器端需要采取相应的方法来探测 TCP 连接是否已经断连。




    回页首
    探测 TCP 连接断连的三种常用方法  
    探测 TCP 连接是否断连或是工作正常的原理比较简单:定期向连接的远程通信节点发送一定格式的信息并等待远程通信节点的反馈,如果在规定时间内收到来自远程节点的正确的反馈信息,那么该连接就是正常的,否则该连接已经断连。依据该原理,目前常用的探测方法有以下三种。
    应用程序的自我探测 
    应用程序本身附带探测其自身建立的 TCP 连接的功能。这种方法具有极大的灵活性,可以依据应用本身的特点选择相应的探测机制和功能实现。然而,实际应用中,大部分应用程序均没有附带自我探测的功能。
    第三方应用程序的探测 
    此种方法就是在服务节点上安装相应的第三方应用程序来探测该节点上所有的 TCP 连接是否正常或是已经断连。该方法最大的不足就是需要所有支持探测的客户端能够识别来自该探测应用的数据报文,因此,实际应用中比较少见。
    TCP 协议层的保活探测 
    最常用的探测方法就是采用 TCP 协议层提供的保活探测功能即 TCP 连接保活定时器。尽管该功能并不是 RFC 规范的一部分,但是几乎所有的类 Unix 系统均实现了该功能,所以使得该探测方法被广泛使用。
    接下来的部分,我们将重点讨论来自 TCP 协议层的保活探测方法。




    回页首
    类 Unix 系统上的 TCP 连接保活定时器  
    TCP 连接的保活定时器可以在应用层实现,也可以在 TCP 中提供。这个问题存在争议,因此 TCP 连接的保活探测并不是 TCP 规范中的一部分。但为了方便,几乎所有类 Unix 系统均在 TCP 中提供了相应的功能。
    清单 2. 常见 Unix 系统上的保活定时器 
    操作系统  
    保活定时器  
    AIX  
    # no -a | grep keep
    tcp_keepcnt = 8
    tcp_keepidle = 14400
    tcp_keepintvl = 150  
    Linux  
    # sysctl -A | grep keep
    net.ipv4.tcp_keepalive_intvl = 75
    net.ipv4.tcp_keepalive_probes = 9
    net.ipv4.tcp_keepalive_time = 7200  
    FreeBSD  
    #sysctl -A | grep net.inet.tcp
    net.inet.tcp.keepidle=…
    net.inet.tcp.keepintvl=…  
    不同系统上的各参数的时间单位不尽相同。在 AIX 上,tcp_keeidle/tcp_keepinit/tcp_keepintvl 的时间单位是 0.5 秒;而在 Linux 上,net.ipv4.tcp_keepalive_intvl 和 net.ipv4.tcp_keepalive_time 的时间单位则为秒。并且,上述参数仅对运行在其上的服务器应用连接有效。
    注:在 Solaris 上可通过“ndd /dev/tcp \?”命令显示上述类似参数信息,而在 HP Unix 上则可通过 nettune 或 ndd 命令进行查询。
    由于所有类 Unix 系统上均支持这种功能,因此,在接下来的部分中我们将基于 AIX 系统具体讲述上述参数的意义和作用机制。




    回页首
    AIX 中的 TCP 连接保活探测机制及原理  
    正如清单 2 中列出的一样,AIX 上的保活探测机制由 4 个参数来控制,其具体意义见清单 3:
    清单 3. AIX 上的保活定时器控制参数 
    控制参数  
    参数说明  
    tcp_keepcnt  
    关闭一个非活跃连接之前进行探测的最大次数,默认为 8 次  
    tcp_keepidle  
    对一个连接进行有效性探测之前运行的最大非活跃时间间隔,默认值为 14400(即 2 个小时)  
    tcp_keepintvl  
    两个探测的时间间隔,默认值为 150 即 75 秒  
    我们来看一个具体的例子。在 testServer 端(AIX 主机)采用 tcp_keepidel=240(即 2 分钟):tcp_keepcnt=8:tcp_keepintvl=150(即 75 秒)的参数值;启动 testServer 上的 tcpdump 查看网络包的交互情况;从 testClient 端发起请求建立和 testServer 之间的一个 telnet 连接。在连接建立完成之后,拔出 testClient 端的网线并观察服务器端的数据输出(见清单 4)。
    清单 4. telnet 连接在服务器端的 tcpdump 输出 
    1 # tcpdump -i en1 host testServer.cn.ibm.com
    2 04:51:51.379716 IP testClient.cn.ibm.com.telnet.40621 >  
    testServer.cn.ibm.com.telnet: S 4097149880:4097149880(0)
    3 04:51:51.379755 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: S 2543529892:2543529892(0) ack 4097149881
    4 04:51:51.380609 IP testClient.cn.ibm.com.telnet.40621 >  
    testServer.cn.ibm.com.telnet: . ack 1  
    5 ...
    6 04:51:54.924058 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: P 676:696(20) ack 87  
    7 04:51:54.924909 IP testClient.cn.ibm.com.telnet.40621 >  
    testServer.cn.ibm.com.telnet: . ack 696  
    8 04:53:54.550192 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    9 04:55:09.550997 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    10 04:56:24.552053 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    11 04:57:39.552615 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    12 04:58:54.553446 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    13 05:00:09.554287 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    14 05:01:24.555117 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    15 05:02:39.555958 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    16 05:03:54.557282 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: . 695:696(1) ack 86
    17 05:05:09.559795 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.40621: R 696:696(0) ack 87
    从清单 4 中可以看出,第 6 行的报文是本连接发送的最后数据,而第 7 行则是对第 6 行数据的确认。其后,该连接上没有任何数据交互,从而使得该连接一直处于非活跃状态。经过 2 分钟(第 8 行数据报时间 04:53:54 和第 7 行数据报时间 04:51:54 之差,即 tcp_keepidle 的值)的非活跃时间后,第 8 行是服务器端发起第一个保活探测数据报。由于服务器端没有收到客户端关于探测报文的相应,因此再经过 tcp_keepintvl 的时间间隔(75 秒)之后,第 9 行显示服务器端再次发起保活探测数据报。服务器端持续发送了 tcp_keepcnt 个探测报文(上面结果显示,在 AIX 上是持续发送 tcp_keepcnt+1 个探测报文)之后,仍然没有收到来自客户端的任何回应,所以服务器在第 17 行向客户端发送复位报文同时在服务器端关闭了该连接。
    需要注意的是,保活探测虽然通过发送 TCP 探测报文,但探测报文不会对正常的 TCP 连接产生任何影响。从清单 4 可以看出,第 8 行发送数据的 TCP 报文序号为 695 起始的 1Byte 数据,而该数据在第 6 行已经发送并被客户端确认。对于正常状态的连接,客户端在收到探测报文之后将返回一个第 7 行所示的 ACK 报文并借此向服务器端表明连接工作正常。
    接下来,我们将通过一个实际的 TCP 断连的例子来分析上述机制对 TCP 连接保持的影响,并针对需要长时间保持 TCP 连接的应用提出两种可选的解决方案。




    回页首
    AIX 上的 TCP 断连及数据分析  
    图 3. 出现 TCP 断连的网络拓扑结构示意图 


    所有服务器主机均划为一个局域网,并处于防火墙 B 之后。由于工作需要,来自工作区局域网的主机 testClient 需和服务器局域网内的 testServer 上的数据库使用 TCP/IP 建立一个连接,testClient 上的上层应用将通过该连接对 testServer 上的数据库进行相应操作。
    在实际测试中,我们发现,在 testClient 和 testServer 均工作正常的情况下,testClient 上的客户端在事先没有收到任何异常信息的情况下,所持有的连接会出现非预期的断连现象(在试图通过连接进行数据库操作时,会被告知 connection is reset by foreign host 的错误)。
    由于该现象不断出现,并且网络内的中间节点(路由器和交换机等)均工作正常,因此可以排除物理因素(如掉电、宕机等)的可能。为了便于分析断连原因,我们首先查看了 testServer 机器上的默认保活设置:
    # no -a | grep keep
    tcp_keepcnt = 8
    tcp_keepidle = 14400
    tcp_keepintvl = 150
    testServer 上的 tcp_keepidle 为 14400,即 2 个小时。既然中间节点工作正常,为什么保活机制没有其作用呢?为了进行分析,我们采用 tcpdump 工具捕获 testClient 和 testServer 上的报文信息,见清单 5 和清单 6 所示。
    清单 5. 服务器端的 tcpdump 数据输出 
    1 10:18:58.881950 IP testClient.cn.ibm.com.59098 >  
    testServer.cn.ibm.com.telnet: S 1182666808:1182666808(0) ...
    2 10:18:58.882001 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.59098: S 3333341833:3333341833(0) ack 1182666809 ...
    3 10:18:58.882845 IP testClient.cn.ibm.com.59098 >  
    testServer.cn.ibm.com.telnet: . ack 1 ...
    4 ...
    5 10:19:03.165568 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.59098: P 1010:1032(22) ack 87 ...
    6 10:19:03.166457 IP testClient.cn.ibm.com.59098 >  
    testServer.cn.ibm.com.telnet: . ack 1032 ...
    7 12:19:05.445336 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.59098: . 1031:1032(1) ack 86 ...
    8 12:19:05.445464 IP testClient.cn.ibm.com.59098 >  
    testServer.cn.ibm.com.telnet: R 86:87(1) ack 1031 ...
    清单 6. 客户端的 tcpdump 数据输出 
    1 # tcpdump -e -i eth0 host testServer.cn.ibm.com
    2 10:18:55.800553 IP testClient.cn.ibm.com.59098 >  
    testServer.cn.ibm.com.telnet: S 1182666808:1182666808(0) ...
    3 10:18:55.801778 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.59098: S 3333341833:3333341833(0) ack 1182666809 ...
    4 10:18:55.801799 IP testClient.cn.ibm.com.59098 >  
    testServer.cn.ibm.com.telnet: . ack 1 ...
    5 ...
    6 10:19:00.084662 IP testServer.cn.ibm.com.telnet >  
    testClient.cn.ibm.com.59098: P 1010:1032(22) ack 87 ...
    7 10:19:00.084678 IP testClient.cn.ibm.com.59098 >  
    testServer.cn.ibm.com.telnet: . ack 1032 ...
    从清单 5 中可以看出,在该连接处于非活跃状态的时间达到 tcp_keepidle 设定的 2 小时时,服务器主机发出了第一个连接保活的探测报文(清单 5 中的第 7 行)。紧接着,服务器主机就收到了来自 testClient 的连接复位报文(清单 5 中的第 8 行)。之后,服务器便关闭了该连接(可以通过 netstat –ni 来查看)。然而,从清单 6 的 tcpdump 数据可以看出, testClient 端并未发送任何报文。那么,是谁向 testServer 发送了复位报文呢?
    为了查看上述复位报文的发送者,同样采用上述 tcpdump 命令再次捕获服务器端和防火墙 B 的报文信息(注意:通常需要捕获防火墙主机上网络数据的出口网卡和入口网卡数据),结果显示,防火墙 B 在收到来自 testServer 的第一个探测报文之后就立刻向 testServer 发送了一个复位报文。
    上述分析说明,在连接传递完最后一个交互数据之后到服务器端发送第一个保活探测之间,该连接已经被防火墙 B 终止;在此之后,基于该连接的任何报文传递在试图穿过防火墙的时候均会被防火墙丢弃并发送复位报文。




    回页首
    两种常用的解决方案  
    针对上述 TCP 断连现象,有两种常用的解决方案可供选择:
    方案 1、延长防火墙终止非活跃的 TCP 连接的时间。例如,针对上述案例,可以调节防火墙设置,将时间设置为大于服务器端设定的 2 小时。
    方案 2、缩短服务器端的 TCP 连接保活时间。缩短该时间的目的是为了在连接被防火墙终止之前发送保活探测报文,既可以探测客户端状态,又可以使连接变为活跃状态。
    对于第一种方案而言,延长 TCP 连接的保持时间可能会导致防火墙性能的降低,尤其是在维持大量长时间处于非活跃状态的连接的情况下更是如此;而对于第二种方案,如果缩短服务器端的 TCP 连接保活时间,意味着会增加网络中的数据报文数而占用额外的网络带宽。因此,两种方案各有利弊,需要依据不同的实际应用情况进行选择。




    回页首
    总结  
    本文介绍了 TCP 连接的建立和保持的相关概念以及影响 TCP 连接保持的常见因素。给出了常见的类 Unix 系统上 TCP 连接保活探测的相关配置参数,并基于 AIX 借助 tcpdump 工具分析了一个实际的 TCP 断连的案例。最后,针对 TCP 断连的情况给出了两种可行的解决方案。
    参考资料  


    • AIX V5.3 中 IPv4 和 IPv6 的网络接口操作 
      : 通过本文,您将了解更多关于套接字 I/O 控制 (ioctl) 命令的内容,以及如何使用它们完成各种网络相关的操作 . 操作系统为套接字、路由表、ARP 表、全局网络参数和接口提供了相应的控制操作方式。 

    • TCP/IP 应用程序的通信连接模式 
      : 本文的作者通过分析 TCP/IP 程序在不同级别上采用的不同方式来向您讲述了如何设计好 TCP/IP 应用程序的通信模式以及需要注意的相关问题。 

    • 为 TCP 的重新传输实现更低的计时器粒度 
      : 在本文中,将研究如何通过使用 AIX TCP 快速计时器使重新传输计时器实现更低的粒度,并了解使用更低的计时器粒度的其他优点。 

    • 了解 TCP 系统调用序列 
      : 在本文中,将回顾和学习关于 TCP 调用序列的详细信息,其中包括对 FreeBSD 的引用,以及在用户级进行系统调用后在 TCP 堆栈中发生的重要函数调用。 

    • AIX and UNIX 专区 
      :developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。

    • AIX and UNIX 新手入门 
      :访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。

    • AIX and UNIX 专题汇总 
      :AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为你把本专区的所有专题进行汇总,让您更方便的找到你需要的内容。
    • 获取 
      本专区的 RSS Feed
      。(了解关于 
      RSS
      的更多信息。)


    本文来自ChinaUnix博客,如果查看原文请点: http://blog.chinaunix.net/u1/34267
    展开全文
  • TCP连接占用的资源

    千次阅读 2018-12-08 14:55:04
    维持一个tcp连接需要占用哪些资源,下面就总结一下最近学习的内容,不足之处,请读者多多指正。 一个tcp连接需要:1,socket文件描述符;2,IP地址;3,端口;4,内存 TCP连接的四元组:源IP 源端口 目...

    版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处。 https://blog.csdn.net/fox_hacker/article/details/41440561

    维持一个tcp连接需要占用哪些资源,下面就总结一下最近学习的内容,不足之处,请读者多多指正。

    一个tcp连接需要:1,socket文件描述符;2,IP地址;3,端口;4,内存

    TCP连接的四元组:源IP 源端口 目标IP 目标端口,这四元组构成了一个唯一的tcp连接。

    对于一台服务器,我们假设只有一个网卡,那么就对应一个唯一的IP地址,而监听端口,我们可以在1024-65535之间任选一个。通过这个监听端口,我们接收来自客户端的连接请求。那么,它的IP、端口已经确定了,下面就是讨论socket文件描述符合内存了。

    对于文件描述符fd,每个tcp连接占用一个,那么一个文件描述符下的文件大约占1K字节,而内核对这块也有说明,文件描述符建议最多占用10%的内存,如果是8G内存,那么就相当于800M即80000,80万个文件描述符,当然,这个数据也可以通过linux参数调优进行调节,我在之前的一篇章节中也有讨论到,请大家参考:http://blog.csdn.net/fox_hacker/article/details/41148115

    而对于内存,tcp连接归根结底需要双方接收和发送数据,那么就需要一个读缓冲区和写缓冲区,这两个buffer在linux下最小为4096字节,可通过cat /proc/sys/net/ipv4/tcp_rmem和cat /proc/sys/net/ipv4/tcp_wmem来查看。所以,一个tcp连接最小占用内存为4096+4096 = 8k,那么对于一个8G内存的机器,在不考虑其他限制下,最多支持的并发量为:810241024/8 约等于100万。此数字为纯理论上限数值,在实际中,由于linux kernel对一些资源的限制,加上程序的业务处理,所以,8G内存是很难达到100万连接的,当然,我们也可以通过增加内存的方式增加并发量。

    网上也有人做过相关试验,程序接收1024000个连接,共消耗7,5G内存,即每个连接消耗在8K左右。

    参考: http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html

    作者:乱码特轻松
    来源:CSDN
    原文:https://blog.csdn.net/fox_hacker/article/details/41440561
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • TCP减压引擎,第一次听说这个名词,但是并不是一个新的概念了,若干年前听说过设备厂商在研究在FPGA之中实现TCP Stack,但是后来没有听到任何的产品出来,应该是路由设备to host的traffic不多,而对于FW设备,中间的...
  • 准备工具: 1. 两台连接到同个...TCP连接建立过程(三次握手): 抓包分析TCP连接过程: 1.两台主机都分别打开TCP&UDP测试工具 这里设置主机A的IP地址为10.1.13.2, 主机B为10.1.13.3。 主机A作为客户...
  • 在任意位置Reset掉任意的TCP连接

    千次阅读 2018-11-07 22:10:24
    漫漫长夜又要降临…黑夜里,我不敢点灯,复明日,阳光下,我不敢睁眼。...其实我是不怎么懂Python的,折腾了大半天之后,竟然对Python产生了兴趣,正好旁边有人碰到了TCP连接被莫名Reset掉的案例,借这个...
  •   本文主要是从tcp连接建立的角度来分析客户端程序是如何调用connect函数和服务端程序建立tcp连接的,了解connect函数在建立连接的过程中做了那些事情。 1. 了解tcp连接建立过程   在正式介绍connect函数时...
  • 查看每个TCP连接的速度

    千次阅读 2019-04-01 09:26:16
    有没有一个工具能够显示server上每个tcp连接的速度啊。 用netstat能够监看每个tcp连接状态,但无法显示速度 找了个dstat工具,可以显示每个网卡的流量,但是却不能显示每个tcp线程的 求高手指教有没有什么工具能够...
  • TCP连接一旦建立,只要通信双方的中间节点(网卡、交换机、路由器等网络设备)工作正常,那么在通信双方中的任意一方主动关闭连接之前,TCP连接都将被一直保持下去。 TCP连接的这种特性,使得一个长期不交换任何信息...
  • TCP减负引擎网卡TCP/IP协议处理网络流量,要占用大量服务器资源。为了减轻服务器的压力,一种称为TCP减负引擎(TCP Offload Engine :TOE)的技术应运而生。TCP减负引擎一般由软硬两部分组件构成,将传统的TIP/IP...
  • 14-TCP 协议(连接异常RST)

    千次阅读 2017-04-10 11:30:44
    1. RST 段当 TCP连接出现严重的错误时,必须释放连接。通过将 TCP 首部中的 RST 标志位置 1,就可以通知对端发生错误,以终止连接。我们在 TCP 协议(连接异常)一文中已经看到过这种错误,当时实验演示的是向一个不...
  • TCP 连接断连问题剖析

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

    千次阅读 2011-07-11 23:41:34
    从TCP协议角度来看,一个已建立的TCP连接有两种关闭方式,一种是正常关闭,即四次挥手关闭连接;还有一种则是异常关闭,我们通常称之为连接重置(RESET)。  首先说一下正常关闭时四次挥手的状态变迁,关闭连接的...
  • 首先介绍一下TCP连接建立关闭过程中的状态。TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用、特定数据包以及超时等,具体状态如下所示:CLOSED:初始状态,表示没有任何连接。LISTEN:Server端的...
  • jRTPlib支持多网卡,支持TCP

    千次阅读 2015-08-05 16:18:12
    项目上要使流媒体服务器支持双网卡,一个网卡进流,一个网卡出流,我读了读jRTPlib库代码,发现要实现此要求,需要对库代码做出修改。思路如下: (1)RTP over UDP 数据结构上,创建RTP sock时,要创建一个recv_...
  • 如何在不插网线启用网卡TCP/IP协议 ping 通自己的IP
  • socket(套接字)是通信的基石,是支持TCP...多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,计算机操作系统为应用程序TCP/IP协议交互提供了套接字(Socket
  • TCP连接建立系列 — 客户端发送SYN段

    千次阅读 2015-08-15 22:35:23
    主要内容:客户端调用connect()时的TCP层实现。 内核版本:3.15.2  我的博客:http://blog.csdn.net/zhangskd   connect的TCP层实现   SOCK_STREAM类socket的TCP层操作函数集实例为tcp_prot,其中客户端使用tcp_...
  • 当采用Windows 2000/XP/2003系统的局域网用户拔掉连接本机网卡的网线时,或该用户的网卡与局域网中的网络设备没有正常连接时,桌面上的“任务栏”中会显示“本地连接,网络电缆没有插好”的提示。为什么Windows系统...
  • 在介绍长短连接之前先要说下握手和挥手的概念,这种TCP层的问答式的交互方式同时也在很多应用层协议的绑定消息中使用。 三次握手为连接的建立过程,握手失败则连接建立失败。 四次挥手为连接的完整释放过程,也会...
  • 到底什么是TCP连接

    万次阅读 多人点赞 2015-08-19 22:53:58
    这个问题说实话困扰了我接近2年时间,我们找到的所有资料上都写着,TCP是面向连接的服务,所有要通过TCP进行通信的应用都要先建立连接才能通信,在通信完毕之后要记得关闭连接。直到前不久才突然搞明白,这里记录...
  • 最多能创建多少个TCP连接

    千次阅读 多人点赞 2021-04-24 00:19:14
    低并发编程战略上藐视技术,战术上重视技术本文坚持看到结尾才有动图气不气?我是一个 Linux 服务器上的进程,名叫小进。老是有人说我最多只能创建 65535 个 TCP 连接。我不信这个邪...
  • 还是在网卡上?还是我程序问题? 我的问题是: 如何突破这每秒只有300左右回复的瓶颈,按理论速度应该是5000个线程/5秒=1000个回复/s,是不是只能增加CPU配置换个i7的16核心的或者还有其他什么办法?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 121,668
精华内容 48,667
关键字:

网卡与tcp连接