netstat -st输出解析(二)

转自:http://perthcharles.github.io/2015/11/10/wiki-netstat-proc/

netstat -st输出的两个重要信息来源分别是/proc/net/snmp和/proc/net/netstat
本文将分类整理这些counterd的含义以及一些注意事项。

在整理的过程中,发现Rover Yu前辈已经
对这些counter做过详细的整理。关于Rover Yu前辈的整理请查看参考资料中的前三篇。
本着不重复造轮子的原则。本文将尽量遵循以下原则,以期从不同的角度呈现对这些counter的理解。

a. &#x5206;&#x7C7B;&#x6574;&#x7406;&#xFF1A;&#x6839;&#x636E;&#x6D89;&#x53CA;&#x7684;&#x4E0D;&#x540C;<span class="type">TCP&#x7EC6;&#x8282;&#xFF0C;&#x5BF9;counter&#x505A;&#x66F4;&#x7EC6;&#x81F4;&#x7684;&#x5206;&#x7C7B;
b. &#x7ED3;&#x5408;sysctl&#x914D;&#x7F6E;&#xFF1A;&#x5F3A;&#x8C03;sysctl&#x914D;&#x7F6E;&#x4E0E;counter&#x4E4B;&#x95F4;&#x7684;&#x5173;&#x8054;
<span class="built_in">c. &#x5F3A;&#x8C03;&#x5F02;&#x5E38;&#xFF1A;&#x54EA;&#x4E9B;counter&#x51FA;&#x73B0;&#x975E;&#x96F6;&#x503C;&#xFF0C;&#x5F80;&#x5F80;&#x5C31;&#x610F;&#x5473;&#x7740;&#x51FA;&#x73B0;&#x4E86;&#x503C;&#x5F97;&#x5173;&#x6CE8;&#x7684;&#x95EE;&#x9898;
d. &#x4FE1;&#x606F;&#x62BD;&#x53D6;&#xFF1A; &#x5982;&#x4F55;&#x4ECE;counter&#x4E2D;&#x83B7;&#x53D6;&#x6709;&#x4EF7;&#x503C;&#x7684;&#x4FE1;&#x606F;
e. &#x4EC5;&#x5173;&#x6CE8;<span class="type">TCP&#x76F8;&#x5173;&#x8BA1;&#x6570;&#x5668;
</span></span></span>

类别涉及counters 常量 RtoAlgorithm、RtoMin、RtoMax、MaxConn 建连统计 ActiveOpens、PassiveOpens、AttemptFails、CurrEstab、EstabResets 数据包统计 InSegs、OutSegs、RetransSegs、InErrs、OutRsts、InCsumErrors、EmbryonicRsts syncookies功能 SyncookiesSent、SyncookiesRecv、SyncookiesFailed TIME_WAIT回收 TW、TWRecycled、TWKilled、TCPTimeWaitOverflow RTO次数 TCPTimeouts、TCPSpuriousRTOs、TCPLossProbes、TCPLossProbeRecovery、

TCPRenoRecoveryFail、TCPSackRecoveryFail、

TCPRenoFailures、TCPSackFailures、

TCPLossFailures Retrans数量 TCPFastRetrans、TCPForwardRetrans、

TCPSlowStartRetrans、TCPLostRetransmit、

TCPRetransFail FastOpen TCPFastOpenActive、TCPFastOpenPassive、

TCPFastOpenPassiveFail、TCPFastOpenListenOverflow、

TCPFastOpenCookieReqd MD5 TCPMD5NotFound、TCPMD5Unexpected DelayedACK DelayedACKs、DelayedACKLocked、DelayedACKLost、

TCPSchedulerFailed DSACK TCPDSACKOldSent、TCPDSACKOfoSent、

TCPDSACKRecv、TCPDSACKOfoRecv、

TCPDSACKIgnoredOld、TCPDSACKIgnoredNoUndo Reorder TCPFACKReorder、TCPSACKReorder、

TCPRenoReorder、TCPTSReorder Recovery TCPRenoRecovery、TCPSackRecovery、

TCPRenoRecoveryFail、TCPSackRecoveryFail Abort TCPAbortOnData、TCPAbortOnClose、

TCPAbortOnMemory、TCPAbortOnTimeout、

TCPAbortOnLingerTCPAbortFailed

|reset相关 | |
|内存prune | PruneCalled、RcvPruned、OfoPruned、
TCPMemoryPressures |
|PAWS相关 | PAWSPassive、PAWSActive、PAWSEstab |
|Listen相关 | ListenOverflows、ListenDrops |
|undo相关 | TCPFullUndo、TCPPartialUndo、
TCPDSACKUndo、TCPLossUndo |
|快速路径与慢速路径 | TCPHPHits、TCPHPHitsToUser、
TCPPureAcks、TCPHPAcks |

这些常量是Linux3.10中的默认值,仅在升级了内核版本时才需要关心一下这些值的变化。

<span class="label">RtoAlgorithm:
    &#x9ED8;&#x8BA4;&#x4E3A;<span class="number">1&#xFF0C;RTO&#x7B97;&#x6CD5;&#x4E0E;RFC2698&#x4E00;&#x81F4;
<span class="label">RtoMin:
    &#x9ED8;&#x8BA4;&#x503C;&#x4E3A;HZ/<span class="number">5&#xFF0C;&#x5373;<span class="number">200ms
