时间:2021-05-20
前言
作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分-TCP连接你了解吗?今天我们来仔细看看这个部分。
TCP建立连接-三次握手
详解
其中步骤2~4就是三次握手,那么为什么需要三次握手呢?为什么不是一次或者两次握手呢?
首先,我们需要知道,只有当服务器和客户端都能确保自己能够发消息和接收消息,这次网络通信才算成功的。
步骤2的作用是让服务器知道了自己是可以接收消息的。
步骤3的作用是让客户端知道自己发送消息和接收消息的功能是OK的,发送消息的能力是通过服务器返回的ack=x+1确认的,因为这个值基于当初客户端发送的消息seq=x。接收消息的能力是因为收到了服务器的返回。
步骤4的作用是让服务器端知道自己发送消息的能力是OK的(和步骤3类似)。
linux查看
linux服务器可以利用netstat -anp | grep tcp命令,查看服务器上各个端口和应用的连接状态。
你还可以通过修改linux的配置文件/etc/sysctl.conf,调整各个状态的数量
SYN_SENT状态相关
主动建立连接时,发SYN(步骤2)的重试次数
建立连接时的本地端口可用范围
SYN_RCVD状态相关
SYN_RCVD状态连接的最大个数
被动建立连接时,发SYN/ACK(步骤3)重试次数
说完了TCP建立连接,接下来,我们再来看看TCP正常断开连接的过程
TCP断开连接-四次挥手
详解
其中,步骤2、3、5、6即为4次挥手。
TIME_WAIT状态及其优化
看完之后,大家想必会有一个疑问,为什么TIME_WAIT状态需要保持2MSL?因为这可以保证至少一次报文的往返时间内,端口是不可复用的。
假设TIME_WAIT状态的持续时间很短,我们来模拟下面这种场景:
因此这也是TIME_WAIT状态需要保持2MSL的原因,如果这么长时间也没有收到报文,即使有正确的报文从客户端发出,也已经过期了,因此不会影响到之后的通信。
但这同样也会带来一个问题,TIME_WAIT状态保持的时间较长,假设服务器端有大量TIME_WAIT状态的TCP连接,就相当于白白浪费掉大量的服务器资源(端口)。此时,我们可以通过修改以下配置进行服务器调优:
net.ipv4.tcp_tw_reuse = 1其他状态的优化
CLOSE_WAIT状态
如果服务器端有大量CLOSE_WAIT状态的连接,很有可能是应用进程出现bug,没有及时关闭连接。
FIN_WAIT1状态
调整发送FIN报文的重试次数,0相当于8
net.ipv4.tcp_orphan_retries = 0FIN_WAIT2状态
调整保持在FIN_WAIT2状态的时间
net.ipv4.tcp_fin_timeout = 60总结
看到这里,想必你应该对TCP连接有了一个大致的了解。现在服务器大多都用了nginx做了负载均衡,因此,我们可能需要在此基础上了解一些nginx相关的配置原理,这样应该会对我们的服务器性能调优会有更大的帮助。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java基础知识之网路通信总结在这篇文章里,我们主要讨论如何使用Java实现网络通信,包括TCP通信、UDP通信、多播以及NIO。 TCP连接 TCP的基础
TCP连接TCP的基础是Socket,在TCP连接中,我们会使用ServerSocket和Socket,当客户端和服务器建立连接以后,剩下的基本就是对I/O的控
当我们想要在Java中使用TCP/IP通过网络连接到服务器时,就需要创建java.net.Socket对象并连接到服务器。假如希望使用JavaNIO,也可以创建
昨天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头
HashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collecti