长链接:https://www.cnblogs.com/Safe3/archive/2012/11/02/2751146.html
正是因为是四元组,所以服务器才可以支持百万连接
限制一台服务器连接数的是服务器的内存和带宽,不是端口号。
因为客户端的ip和端口号不一样,因此尽管服务器段的ip和端口号一样,建立的连接,即socket还是不同的socket。
https://www.cnblogs.com/hustdc/p/10842496.html
accept之后不会使用服务器新的端口,只会产生新的四元组。
https://blog.csdn.net/linsongbin1/article/details/101699905
通过设置net.ipv4.tcp_tw_reuse(只有客户端有用)
或者设置net.ipv4.tcp_tw_recycle只用于服务器端(再经过最短重传时间RTO是经过网络实况RTT计算得来,如果网络状况特别差)可以快速回收time_wait,由此,如果客户端处于NAT的网络(多个客户端,同一个IP出口的网络环境),如果配置了tw_recycle,就可能在一个RTO的时间内,只能有一个客户端和自己连接成功(不同的客户端发包的时间不一致,造成服务端直接把数据包丢弃掉)。
但是上面两个参数不能用于nat网络之中,因为在通过nat网络的时候,时间戳会失效。
https://blog.csdn.net/fanren224/article/details/89849276
短链接的情况下服务器可能会出现大量的连接tima_wait,但是是同一个端口下的不同四元组的time_wait。当一个NAT有很多客户端,短链接将自己的端口号快速服用完了,在服务端对应的四元组都在time_wait下面。
1.通过长链接可以解决,但是需要修改大量代码。
2.客户端在短链接中主动发送fin,不让服务器主动发起关闭。
若Http关闭KeepAlive,每个http请求都要求打开一个tcp socket连接,并且使用一次之后就断开这个tcp连接。
使用KeepAlive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用KeepAlive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd 服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
但是,KeepAlive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的KeepAlive,有时比重复利用连接带来的损失还更大。所以,正确地设置KeepAlive timeout时间非常重要。
keepalvie timeout
Httpd守护进程,一般都提供了keep-alivetimeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个 keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是 keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。
https://www.cnblogs.com/huanxiyun/articles/7521694.html
某一时间点长链接与短链接在线用户是一样的,但是某一时间段短链接并发量远超长链接,长链接适合用户量不多,但是请求频繁的场景,比如客户端在线。短链接适合数据量小,用户基量大,但是请求不频繁,用户请求响应快。
NAT映射
https://blog.csdn.net/qq_18821901/article/details/80474777
通过端口映射技术,可以将局域网内部的ip+端口号映射到公网ip的固定端口上,所以如果服务器端主动关闭短链接,那么客户端在NAT映射时会一直映射到新的端口上,直到用完。