<span class="label">RtoMax:
    &#x9ED8;&#x8BA4;&#x503C;&#x4E3A;<span class="number">120HZ&#xFF0C;&#x5373;<span class="number">120s
<span class="label">MaxConn:
    &#x534F;&#x8BAE;&#x6808;&#x672C;&#x8EAB;&#x5E76;&#x4E0D;&#x4F1A;&#x9650;&#x5236;TCP&#x8FDE;&#x63A5;&#x603B;&#x6570;&#xFF0C;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A;-<span class="number">1.

</span></span></span></span></span></span></span></span></span></span>

这些统计值中,只有CurrEstab反应的是系统当前状态,而其他值则是反应的历史状态
同时需要注意的是,这些计数器将ESTABLISHED和CLOSE-WAIT状态都作为当前连接数。
可以这么理解:这两个状态都以为这local=>peer方向的连接未被关闭

ActiveOpen<span class="variable">s:
    &#x4E3B;&#x52A8;&#x5EFA;&#x8FDE;&#x6B21;&#x6570;&#xFF0C;CLOSE => SYN-SENT&#x6B21;&#x6570;
PassiveOpen<span class="variable">s:
    &#x88AB;&#x52A8;&#x5EFA;&#x8FDE;&#x6B21;&#x6570;&#xFF0C;RFC&#x539F;&#x610F;&#x662F;LISTEN => SYN-RECV&#x6B21;&#x6570;&#xFF0C;&#x4F46;Linux&#x9009;&#x62E9;&#x5728;&#x4E09;&#x6B21;&#x63E1;&#x624B;&#x6210;&#x529F;&#x540E;&#x624D;&#x52A0;<span class="number">1
AttemptFail<span class="variable">s:
    &#x5EFA;&#x8FDE;&#x5931;&#x8D25;&#x6B21;&#x6570;
EstabReset<span class="variable">s:
    &#x8FDE;&#x63A5;&#x88AB;reset&#x6B21;&#x6570;&#xFF0C;ESTABLISHED => CLOSE&#x6B21;&#x6570; + CLOSE-WAIT => CLOSE&#x6B21;&#x6570;
CurrEsta<span class="variable">b:
    &#x5F53;&#x524D;TCP&#x8FDE;&#x63A5;&#x6570;&#xFF0C;ESTABLISHED&#x4E2A;&#x6570; + CLOSE-WAIT&#x4E2A;&#x6570;
</span></span></span></span></span></span>

这些统计值也是历史值,独立的来看意义并不大。一般可统计一段时间内的变化,关注以下几个指标
a. TCP层的重传率: ΔRetransSegs / ΔOutSegs — 越小越好,如果超过20%(这个值根据实际情况而定)则应该引起注意
b. Reset发送频率: ΔOutRsts / ΔOutSegs — 越小越好,一般应该在1%以内
c. 错误包占比: ΔInErrs / ΔInSegs — 越小越好,一般应该在1%以内,同时由checksum导致的问题包应该更低

InSeg<span class="variable">s:
    &#x6536;&#x5230;&#x7684;&#x6570;&#x636E;&#x5305;&#x4E2A;&#x6570;&#xFF0C;&#x5305;&#x62EC;&#x6709;&#x9519;&#x8BEF;&#x7684;&#x5305;&#x4E2A;&#x6570;
OutSeg<span class="variable">s:
    &#x53D1;&#x9001;&#x7684;&#x6570;&#x636E;&#x5305;&#x4E2A;&#x6570;
RetransSeg<span class="variable">s:
    &#x91CD;&#x4F20;&#x7684;&#x5305;&#x4E2A;&#x6570;
InErr<span class="variable">s:
    &#x6536;&#x5230;&#x7684;&#x6709;&#x95EE;&#x9898;&#x7684;&#x5305;&#x4E2A;&#x6570;
OutRst<span class="variable">s:
    &#x53D1;&#x9001;&#x7684;&#x5E26;reset&#x6807;&#x8BB0;&#x7684;&#x5305;&#x4E2A;&#x6570;
InCsumError<span class="variable">s:
    &#x6536;&#x5230;&#x7684;checksum&#x6709;&#x95EE;&#x9898;&#x7684;&#x5305;&#x4E2A;&#x6570;&#xFF0C;InErrs&#x4E2D;&#x5E94;&#x8BE5;&#x53EA;&#x6709;*&#x5C0F;&#x90E8;&#x5206;*&#x5C5E;&#x4E8E;&#x8BE5;&#x7C7B;&#x578B;
EmbryonicRst<span class="variable">s:
    &#x5728;SYN-RECV&#x72B6;&#x6001;&#x6536;&#x5230;&#x5E26;RST/SYN&#x6807;&#x8BB0;&#x7684;&#x5305;&#x4E2A;&#x6570;
</span></span></span></span></span></span></span>

syncookies一般不会被触发,只有在tcp_max_syn_backlog队列被占满时才会被触发
因此SyncookiesSent和SyncookiesRecv一般应该是0。
但是SyncookiesFailed值即使syncookies机制没有被触发,也很可能不为0。
这是因为一个处于LISTEN状态的socket收到一个不带SYN标记的数据包时,就会调
用cookie_v4_check()尝试验证cookie信息。而如果验证失败,Failed次数就加1。

SyncookiesSen<span class="variable">t:
    &#x4F7F;&#x7528;syncookie&#x6280;&#x672F;&#x53D1;&#x9001;&#x7684;syn/ack&#x5305;&#x4E2A;&#x6570;
SyncookiesRecv
    &#x6536;&#x5230;&#x643A;&#x5E26;&#x6709;&#x6548;syncookie&#x4FE1;&#x606F;&#x5305;&#x4E2A;&#x6570;
SyncookiesFailed
    &#x6536;&#x5230;&#x643A;&#x5E26;&#x65E0;&#x6548;syncookie&#x4FE1;&#x606F;&#x5305;&#x4E2A;&#x6570;
</span>

注: syncookies机制是为应对synflood攻击而被提出来的。

TIME-WAIT状态是TCP协议状态机中的重要一环,服务器设备一般都有非常多处于TIME-WAIT状态的socket
如果是在主要提供HTTP服务的设备上,TW值应该接近TcpPassiveOpens值。
一般情况下,sysctl_tcp_tw_reuse和sysctl_tcp_tw_recycle都是不推荐开启的。这里解释了为什么
所以TWKilled和TWRecycled都应该是0。
同时TCPTimeWaitOverflow也应该是0,否则就意味着内存使用方面出了大问题。

TW:
    &#x7ECF;&#x8FC7;&#x6B63;&#x5E38;&#x7684;TCP_TIMEWAIT_LEN(60s)&#x7ED3;&#x675F;TW&#x72B6;&#x6001;&#x7684;socket&#x6570;&#x91CF;
TWKilled:
    &#x7ECF;&#x8FC7;&#x66F4;&#x77ED;&#x7684;&#x65F6;&#x95F4;&#x7ED3;&#x675F;TW&#x72B6;&#x6001;&#x7684;socket&#x6570;&#x91CF;&#x3002;
    &#x53EA;&#x6709;&#x5728;net.ipv4.tcp_tw_recycle&#x5F00;&#x542F;&#x65F6;&#xFF0C;&#x8C03;&#x5EA6;TW timer&#x65F6;&#x624D;&#x53EF;&#x80FD;&#x7528;&#x66F4;&#x77ED;&#x7684;timeout&#x503C;&#x3002;
TWRecycled:
    Port&#x4ECE;TIMEWAIT socket&#x4E2D;&#x590D;&#x7528;&#x7684;&#x6B21;&#x6570;&#x3002;
    &#x53EA;&#x6709;&#x5728;sysctl_tcp_tw_reuse&#x5F00;&#x542F;&#x65F6;&#xFF0C;&#x624D;&#x53EF;&#x80FD;&#x52A0;<span class="number">1
    &#x90C1;&#x95F7;&#x7684;&#x662F;&#x4E0A;&#x9762;&#x4E24;&#x4E2A;counter&#x7684;&#x547D;&#x540D;&#x4E0E;sysctl&#x7684;&#x547D;&#x540D;&#x771F;&#x662F;&#x8D85;&#x7EA7;&#x4E0D;&#x4E00;&#x81F4;&#x554A;&#x3002;&#x56E7;<span class="keyword">...

TCPTimeWaitOverflow:
    &#x5982;&#x679C;&#x6CA1;&#x6709;&#x5185;&#x5B58;&#x5206;&#x914D;TIME-WAIT&#x7ED3;&#x6784;&#x4F53;&#xFF0C;&#x5219;&#x52A0;<span class="number">1
</span></span></span>

RTO超时对TCP性能的影响是巨大的,因此关心RTO超时的次数也非常必要。
当然3.10中的TLP机制能够减少一定量的TCPTimeouts数,将其转换为快速重传。
关于TLP的原理部分,可参考我的这篇wiki

<span class="label">TCPTimeouts:
    RTO timer&#x7B2C;&#x4E00;&#x6B21;&#x8D85;&#x65F6;&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x4EC5;&#x5305;&#x542B;&#x76F4;&#x63A5;&#x8D85;&#x65F6;&#x7684;&#x60C5;&#x51B5;
<span class="label">TCPSpuriousRTOs:
    &#x901A;&#x8FC7;F-RTO&#x673A;&#x5236;&#x53D1;&#x73B0;&#x7684;&#x865A;&#x5047;&#x8D85;&#x65F6;&#x4E2A;&#x6570;
<span class="label">TCPLossProbes:
    Probe Timeout(PTO)&#x5BFC;&#x81F4;&#x53D1;&#x9001;Tail Loss Probe (TLP)&#x5305;&#x7684;&#x6B21;&#x6570;
<span class="label">TCPLossProbeRecovery:
    &#x4E22;&#x5931;&#x5305;&#x521A;&#x597D;&#x88AB;TLP&#x63A2;&#x6D4B;&#x5305;&#x4FEE;&#x590D;&#x7684;&#x6B21;&#x6570;

</span></span></span></span>

这些计数器统计的重传包,都不是由于RTO超时导致进行的重传
如果结合RetransSegs统计来看,如果这些非RTO导致的重传占比较大的话,也算是不幸中的万幸。
另外LostRetransmit的数量应该偏低比较好,重传包如果都大量被丢弃,则真的要注意了。

