zoukankan      html  css  js  c++  java
  • TCP(二)

    一.TCP连接的11种状态变迁


    1、先上图:

    这里写图片描述

    2、全部11种状态

    2.1、客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。
    2.2、服务器独有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。
    2.3、共有的:(1)CLOSED (2)ESTABLISHED 。

    3、状态变迁

    3.1、建立连接时的状态变迁
    一开始,建立连接之前服务器和客户端的状态都为CLOSED。服务器创建socket后开始监听,变为LISTEN状态。客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT。服务器收到客户端的报文后向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD。然后,客户端收到ACK、SYN,就向服务器发送ACK,客户端状态变为ESTABLISHED,服务器收到客户端的ACK后也变为ESTABLISHED。此时,3次握手完成,连接建立!
    3.2、断开连接时的状态变迁
    由于tcp连接是全双工的,断开连接会比建立连接麻烦一点点。客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1。服务器收到FIN后向客户端发生ACK,服务器状态变为CLOSE_WAIT。客户端收到ACK后就进入FIN_WAIT2状态。此时连接已经断开了一半了。如果服务器还有数据要发送给客户端,就会继续发送。直到发完了,就发送FIN报文,此时服务器进入LAST_ACK状态。客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态,再过了2MSL长的时间后进入CLOSED状态。服务器收到客户端的ACK就进入CLOSED状态。
    至此,还有一个状态没有提及:CLOSING状态。CLOSING状态表示客户端发生了FIN,但没有收到服务器的ACK,却收到了服务器的FIN。这种情况发生在服务器发送的ACK丢包的时候,因为网络传输有时会有意外。

    二. Time_wait优化


    1.tw_reuse、tw_recycle 使用场景及注意事项 :

    对于客户端
    
    1. 作为客户端因为有端口65535问题,TIME_OUT过多直接影响处理能力,打开tw_reuse 即可解决,不建议同时打开tw_recycle,帮助不大。
    
    2. tw_reuse 帮助客户端1s完成连接回收,基本可实现单机6w/s请求,需要再高就增加IP数量吧。
    
    3. 如果内网压测场景,且客户端不需要接收连接,同时tw_recycle 会有一点点好处。
    
    4. 业务上也可以设计由服务端主动关闭连接
    
    
    对于服务端
    
    1. 打开tw_reuse无效
    
    2. 线上环境 tw_recycle 不要打开
    
       服务器处于NAT 负载后,或者客户端处于NAT后(这是一定的事情,基本公司家庭网络都走NAT);
    
     公网服务打开就可能造成部分连接失败,内网的话到时可以视情况打开;
    
       像我所在公司对外服务都放在负载后面,负载会把timestamp 都给清空,好吧,就算你打开也不起作用。

    2.解决Time_wait过多情况:

    1.调整可用端口数:net.ipv4.ip_local_port_range = 2048 65000
    2.增加虚拟IP去访问后端
    3.打开长连接,可以减少连接数
  • 相关阅读:
    准确率,召回率,F值
    残差
    字典学习
    深度学习
    cnn 滤波
    tensorflow
    kaggle 泰坦尼克
    python matplotlib
    数学家西蒙斯:华尔街最赚钱的基金经理
    Oracle学习笔记:删除数据空格(trim、ltrim、rtrim函数)
  • 原文地址:https://www.cnblogs.com/wuhg/p/11642689.html
Copyright © 2011-2022 走看看