zoukankan      html  css  js  c++  java
  • tcp十种状态;关于tcp中time_wait状态(2MSL问题)

    tcp十种状态

    注意:

    • 当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送
    • 发送FIN通常是应用层对socket进行关闭的结果
    •  

      关于tcp中time_wait状态的4个问题

    time_wait是个常问的问题。tcp网络编程中最不easy理解的也是它的time_wait状态,这也说明了tcp/ip四次挥手中time_wait状态的重要性。
    以下通过4个问题来描写叙述它


    问题

    1.time_wait状态是什么

    2.为什么会有time_wait状态

    3.哪一方会有time_wait状态

    4.怎样避免time_wait状态占用资源


    1.time_wait状态是什么

    简单来说:time_wait状态是四次挥手中server向client发送FIN终止连接后进入的状态。

    下图为tcp四次挥手过程
    这里写图片描写叙述


    能够看到time_wait状态存在于client收到serverFin并返回ack包时的状态
    当处于time_wait状态时,我们无法创建新的连接,由于port被占用。


    2.为什么会有time_wait状态

    time_wait存在的原因有两点
    1.可靠的终止TCP连接。
    2.保证让迟来的TCP报文段有足够的时间被识别并丢弃。

    1.可靠的终止TCP连接,若处于time_wait的client发送给server确认报文段丢失的话,server将在此又一次发送FIN报文段,那么client必须处于一个可接收的状态就是time_wait而不是close状态。
    2.保证迟来的TCP报文段有足够的时间被识别并丢弃,linux 中一个TCPport不能打开两次或两次以上。当client处于time_wait状态时我们将无法使用此port建立新连接,假设不存在time_wait状态,新连接可能会收到旧连接的数据。

    time_wait持续的时间是2MSL,保证旧的数据能够丢弃。由于网络中的数据最大存在MSL(maxinum segment lifetime)


    3.哪一方会有time_wait状态

    time_wait状态是一般有client的状态。

    并且会占用port
    有时产生在server端,由于server主动断开连接或者发生异常


    4.怎样避免time_wait状态占用资源

    假设是client,我们一般不用操心,由于client一般选用暂时port。再次创建连接会新分配一个port。

    除非指定client使用某port,只是一般不须要这么做。

    假设是server主动关闭连接后异常终止。则由于它总是使用用一个知名serverport号,所以连接的time_wait状态将导致它不能重新启动。只是我们能够通过socket的选项SO_REUSEADDR来强制进程马上使用处于time_wait状态的连接占用的port。
    通过socksetopt设置后,即使sock处于time_wait状态,与之绑定的socket地址也能够马上被重用。

    此外也能够通过改动内核參数/proc/sys/net/ipv4/tcp_tw/recycle来高速回收被关闭的socket,从而是tcp连接根本不进入time_wait状态,进而同意应用程序马上重用本地的socket地址。

    5. time_wait状态到底持续多长时间?

    首先要知道一个名词:MSL 

    MSL 为一个数据包在网络中存活的最长时间,一般1-2分钟的样子;RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

     

    tcp的2MSL问题说明

    2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,

    当TCP的一端发起主动关闭,在发出最后一个ACK包后,

    即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,

    必须在此状态上停留两倍的MSL时间,

    等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,

    那么对方在超时后将重发第三次握手的FIN包,

    主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

    在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。

    当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

    不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

  • 相关阅读:
    “键鼠耕耘,IT家园”,博客园2010T恤正式发布
    解决jQuery冲突问题
    上周热点回顾(5.316.6)
    博客园电子期刊2010年5月刊发布啦
    上周热点回顾(6.76.13)
    Chrome/5.0.375.70 处理 <pre></pre> 的 Bug
    [转]C# MemoryStream和BinaryFormatter
    [转]Android adb不是内部或外部命令 问题解决
    [转]HttpWebRequest解析 作用 介绍
    财富中文网 2010年世界500强排行榜(企业名单)
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/13234343.html
Copyright © 2011-2022 走看看