<span class="label">TCPLostRetransmit:
    &#x4E22;&#x5931;&#x7684;&#x91CD;&#x4F20;SBK&#x6570;&#x91CF;&#xFF0C;&#x6CA1;&#x6709;TSO&#x65F6;&#xFF0C;&#x7B49;&#x4E8E;&#x4E22;&#x5931;&#x7684;&#x91CD;&#x4F20;&#x5305;&#x6570;&#x91CF;
<span class="label">TCPFastRetrans:
    &#x6210;&#x529F;&#x5FEB;&#x901F;&#x91CD;&#x4F20;&#x7684;SKB&#x6570;&#x91CF;
<span class="label">TCPForwardRetrans:
    &#x6210;&#x529F;ForwardRetrans&#x7684;SKB&#x6570;&#x91CF;&#xFF0C;Forward Retrans&#x91CD;&#x4F20;&#x7684;&#x5E8F;&#x53F7;&#x9AD8;&#x4E8E;retransmit_high&#x7684;&#x6570;&#x636E;
    TODO: retransmit_high&#x76EE;&#x524D;&#x7684;&#x7406;&#x89E3;&#x662F;&#x88AB;&#x6807;&#x8BB0;&#x4E3A;lost&#x7684;SKB&#x4E2D;&#xFF0C;&#x6700;&#x5927;&#x7684;end_seq&#x503C;
<span class="label">TCPSlowStartRetrans:
    &#x6210;&#x529F;&#x5728;Loss&#x72B6;&#x6001;&#x53D1;&#x9001;&#x7684;&#x91CD;&#x4F20;SKB&#x6570;&#x91CF;&#xFF0C;&#x800C;&#x4E14;&#x8FD9;&#x91CC;&#x4EC5;&#x8BB0;&#x5F55;&#x975E;RTO&#x8D85;&#x65F6;&#x8FDB;&#x5165;Loss&#x72B6;&#x6001;&#x4E0B;&#x7684;&#x91CD;&#x4F20;&#x6570;&#x91CF;
    &#x76EE;&#x524D;&#x627E;&#x5230;&#x7684;&#x4E00;&#x79CD;&#x975E;RTO&#x8FDB;&#x5165;Loss&#x72B6;&#x6001;&#x7684;&#x60C5;&#x51B5;&#x5C31;&#x662F;&#xFF1A;tcp_check_sack_reneging()&#x51FD;&#x6570;&#x53D1;&#x73B0;
    &#x63A5;&#x6536;&#x7AEF;&#x8FDD;&#x53CD;(renege)&#x4E86;&#x4E4B;&#x524D;&#x7684;SACK&#x4FE1;&#x606F;&#x65F6;&#xFF0C;&#x4F1A;&#x8FDB;&#x5165;Loss&#x72B6;&#x6001;
<span class="label">TCPRetransFail:
    &#x5C1D;&#x8BD5;FastRetrans&#x3001;ForwardRetrans&#x3001;SlowStartRetrans&#x91CD;&#x4F20;&#x5931;&#x8D25;&#x7684;&#x6B21;&#x6570;
</span></span></span></span></span>

TCP FastOpen(TFO)技术是Google提出来减少三次握手开销的技术,
核心原理就是在第一次建连时server计算一个cookies发给client,之后client向
server再次发起建连请求时就可以携带cookies信息验明正身。如果cookies验证通过,
server可以不等三次握手的最后一个ACK包就将client放在SYN包里面的数据传递给application layer。

在3.10内核中,TFO由sysctl_tcp_fastopen开关控制,默认值为0(关闭)。
而且sysctl_tcp_fastopen目前也是推荐关闭的,因为网络中有些middlebox会丢弃那些带有不认识的option的SYN包.

所以正常情况下这些值也应该都是0,当然如果收到过某些不怀好意带TFO cookies信息的SYN包,
TCPFastOpenPassive计数器就可能不为0。

<span class="label">TCPFastOpenActive:
    &#x53D1;&#x9001;&#x7684;&#x5E26;TFO cookie&#x7684;SYN&#x5305;&#x4E2A;&#x6570;
<span class="label">TCPFastOpenPassive:
    &#x6536;&#x5230;&#x7684;&#x5E26;TFO cookie&#x7684;SYN&#x5305;&#x4E2A;&#x6570;
<span class="label">TCPFastOpenPassiveFail:
    &#x4F7F;&#x7528;TFO&#x6280;&#x672F;&#x5EFA;&#x8FDE;&#x5931;&#x8D25;&#x7684;&#x6B21;&#x6570;
<span class="label">TCPFastOpenListenOverflow:
    TFO&#x8BF7;&#x6C42;&#x6570;&#x8D85;&#x8FC7;listener queue&#x8BBE;&#x7F6E;&#x7684;&#x4E0A;&#x9650;&#x5219;&#x52A0;<span class="number">1
<span class="label">TCPFastOpenCookieReqd:
    &#x6536;&#x5230;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;TFO cookies&#x7684;SYN&#x5305;&#x65F6;&#x52A0;<span class="number">1
</span></span></span></span></span></span></span>

TCP MD5 Signature选项是为提高BGP Session的安全性而提出的,详见RFC 2385
因此内核中是以编译选项,而不是sysctl接口来配置是否使用该功能的。
如果内核编译是的CONFIG_TCP_MD5SIG选项未配置,则不会支持TCPMD5Sig,下面两个计数器也就只能是0

