3

TCP连接机制及状态转换

 2 years ago
source link: https://chegva.com/2096.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

TCP连接机制及状态转换

2017年5月7日 by anzhihe·0评论 · 4,030 人阅读 · 隐藏边栏 · 最后更新: 2021/10/18

TCP连接机制及状态转换
  • TCP半连接和全连接

TCP连接机制及状态转换

客户端最后一次发送 ACK包后进入 TIME_WAIT 状态,而不是直接进入 CLOSED 状态关闭连接,这是为什么呢?

TCP 是面向连接的传输方式,必须保证数据能够正确到达目标机器,不能丢失或出错,而网络是不稳定的,随时可能会毁坏数据,所以机器A每次向机器B发送数据包后,都要求机器B”确认“,回传ACK包,告诉机器A我收到了,这样机器A才能知道数据传送成功了。如果机器B没有回传ACK包,机器A会重新发送,直到机器B回传ACK包。

客户端最后一次向服务器回传ACK包时,有可能会因为网络问题导致服务器收不到,服务器会再次发送 FIN 包,如果这时客户端完全关闭了连接,那么服务器无论如何也收不到ACK包了,所以客户端需要等待片刻、确认对方收到ACK包后才能进入CLOSED状态。那么,要等待多久呢?

数据包在网络中是有生存时间的,超过这个时间还未到达目标主机就会被丢弃,并通知源主机。这称为报文最大生存时间(MSL,Maximum Segment Lifetime)。TIME_WAIT 要等待 2MSL 才会进入 CLOSED 状态。ACK 包到达服务器需要 MSL 时间,服务器重传 FIN 包也需要 MSL 时间,2MSL 是数据包往返的最大时间,如果 2MSL 后还未收到服务器重传的 FIN 包,就说明服务器已经收到了 ACK 包。

  • TIME_WAIT状态调优

    [root@iZ2ze0cnscbfbls4uyfd1qZ /proc/sys/net/ipv4]# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 7412
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 65535
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 65535
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited

    #设为1,time_wait占用的sockek链接快速回收,对外的服务器不打开,使用NAT请求时间戳不一致可能会造成故障
    [root@iZ2ze0cnscbfbls4uyfd1qZ /proc/sys/net/ipv4]# cat tcp_tw_recycle 
    0

    #time_wait占用的sockek链接可以重复使用,前提是先要打开时间戳
    [root@iZ2ze0cnscbfbls4uyfd1qZ /proc/sys/net/ipv4]# cat tcp_tw_reuse     
    1

    #打开时间戳,可以判断数据是老的还是新的
    [root@iZ2ze0cnscbfbls4uyfd1qZ /proc/sys/net/ipv4]# cat tcp_timestamps   
    1

  1.TCP Socket文件实在太多,可以通过加 IP 来解决。

  2.生产中CLOSE_WAIT很多说明程序写的有问题。

安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/2096.html | ☆★★每天进步一点点,加油!★★☆ | 

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK