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

  

  

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

  


  

  

<强>详解
  

  

癑ava面试基础之TCP连接以及其优化"

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

其中步骤2 ~ 4就是三次握的手,那么为什么需要三次握手呢?为什么不是一次或者两次握手呢?

  

首先,我们需要知道,只有当服务器和客户端都能确保自己能够发消息和接收消息,这次网络通信才算成功的。

  

步骤2的作用是让服务器知道了自己是可以接收消息的。

  

步骤3的作用是让客户端知道自己发送消息和接收消息的功能是OK的,发送消息的能力是通过服务器返回的ack=x + 1确认的,因为这个值基于当初客户端发送的消息seq=x。接收消息的能力是因为收到了服务器的返回。

  

步骤4的作用是让服务器端知道自己发送消息的能力是可以的(和步骤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正常断开连接的过程

  


  

  

<强>详解
  

  

癑ava面试基础之TCP连接以及其优化"

  
      <李>客户端与服务器端正常传输数据李   <李>客户端主动断开连接,向服务器端发送鳍报文,客户端变为FIN_WAIT1状态李   <李>服务器收到客户端的鳍后,向客户端发送ACK报文,服务器变为CLOSE_WAIT状态李   <李>客户端收到服务器的ACK报文后,客户端变为FIN_WAIT2状态李   <李>服务器向客户端发送鳍报文,服务器变为LAST_ACK状态李   <李>客户端收到服务器发送的鳍报文后,向服务器发送ACK报文,客户端变为TIME_WAIT状态李   <李>服务器收到客户端的ACK报文后,服务器变为封闭状态李   <李>客户端经过火星科学实验室2 (max段一生,报文最大生存时间)时间后,也变为封闭状态李   
  

其中,步骤2,3,5,6即为4次挥手。

  

<强> TIME_WAIT状态及其优化
  

  

看完之后,大家想必会有一个疑问,为什么TIME_WAIT状态需要保持2韩剧?因为这可以保证至少一次报文的往返时间内,端口是不可复用的。

  

假设TIME_WAIT状态的持续时间很短,我们来模拟下面这种场景:

  

癑ava面试基础之TCP连接以及其优化”
  

  
      <李>客户端向服务器端发送了三条报文,其中第3条报文卡在网络中,服务器只收到了前两条,向客户单发送ACK=2,客户端重新发送第三条报文。   <李>服务器主动发送鳍报文,客户端收到后发送鳍,ACK,服务器端收到后发送ACK并进入TIME_WAIT状态(假设这个状态很短)。

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