<span class="label">TCPMD5NotFound:
    &#x5E0C;&#x671B;&#x6536;&#x5230;&#x5E26;MD5&#x9009;&#x9879;&#x7684;&#x5305;&#xFF0C;&#x4F46;&#x662F;&#x5305;&#x91CC;&#x9762;&#x6CA1;&#x6709;MD5&#x9009;&#x9879;
<span class="label">TCPMD5Unexpected:
    &#x4E0D;&#x5E0C;&#x671B;&#x6536;&#x5230;&#x5E26;MD5&#x9009;&#x9879;&#x7684;&#x5305;&#xFF0C;&#x4F46;&#x662F;&#x5305;&#x91CC;&#x9762;&#x6709;MD5&#x9009;&#x9879;
</span></span>

DelayedACK是内核中默认支持的,但即使使用DelayedACKs,每收到两个数据包也
必须发送一个ACK。所以DelayedACKs可以估算为发送出去的ACK数量的一半。
同时DelayedACKLocked反应的是应用与内核争抢socket的次数,
如果占DelayedACKs比例过大可能就需要看看应用程序是否有问题了。

<span class="label">DelayedACKs:
    &#x5C1D;&#x8BD5;&#x53D1;&#x9001;delayed ack&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x5305;&#x62EC;&#x672A;&#x6210;&#x529F;&#x53D1;&#x9001;&#x7684;&#x6B21;&#x6570;
<span class="label">DelayedACKLocked:
    &#x7531;&#x4E8E;usr&#x9501;&#x4F4F;&#x4E86;sock&#xFF0C;&#x800C;&#x65E0;&#x6CD5;&#x53D1;&#x9001;delayed ack&#x7684;&#x6B21;&#x6570;
<span class="label">DelayedACKLost:
    TODO &#x6682;&#x65F6;&#x4E0D;&#x7406;&#x89E3;&#x51C6;&#x786E;&#x542B;&#x4E49;
<span class="label">TCPSchedulerFailed:
    &#x5982;&#x679C;&#x5728;delay ack&#x5904;&#x7406;&#x51FD;&#x6570;&#x4E2D;&#x53D1;&#x73B0;prequeue&#x8FD8;&#x6709;&#x6570;&#x636E;&#xFF0C;&#x5C31;&#x52A0;<span class="number">1&#x3002;
    &#x6570;&#x636E;&#x653E;&#x5230;prequeue&#xFF0C;&#x5C31;&#x662F;&#x60F3;user&#x80FD;&#x5C3D;&#x5FEB;&#x5904;&#x7406;&#x3002;&#x5982;&#x679C;&#x4EFB;&#x7531;&#x6570;&#x636E;&#xFF0C;
    &#x5219;&#x53EF;&#x80FD;user&#x884C;&#x4E3A;&#x8C03;&#x5EA6;&#x6548;&#x679C;&#x4E0D;&#x597D;
    &#x8FD9;&#x4E2A;&#x503C;&#x5E94;&#x8BE5;&#x975E;&#x5E38;&#x63A5;&#x8FD1;&#x4E8E;&#x96F6;&#x624D;&#x6B63;&#x5E38;
</span></span></span></span></span>

该类型计数器统计的是收/发DSACK信息次数。
DSACKOldSent + DSACKOfoSent可以当做是发送出的DSACK信息的次数,而且概率上来讲
OldSent应该占比更大。
同理DSACKRecv的数量也应该远多于DSACKOfoRecv的数量。
另外DSACK信息的发送是需要sysctl_tcp_dsack开启的,如果发现sent两个计数器为零,则要检查一下了。
一般还是建议开启dsack选项

<span class="label">TCPDSACKOldSent:
    &#x5982;&#x679C;&#x6536;&#x5230;&#x7684;&#x91CD;&#x590D;&#x6570;&#x636E;&#x5305;&#x5E8F;&#x53F7;&#x6BD4;rcv_nxt(&#x63A5;&#x6536;&#x7AEF;&#x60F3;&#x6536;&#x5230;&#x7684;&#x4E0B;&#x4E00;&#x4E2A;&#x5E8F;&#x53F7;)&#x5C0F;&#xFF0C;&#x5219;&#x589E;&#x52A0;oldsent
<span class="label">TCPDSACKOfoSent:
    &#x5982;&#x679C;&#x6536;&#x5230;&#x7684;&#x91CD;&#x590D;&#x6570;&#x636E;&#x5305;&#x5E8F;&#x53F7;&#x6BD4;rcv_nxt&#x5927;&#xFF0C;&#x5219;&#x662F;&#x4E00;&#x4E2A;&#x4E71;&#x5E8F;&#x7684;&#x91CD;&#x590D;&#x6570;&#x636E;&#x5305;&#xFF0C;&#x589E;&#x52A0;ofosent
<span class="label">TCPDSACKRecv:
    &#x6536;&#x5230;&#x7684;old dsack&#x4FE1;&#x606F;&#x6B21;&#x6570;&#xFF0C;&#x5224;&#x65AD;old&#x7684;&#x65B9;&#x6CD5;&#xFF1A;dsack&#x5E8F;&#x53F7;&#x5C0F;&#x4E8E;ACK&#x53F7;
