当前位置 主页 > 网站技术 > 代码类 >

    Java面试基础之TCP连接以及其优化

    栏目:代码类 时间:2019-09-12 18:13

    前言

    作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分-TCP连接你了解吗?今天我们来仔细看看这个部分。

    TCP建立连接-三次握手

    详解

    客户端和服务器还未建立连接,但服务器一般处于listen状态 客户端主动建立连接,向服务器发送SYN报文,客户端变为SYN_SENT状态 服务器收到客户端发送的报文,也回了一个SYN报文,包含了一个ack。此时,服务器变为SYN_RCVD状态 客户端收到了服务器发送的SYN报文,确认了ack,它将向服务器发送一个ACK报文。此时,客户端变为ESTABLISHED 服务器收到客户端的ACK报文,确认了ack。此时,服务器也变为ESTABLISHED 服务器和客户端可以正常通信了

    其中步骤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)的重试次数

    nct.ipv4.tcp_syn_rctries = 6

    建立连接时的本地端口可用范围

    net.ipv4.ip_local_port_range = 32768 60999

    SYN_RCVD状态相关

    SYN_RCVD状态连接的最大个数

    net.ipv4.tcp_max_syn_backlog

    被动建立连接时,发SYN/ACK(步骤3)重试次数

    net.ipv4.tcp_synack_retries

    说完了TCP建立连接,接下来,我们再来看看TCP正常断开连接的过程

    TCP断开连接-四次挥手

    详解