tcp服务器连接(tcp服务器主动关闭连接)

      最后更新:2023-06-16 01:02

      怎么用TCP协议通过外网连接服务器

      首先你要明白路由是不是共享式NAT上网的,也就是说router port nat出去的数据是一直堆叠或者持续变动的,而不做端口映射基本没有实现的可能!当然如果是静态NAT,那么直接做静态NAT就可以了!如灰鸽子,是直接通过本地服务端(中灰鸽子端)连接广域网客户端(控制端),然后服务端和建立的联系。如通过80端口出数据,穿透防火墙等等。你可以尝试修改数据包出去的port,同时在两个端进行修改!-------------抓取到数据包的时候注意地址段,关键在于让路由到router nat到数据包的时候,能找到你的主机A或者W。你可以参照一些三层更新之类的软件。有通过路由器,那就在路由器中设置端口映射,要求是电脑在路由器中获取一个固定的内网IP。由于家用宽带一般禁用了80和21这些常用端口,所以需要的是通过外网访问时,端口就不能是被禁用的端口,另外,家用宽带都是48小时更换一次IP,所以你就需要DDNS,比如花生壳动态域名。已经设置的动态域名,如:dongtai.ddns.net设置端口映射,需要通过远程链接访问家里的计算机(10.0.1.201),则在路由器中设置端口映射为远程访问端口(如:3390),目标计算机IP(10.0.1.201),目标计算机端口(3389,3389是远程桌面的端口)。最后你通过其他计算机远程桌面家里的电脑的时候,就只需要在远程桌面窗口输入:dongtai.ddns.net:3390就可以了最重要的是你要有一个公网IP。可能逻辑上有点混乱,对于映射,不同的路由器设置方式都是大致相同的,具体的那就自己查查自己的路由器怎么设置咯。
      怎么用TCP协议通过外网连接服务器

      【TCP】单台服务器并发 TCP 连接数到底可以有多少 ?

      长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 长连接,是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。聊天室或即时消息推送系统等,因为很多消息需要到产生时才推送给客户端,所以当没有消息产生时,就需要hold住客户端的连接,这样,当有大量的客户端时,要hold住大量的长连接。在性能测试过程中,经常会接触到连接数相关的问题,有一个问题曾经困扰我好长时间,那就是一台服务器最多能支持多少链接数呢?有的朋友可能会说是65535,因为操作系统有65535个端口,那么这个答案准确吗?首先先了解下如何标识一个链接(记住下面的概念,文章后面要用到),操作系统是通过一个四元组来标识一个TCP链接:{本地ip,本地port,远程ip,远程port}这四个要素唯一确定一个TCP链接,任意一个要素不相同,就认为是一个不同的链接。在Linux系统中,一切皆文件,每一个TCP链接都要占用一个文件句柄,系统允许创建的链接数取决于句柄数的上限。超过这个值再创建链接就会报这样的错误:“Can't open so many files"。通过命令ulimit -n可以查看当前系统允许打开文件数量的上限,在Linux中这个值默认是1024,也就是说默认情况下,只能创建1024个链接。同时这个值也是可以修改的,通过修改/etc/security/limits.conf文件,可以把这个值改大,一般服务器都会改的很大,比如我们的服务器上一般设置为1000000。那这么说是不是就意味着只要我改的很大,链接数可以无限大了?其实也并不是这样,创建链接的时候,一般分为两个端, 即链接的发起端和链接接收端。比如我们现在使用Jmeter进行压测,被测系统部署在Tomcat服务器10.0.0.3上,使用的是8080端口。如果我们用5个并发来进行压测的话,创建的链接如下图所示:对于Jmeter来说,它是链接发起端,Jmeter创建了5个链接去连接服务端的8080端口,每个新建链接会占用了一个端口号,如图中的10001-10005。在操作系统中,端口号的范围是0-65535,其中0-1024是预留端口号,不可使用,其他的端口都是可以使用的。也就是说, 在链接发起端,受端口号的限制理论上最多可以创建64000左右链接。那么有没有办法超过这个限制呢,答案是肯定的!通过TCP标识的四元组可以看到,对于链接发起端,影响链接数的是本地ip和port,端口号受限于65535,已经没办法增加了。那我们可以增加本地ip来达到这个目的。一般情况下,服务器的一个网卡上只绑定了一个ip,对外通信都使用这个ip进行。其实网卡是支持一个绑定多个IP的,当然必须确保ip是有效的且未使用的。# ifconfig eth0:1 10.0.0.5以上命令可以在eth0网卡上增加一个ip 10.0.0.5,服务器网卡每增加一个ip,就可以允许在这个ip上再创建65535左右的链接数。曾经做过一个邮件网关的链接数测试,目的是为了测试网关服务器可以接收并且保持多少TCP长连接。正常情况下,受限于单台机器65535端口号的影响,客户端想创建25万TCP长连接,至少需要4台机器。通过对客户端网卡绑定多IP的方法,成功在一台机器上创建了25万个链接。当然,这种手段只是一种非常规的操作,只是为了进行某种特殊场景的测试。正常情况下不推荐网卡绑定多个IP。对于Tomcat服务器来讲,它是链接接收端,它是不是也受限于65535呢?并不是,从上面图中可以看到,Jmeter发起的所有链接都创建在Tomcat服务器的8080端口,也就是说对于链接接收端,所有的链接占用的是同一个端口。根据TCP标识四元组可以分析出, 一个链接接收端,最大的TCP链接数=所有有效ip排列组合的数量*端口数量64000 ,这个计算结果应该是一个天文数字。 因此链接接收端支持的链接数理论上可以认为是无限大的。上面介绍的一些数据都是理论上单台机器可以支持的TCP链接数, 实际情况下,每创建一个链接需要消耗一定的内存,大概是4-10kb,所以链接数也受限于机器的总内存。链接发起端,活力全开才64000左右链接,内存最多才占用640M,一般客户端都能 满足,内存限制主要还是考虑服务器端。虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。首先需要考虑文件句柄的限制。在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。这时你需要明白操作系统对可以打开的最大文件数的限制。我们可以通过ulimit -n命令、/etc/security/limits.conf 文件 以及 /etc/sysctl.conf 文件等来修改文件句柄数。其次要考虑的是端口范围的限制,操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?面试官也比较喜欢在这里引导挖坑,类似的问题还有:一个UDP连接可以复用已经被TCP连接占用的端口嘛?如何标识一个TCP连接?系统使用一个4四元组来唯一标识一个TCP连接:本地端口号 local port、本地IP地址 local ip、远端端口号 remote port、远端IP地址 remote ip。server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制。单台服务器最大支持多少连接数https://blog.csdn.net/alpha_love/article/details/108351457单机服务器支持千万级并发长连接的压力测试https://blog.csdn.net/lijinqi1987/article/details/74545851https://blog.csdn.net/wangshuminjava/article/details/80619190HTTP长连接200万尝试及调优https://www.cnblogs.com/zlingh/p/4814836.html一次百万长连接压测 Nginx 内存溢出问题https://blog.csdn.net/yangbaggio/article/details/107007627大并发下TCP内存消耗优化小记(86万并发业务正常服务)https://blog.51cto.com/benpaozhe/1752675TCP长连接与短连接的区别https://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.htmlLinux系统设置–ulimithttps://blog.haohtml.com/archives/9883HTTP的长连接和短连接https://www.cnblogs.com/cswuyg/p/3653263.html网络连接中的长连接和短链接是什么意思?https://www.zhihu.com/question/22677800性能优化篇-使用长连接提升服务性能https://zhuanlan.zhihu.com/p/118946284
      【TCP】单台服务器并发 TCP 连接数到底可以有多少 ?

      TCP怎么建立连接?

      TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN,ACK。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。第一次握手:建立连接时,客户端发送SYN包(SEQ=x)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器时入Established状态,完成三次握手。
      TCP怎么建立连接?

      TCP连接的步骤

      syn是同步信号,ack是应答信号 第一步客户机向服务器发送一个TCP数据包,表示请求建立连接. 为此,客户端将数据包的SYN位设置为1。第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接.于是服务器也向客户端发送一个TCP数据包.因为是响应客户机的请求,于是服务器设置ACK为1。第三步客户机收到了服务器的TCP,并从ACK为1知道是从服务器来的确认信息.于是客户机也向服务器发送确认信息.客户机设置ACK=1 最后一步服务器受到确认信息,也完成连接
      TCP建立连接需要三次握手.SYN是发送标志位,ACK是确认标志位. 第一次握手:SYN=1,ACK=0第二次握手:SYN=1,ACK=1 第三次握手:SYN=0,ACK=1
      在tcp/ip协议中,tcp协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入syn_send状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack包,此时服务器进入syn_recv状态;第三次握手:客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack=k+1),此包发送完毕,客户端和服务器进入established状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的syn包(syn=j)开设一个条目,该条目表明服务器已收到syn包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于syn_recv状态,当服务器收到客户的确认包时,删除该条目,服务器进入established状态。backlog参数:表示未连接队列的最大容纳数目。syn-ack重传次数服务器发送完syn-ack包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。 半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到syn包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为timeout时间、syn_recv存活时间。
      TCP连接的步骤

      TCP 连接详解

      1、先提出一个问题, 可以不进行三次握手直接往服务端发送数据包吗?是不可以的,也是可以的;1)不可以是因为现在的TCP连接标准和规范要求传输数据前先确认两端的状态,有一端状态不OK的话,发数据包有什么用呢;2)说可以是站在网络连接的角度,像 UDP 协议;2、TCP三次握手1)标志位、随机序列号和确认序列号是在数据包的 TCP 首部里面;2)几个状态是指客户端和服务端连接过程中 socket 状态;3)第一次握手,客户端向服务端发送数据包,该数据包中 SYN 标志位为 1,还有随机生成的序列号c_seq,客户端状态改为 SYN-SENT;4)第二次握手,服务端接收到客户端发过来的数据包中 SYN 标志位为 1,就知道客户端想和自己建立连接,服务端会根据自身的情况决定是拒绝连接,或确定连接,还是丢弃该数据包;拒绝连接,会往客户端发一个数据包,该数据包中 RST 标志位为 1,客户端会报 Connection refused;丢弃客户端的数据包,超过一定时间后客户端会报 Connection timeout;确定连接时会往客户端发一个数据包,该数据包中 ACK 标志位为 1,确认序列号 ack=c_seq+1,SYN 标志位为 1,随机序列号 s_seq,状态由 LISTEN 改为 SYN-RCVD;5)第三次握手,客户端接收到数据包会做校验,校验ACK标志位和确认序列号 ack=c_seq+1,如果确定是服务端的确认数据包,改自己的状态为 ESTABLISHED,并给服务端发确认数据包;6)服务端接到客户端数据包,会校验ACK标志位和确认序列号 ack=s_seq+1,改自己的状态为 ESTABLISHED,之后就可以进行数据传输了;7)建立连接时的数据包是没有实际内容的,没有应用层的数据;8)建立连接之后发起的请求数据包,每个数据包都会封装各层协议的头部信息,标志位ACK为1,其他标志位变动;9)网络进程间的通信,一台服务器内部的进程间通信不用这样;3、TCP 连接三次握手抓包1)Socket 在 linux 系统中是一种特殊的文件,因为 linux 系统的理念就是【一切皆文件】,是系统内核级的功能;2)以上定义比较具体,可以抽象来理解,是一个内核级的用于通信的功能层,包含一组接口函数,这些函数实际就是操作 socket 文件句柄文件描述符;一个 TCP 连接由四要素【源IP、源Port、目标IP、目标Port】唯一标识,也即 socket 由这四要素唯一确定;一个 TCP 连接的建立也就是客户端、服务端创建了相对应的一对 socket,客户端和服务端之间的通信也就是这对 socket 间的通信(物理层面是网卡在发送/接收比特流数据);3)一个服务与另一个服务建立连接,他们的端口是什么呢?客户端发出请求端口号是随机的,服务端是进程监听的端口号;2、socket 主要函数介绍1、进程通信,一个进程只有一个监听 socket,connect socket 是针对一个客户的一个连接的,有很多个; 2、connect 函数内部在发起请求前会找系统随机一个端口号; 3、连接建立后,客户端发起请求传输数据,服务端会直接交给 connect socket 处理,不会交给监听 socket 处理;4、监听 socket 在处理客户端请求时,如果此时其他客户端发请求过来,监听 socket 是没法处理的,此时系统会维护请求队列由 backlog 参数指定;全连接队列(completed connection queue)半连接队列(incomplete connection queue)Linux 内核 2.2 版本之前,backlog 的大小等于全连接队列和半连接队列之和;Linux 内核 2.2 版本之后,backlog 的大小之和全连接队列有关系:半连接队列大小由 /proc/sys/net/ipv4/tcp_max_syn_backlog 文件指定,可以开很大;全连接队列大小由 /proc/sys/net/core/somaxconn 文件和 backlog 参数指定,取两个中的最小值;tomcat acceptCount 就是配置全连接队列大小;3、socket 函数在建立连接和数据传输的大概使用情况4、TCP首部结构1)2的16次方等于 65536,所以系统中端口号的限制个数为 65536,一般1024以下端口被系统占用;2)标志位这里是 6 个,还有其他标志位的,只是这 6 个标志位常用;3)seq 序列号,ack 确认序列号,序列号在数据传输时分包用到。三次握手时 seq 序列号是随机的,没有实际意义;4)TCP 包首部后面接着的是 IP 包首部,再紧接着的是以太网包首部,其实都是加 0101010101 二进制位;几个常用标志位,首先一个标志位占一个 bit 位,只能是二进制中的 1 或 0;1)SYN,简写 S,请求标志位,用来建立连接。在TCP三次握手中收到带有该标志位的数据包,表示对方想与己方建立连接;2)ACK,简写【.】,请求确认/应答标志位,用于对对方的请求进行应答,对方收到含该标志位的数据包,会知道己方存在且可用。也会用在连接建立之后,己方发送响应数据给对方的数据包中;3)FIN,简写 F,请求断开标志位,用于断开连接。对方收到己方的含该标志位的数据包,就知道己方想与它断开连接,不再保持连接;4)RST,简写 R,请求复位标志位,因网络或己方服务原因导致有数据包丢失,己方接收到的数据包序列号与上一个数据包的序列号不衔接,那己方会发送含该标志位的数据包告诉对方,对方接收到含该标志位的数据包就知道己方要求它重新三次握手建立连接并重新发送丢失的数据包,一般断点续传会用到该标志位;还有就是如果对方发过来的数据错了,有问题,己方也会发送含该标志位的数据包;5)PSH,简写 P,推送标志位,表示收到数据包后要立即交给应用程序去处理,不应该放在缓存中,read()/write() 都有缓存区;6)URG,简写 U,紧急标志位,该标志位表示 tcp 包首部中的紧急指针域有效,督促中间层尽快处理;7)ECE,在保留位中;8)CWR,在保留位中;5、TCP 抓包1)服务端会根据自身情况,没有要处理的数据时会把第二次和第三次挥手合并成一次挥手,此时标志位 FIN=1 / ACK=1;2)MSL 是 Maximum Segment Lifetime 缩写,指数据包在网络中最大生存时间,RFC 建议是 2分钟;详细描述:1)客户端、服务端都可以主动发起断开连接;2)第一次挥手,客户端向服务端发送含 FIN=1 标志位的数据包,随机序列号 seq=m,此时客户端状态由 ESTABLISHED 变为 FIN_WAIT_1;3)第二次挥手,服务端收到含 FIN=1 标志位的数据包,就知道客户端要断开连接,服务端会向客户端发送含 ACK=1 标志位的应答数据包,确认序列号 ack=m+1,此时服务端状态由 ESTABLISHED 变为 CLOSE_WAIT;4)客户端收到含 ACK=1 标志位的应答数据包,知道服务端的可以断开的意思,此时客户端状态由 FIN_WAIT_1 变为 FIN_WAIT_2;(第一、二次挥手也只是双方交换一下意见而已)5)第三次挥手,服务端处理完剩下的数据后再次向客户端发送含 FIN=1 标志位的数据包,随机序列号 seq=n,告诉客户端现在可以真正的断开连接了,此时服务端状态由 CLOSE_WAIT 变为 LAST_ACK;6)第四次挥手,客户端收到服务端再次发送的含 FIN=1 标志位的数据包,就知道服务端处理好了可以断开连接了,但是客户端为了慎重起见,不会立马关闭连接,而是改状态,且向服务端发送含 ACK=1 标志位的应答数据包,确认序列号 ack=n+1,此时客户端状态由 FIN_WAIT_2 变为 TIME_WAIT;等待 2 个MSL时间还是未收到服务端发过来的数据,则表明服务端已经关闭连接了,客户端也会关闭连接释放资源,此时客户端状态由 TIME_WAIT 变为 CLOSED;也就是说 TIME_WAIT 状态存在时长在 1~4分钟;7)服务端收到含 ACK=1 标志位的应答数据包,知道客户端确认可以断开了,就立即关闭连接释放资源,此时服务端状态由 LAST_ACK 变为 CLOSED;SYN 洪水攻击(SYN Flood)是一种 DoS攻击(拒绝服务攻击),大概原理是伪造大量的TCP请求,服务端收到大量的第一次握手的数据包,且都会发第二次握手数据包去回应,但是因为 IP 是伪造的,一直都不会有第三次握手数据包,导致服务端存在大量的半连接,即 SYN_RCVD 状态的连接,导致半连接队列被塞满,且服务端默认会发 5 个第二次握手数据包,耗费大量 CPU 和内存资源,使得正常的连接请求进不来;
      TCP 连接详解

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类