<span class="label">TCPDSACKOfoRecv:
    &#x6536;&#x5230;&#x7684;Ofo dsack&#x4FE1;&#x606F;&#x6B21;&#x6570;
<span class="label">TCPDSACKIgnoredOld:
    &#x5F53;&#x4E00;&#x4E2A;dsack block&#x88AB;&#x5224;&#x5B9A;&#x4E3A;&#x65E0;&#x6548;&#xFF0C;&#x4E14;&#x8BBE;&#x7F6E;&#x8FC7;undo_marker&#xFF0C;&#x5219;&#x52A0;<span class="number">1
<span class="label">TCPDSACKIgnoredNoUndo:
    &#x5F53;&#x4E00;&#x4E2A;dsack block&#x88AB;&#x5224;&#x5B9A;&#x4E3A;&#x65E0;&#x6548;&#xFF0C;&#x4E14;&#x672A;&#x8BBE;&#x7F6E;undo_marker&#xFF0C;&#x5219;&#x52A0;<span class="number">1
</span></span></span></span></span></span></span></span>

当发现了需要更新某条TCP流的reordering值(乱序值)时,以下计数器可能被使用到。
不过下面四个计数器为互斥关系,最少见的应该是TCPRenoReorder,毕竟sack已经被
广泛部署使用了。
TODO: 什么情况下能准确的判断出要更新reorder值呢?

<span class="label">TCPTSReorder:
    &#x5982;&#x679C;&#x662F;&#x88AB;&#x4E00;&#x4E2A;partial ack&#x786E;&#x8BA4;&#x540E;&#x9700;&#x8981;&#x66F4;&#x65B0;reorder&#x503C;&#xFF0C;&#x5219;&#x52A0;<span class="number">1
    &#x8FD9;&#x4E2A;&#x5730;&#x65B9;&#x53D6;&#x4E2A;TS&#x7684;&#x540D;&#x5B57;&#xFF0C;&#x8FD8;&#x771F;&#x662F;&#x8D39;&#x89E3;&#x3002;&#x4E0D;&#x77E5;&#x9053;&#x662F;&#x4EC0;&#x4E48;&#x7684;&#x7F29;&#x5199;&#x8868;&#x793A;&#x4E86;partial ack&#x7684;&#x542B;&#x4E49;&#x3002;
<span class="label">TCPRenoReorder:
    &#x5982;&#x679C;&#x88AB;&#x4E0D;&#x652F;&#x6301;SACK&#x7684;dupack&#x786E;&#x8BA4;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x66F4;&#x65B0;reorder&#x503C;&#xFF0C;&#x5219;&#x52A0;<span class="number">1
<span class="label">TCPFACKReorder:
    &#x5982;&#x679C;&#x5728;&#x9700;&#x8981;&#x66F4;&#x65B0;&#x65F6;&#x5224;&#x65AD;&#x652F;&#x6301;FACK&#xFF0C;&#x5219;&#x52A0;<span class="number">1
<span class="label">TCPSACKReorder:
    &#x5982;&#x679C;&#x4EC5;&#x652F;&#x6301;SACK&#xFF0C;&#x5219;&#x8BE5;&#x8BA1;&#x6570;&#x5668;&#x52A0;<span class="number">1
</span></span></span></span></span></span></span></span>
In <span class="operator">the <span class="keyword">case <span class="operator">of multiple packets dropped <span class="built_in">from <span class="operator">a single window <span class="operator">of data,
<span class="operator">the <span class="keyword">first <span class="built_in">new information available <span class="built_in">to <span class="operator">the sender comes when <span class="operator">the
sender receives <span class="operator">an acknowledgment <span class="keyword">for <span class="operator">the retransmitted packet (that
is, <span class="operator">the packet retransmitted when fast retransmit was <span class="keyword">first entered).

If there is <span class="operator">a single packet drop <span class="operator">and no reordering, <span class="keyword">then <span class="operator">the
acknowledgment <span class="keyword">for this packet will acknowledge all <span class="operator">of <span class="operator">the packets
transmitted <span class="keyword">before fast retransmit was entered.  However, <span class="keyword">if there
are multiple packet drops, <span class="keyword">then <span class="operator">the acknowledgment <span class="keyword">for <span class="operator">the
retransmitted packet will acknowledge some but <span class="operator">not all <span class="operator">of <span class="operator">the packets
transmitted <span class="keyword">before <span class="operator">the fast retransmit.  We call this acknowledgment
<span class="operator">a partial acknowledgment.

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

该类型计数器统计的进入快速重传阶段的总次数及失败次数,失败次数是指先进入了
recovery阶段,然后有RTO超时了。Fast Recovery没有成功。
首先由于SACK选项已经大面积使用,RenoRecovery的次数应该远小于SackRecovery的次数
另外fail的次数应该比例较小才比较理想

<span class="label">TCPRenoRecovery:
    &#x8FDB;&#x5165;Recovery&#x9636;&#x6BB5;&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x5BF9;&#x7AEF;&#x4E0D;&#x652F;&#x6301;SACK&#x9009;&#x9879;
<span class="label">TCPSackRecovery:
    &#x8FDB;&#x5165;Recovery&#x9636;&#x6BB5;&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x5BF9;&#x7AEF;&#x652F;&#x6301;SACK&#x9009;&#x9879;
<span class="label">TCPRenoRecoveryFail: (&#x4E5F;&#x653E;&#x5230;&#x4E86;RTO&#x6B21;&#x6570;&#x7C7B;&#x522B;)
    &#x5148;&#x8FDB;&#x5165;Recovery&#x9636;&#x6BB5;&#xFF0C;&#x7136;&#x540E;&#x53C8;RTO&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x5BF9;&#x7AEF;&#x4E0D;&#x652F;&#x6301;SACK&#x9009;&#x9879;
<span class="label">TCPSackRecoveryFail:(&#x4E5F;&#x653E;&#x5230;&#x4E86;RTO&#x6B21;&#x6570;&#x7C7B;&#x522B;)
    &#x5148;&#x8FDB;&#x5165;Recovery&#x9636;&#x6BB5;&#xFF0C;&#x7136;&#x540E;&#x53C8;RTO&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x5BF9;&#x7AEF;&#x652F;&#x6301;SACK&#x9009;&#x9879;
</span></span></span></span>

abort本身是一种很严重的问题,因此是否有必要关心这些计数器
后三个计数器如果不为0,则往往意味着系统发生了较为严重的问题,需要格外注意

<span class="label">TCPAbortOnClose:
    &#x5982;&#x679C;&#x8C03;&#x7528;tcp_close()&#x5173;&#x95ED;socket&#x65F6;&#xFF0C;recv buffer&#x4E2D;&#x8FD8;&#x6709;&#x6570;&#x636E;&#xFF0C;&#x5219;&#x52A0;<span class="number">1
    &#x6B64;&#x65F6;&#x4F1A;&#x4E3B;&#x52A8;&#x53D1;&#x9001;&#x4E00;&#x4E2A;reset&#x5305;&#x7ED9;&#x5BF9;&#x7AEF;
<span class="label">TCPAbortOnData:
    &#x5982;&#x679C;&#x5728;FIN_WAIT_1&#x548C;FIN_WAIT_2&#x72B6;&#x6001;&#x4E0B;&#x6536;&#x5230;&#x540E;&#x7EED;&#x6570;&#x636E;&#xFF0C;&#x6216;TCP_LINGER2&#x8BBE;&#x7F6E;&#x5C0F;&#x4E8E;<span class="number">0&#xFF0C;&#x5219;&#x8BA1;&#x6570;&#x5668;&#x52A0;<span class="number">1
<span class="label">TCPAbortOnTimeout:
    &#x56E0;&#x5404;&#x79CD;&#x8BA1;&#x65F6;&#x5668;(RTO/PTO/keepalive)&#x7684;&#x91CD;&#x4F20;&#x6B21;&#x6570;&#x8D85;&#x8FC7;&#x4E0A;&#x9650;&#xFF0C;&#x800C;&#x5173;&#x95ED;&#x8FDE;&#x63A5;&#x65F6;&#xFF0C;&#x8BA1;&#x6570;&#x5668;&#x52A0;<span class="number">1
<span class="label">TCPAbortOnMemory:
    &#x5982;&#x679C;orphan socket&#x6570;&#x91CF;&#x6216;&#x8005;tcp_memory_allocated&#x8D85;&#x8FC7;&#x4E0A;&#x9650;&#xFF0C;&#x5219;&#x52A0;<span class="number">1
    &#x4E00;&#x822C;&#x503C;&#x4E3A;<span class="number">0
<span class="label">TCPAbortOnLinger:
    tcp_close()&#x4E2D;&#xFF0C;&#x56E0;tp->linger2&#x88AB;&#x8BBE;&#x7F6E;&#x5C0F;&#x4E8E;<span class="number">0&#xFF0C;&#x5BFC;&#x81F4;FIN_WAIT_2&#x7ACB;&#x5373;&#x5207;&#x6362;&#x5230;CLOSE&#x72B6;&#x6001;&#x7684;&#x6B21;&#x6570;
    &#x4E00;&#x822C;&#x503C;&#x4E3A;<span class="number">0
<span class="label">TCPAbortFailed:
    &#x5982;&#x679C;&#x5728;&#x51C6;&#x5907;&#x53D1;&#x9001;reset&#x65F6;&#xFF0C;&#x5206;&#x914D;SKB&#x6216;&#x8005;&#x53D1;&#x9001;SKB&#x5931;&#x8D25;&#xFF0C;&#x5219;&#x52A0;<span class="number">1
    &#x4E00;&#x822C;&#x503C;&#x4E3A;<span class="number">0
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span class="built_in">c. &#x5F53;rcv_buf&#x4E0D;&#x8DB3;&#x65F6;&#x53EF;&#x80FD;&#x9700;&#x8981;prune ofo queue, &#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4;<span class="type">PruneCalled&#x8BA1;&#x6570;&#x5668;&#x589E;&#x52A0;&#xFF1B;
   &#x5F53;&#x4E00;&#x822C;&#x90FD;&#x5E94;&#x8BE5;&#x901A;&#x8FC7;collapse&#x8282;&#x7701;&#x5185;&#x5B58;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF0C;&#x5E76;&#x4E0D;&#x9700;&#x8981;&#x771F;&#x6B63;&#x7684;prune&#x6389;&#x88AB;<span class="type">SACK&#x7684;&#x6570;&#x636E;&#x3002;
   &#x6240;&#x4EE5;<span class="type">OfoPruned&#x548C;&#x66F4;&#x4E25;&#x91CD;&#x7684;<span class="type">RcvPruned&#x90FD;&#x5E94;&#x8BE5;&#x8BA1;&#x6570;&#x4E3A;<span class="number">0&#x3002;
</span></span></span></span></span></span>

Original: https://www.cnblogs.com/x_wukong/p/10922190.html
Author: 明明是悟空
Title: netstat -st输出解析(二)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553986/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 利用DbgHelp获取线程的栈回溯信息

    当线程发生异常时,我们如果可以记录下来异常线程的堆栈信息,那么对于我们后续问题处理将会有极大的帮助。这里记录一个操作方法。 1 #include 2 #include 3 #inc…

    技术杂谈 2023年7月11日
    073
  • dremio 的InformationSchemaCatalog 服务二

    public class InformationSchemaRecordReader extends AbstractRecordReader { private static f…

    技术杂谈 2023年5月30日
    078
  • 运算符(2)

    运算符 算术运算符补充 +的作用: 表示正数(省略不写) 表示相加操作 进行字符串的拼接:+号左右两侧的任意一侧有字符串,那么这个加号就是字符串拼接的作用,结果一定是字符串 【2】…

    技术杂谈 2023年7月11日
    060
  • Worktile 技术架构概要

    其实早就该写这篇博客了,一直说忙于工作没有时间,其实时间挤挤总会有的,可能就是因为懒吧!从2013年11月一直拖到现在,今天就简单谈谈 Worktile 的技术架构吧 。 Work…

    技术杂谈 2023年5月31日
    093
  • 计算机网络基础

    计算机网络基础 计算机网络的定义和功能 计算机网络是利用通信设备和线路,将分布在地理位置不同的、功能独立的多个计算机系统连接起来,以功能完善的网络软件(网络通信协议及网络操作系统等…

    技术杂谈 2023年7月25日
    062
  • SpringBoot整合参数校验的两种方式应用实践

    背景:SpringBoot秒杀小项目实现了两种参数校验方式1.原登录业务逻辑处理使用的正则表达式校验手机号格式输入(未使用Validation参数校验,只是简单实现)2.更改业务逻…

    技术杂谈 2023年7月25日
    078
  • python入门基础(6)–语句基础(if语句、while语句)

    一、if语句 if 语句让你能够检查程序的当前状态,并据此采取相应的措施。if语句可应用于列表,以另一种方式处理列表中的大多数元素,以及特定值的元素1、简单示例 names=[‘x…

    技术杂谈 2023年7月25日
    051
  • 创建PO提示错误:计税时出错。请解决此问题或与您的系统管理员联系。

    问题:创建PO提示错误:计税时出错。请解决此问题或与您的系统管理员联系。 解决方法:维护汇率和打开期间 Original: https://www.cnblogs.com/quan…

    技术杂谈 2023年6月1日
    0122
  • 小知识:vi如何使用列编辑模式快速插入

    经常需要用到列编辑这种操作,现在很多超文本的编辑器都可以轻松实现。但有时需要在vi界面直接使用,但是vi的列编辑操作因不常使用总是忘记现查。这次干脆记录下加深印象。vi编辑某个文本…

    技术杂谈 2023年5月31日
    0117
  • 【转载】win10任意地方右键打开cmd

    创建一个文件叫 xx.reg,复制以下内容到里面,保存后双击即可; 空白处右键就会出现cmd_here,可以自己改这个名称 Windows Registry Editor Vers…

    技术杂谈 2023年6月1日
    084
  • Maven打包失败

    [ERROR] /G:/12.Java����/SpringBoot-learning/seckill-demo/src/main/java/com/chenhf/config/U…

    技术杂谈 2023年7月24日
    065
  • 千古前端图文教程-HTML010-HTML5详解3

    HTML5详解3 HTML5详解3 Web 存储 #H5 中有两种存储的方式 #Web 存储的特性 #常见 API 案例:记住用户名和密码 网络状态 应用缓存 #优势 # cach…

    技术杂谈 2023年7月11日
    094
  • 快速模幂算法

    快速模幂算法就是将指数变成二进制数来计算,每次按照底数的二进制次方进行计算,因为底数相乘指数相加,又模和乘可以相互变化,所以最后可以一边模一边乘,最后得出的结果还是正确的。 例如:…

    技术杂谈 2023年6月21日
    097
  • zabbix4.0本地安装详解及步骤

    安装前说明下,下面安装过程中涉及selinux部分仅供参考,可能会导致启动服务时产生各种报错,作者也是在折腾了无数日夜后报错不断而放弃治疗,直接永久关闭了selinux(啊,没有s…

    技术杂谈 2023年7月23日
    067
  • 触发器设置递归

    –RECURSIVE_TRIGGERS 的设置 递归ALTER DATABASE Platform_QuotaCompile6 SET RECURSIVE_TRIGGE…

    技术杂谈 2023年5月31日
    087
  • 博客园配置Metaweblog访问令牌

    如何配置Metaweblog访问令牌?如何通过访问令牌登录博客园? 最近博客园升级了 Metaweblog访问令牌 ,发布博客时 使用密码不能发布了; 如何更新呢? 进入后台 设置…

    技术杂谈 2023年5月31日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球