aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/networking/snmp_counter.rst
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/networking/snmp_counter.rst')
-rw-r--r--Documentation/networking/snmp_counter.rst130
1 files changed, 125 insertions, 5 deletions
diff --git a/Documentation/networking/snmp_counter.rst b/Documentation/networking/snmp_counter.rst
index b0dfdaaca512..fe8f741193be 100644
--- a/Documentation/networking/snmp_counter.rst
+++ b/Documentation/networking/snmp_counter.rst
@@ -336,7 +336,26 @@ time client replies ACK, this socket will get another chance to move
336to the accept queue. 336to the accept queue.
337 337
338 338
339TCP Fast Open 339* TcpEstabResets
340Defined in `RFC1213 tcpEstabResets`_.
341
342.. _RFC1213 tcpEstabResets: https://tools.ietf.org/html/rfc1213#page-48
343
344* TcpAttemptFails
345Defined in `RFC1213 tcpAttemptFails`_.
346
347.. _RFC1213 tcpAttemptFails: https://tools.ietf.org/html/rfc1213#page-48
348
349* TcpOutRsts
350Defined in `RFC1213 tcpOutRsts`_. The RFC says this counter indicates
351the 'segments sent containing the RST flag', but in linux kernel, this
352couner indicates the segments kerenl tried to send. The sending
353process might be failed due to some errors (e.g. memory alloc failed).
354
355.. _RFC1213 tcpOutRsts: https://tools.ietf.org/html/rfc1213#page-52
356
357
358TCP Fast Path
340============ 359============
341When kernel receives a TCP packet, it has two paths to handler the 360When kernel receives a TCP packet, it has two paths to handler the
342packet, one is fast path, another is slow path. The comment in kernel 361packet, one is fast path, another is slow path. The comment in kernel
@@ -383,8 +402,6 @@ increase 1.
383 402
384TCP abort 403TCP abort
385======== 404========
386
387
388* TcpExtTCPAbortOnData 405* TcpExtTCPAbortOnData
389It means TCP layer has data in flight, but need to close the 406It means TCP layer has data in flight, but need to close the
390connection. So TCP layer sends a RST to the other side, indicate the 407connection. So TCP layer sends a RST to the other side, indicate the
@@ -545,7 +562,6 @@ packet yet, the sender would know packet 4 is out of order. The TCP
545stack of kernel will increase TcpExtTCPSACKReorder for both of the 562stack of kernel will increase TcpExtTCPSACKReorder for both of the
546above scenarios. 563above scenarios.
547 564
548
549DSACK 565DSACK
550===== 566=====
551The DSACK is defined in `RFC2883`_. The receiver uses DSACK to report 567The DSACK is defined in `RFC2883`_. The receiver uses DSACK to report
@@ -566,13 +582,63 @@ The TCP stack receives an out of order duplicate packet, so it sends a
566DSACK to the sender. 582DSACK to the sender.
567 583
568* TcpExtTCPDSACKRecv 584* TcpExtTCPDSACKRecv
569The TCP stack receives a DSACK, which indicate an acknowledged 585The TCP stack receives a DSACK, which indicates an acknowledged
570duplicate packet is received. 586duplicate packet is received.
571 587
572* TcpExtTCPDSACKOfoRecv 588* TcpExtTCPDSACKOfoRecv
573The TCP stack receives a DSACK, which indicate an out of order 589The TCP stack receives a DSACK, which indicate an out of order
574duplicate packet is received. 590duplicate packet is received.
575 591
592invalid SACK and DSACK
593====================
594When a SACK (or DSACK) block is invalid, a corresponding counter would
595be updated. The validation method is base on the start/end sequence
596number of the SACK block. For more details, please refer the comment
597of the function tcp_is_sackblock_valid in the kernel source code. A
598SACK option could have up to 4 blocks, they are checked
599individually. E.g., if 3 blocks of a SACk is invalid, the
600corresponding counter would be updated 3 times. The comment of the
601`Add counters for discarded SACK blocks`_ patch has additional
602explaination:
603
604.. _Add counters for discarded SACK blocks: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=18f02545a9a16c9a89778b91a162ad16d510bb32
605
606* TcpExtTCPSACKDiscard
607This counter indicates how many SACK blocks are invalid. If the invalid
608SACK block is caused by ACK recording, the TCP stack will only ignore
609it and won't update this counter.
610
611* TcpExtTCPDSACKIgnoredOld and TcpExtTCPDSACKIgnoredNoUndo
612When a DSACK block is invalid, one of these two counters would be
613updated. Which counter will be updated depends on the undo_marker flag
614of the TCP socket. If the undo_marker is not set, the TCP stack isn't
615likely to re-transmit any packets, and we still receive an invalid
616DSACK block, the reason might be that the packet is duplicated in the
617middle of the network. In such scenario, TcpExtTCPDSACKIgnoredNoUndo
618will be updated. If the undo_marker is set, TcpExtTCPDSACKIgnoredOld
619will be updated. As implied in its name, it might be an old packet.
620
621SACK shift
622=========
623The linux networking stack stores data in sk_buff struct (skb for
624short). If a SACK block acrosses multiple skb, the TCP stack will try
625to re-arrange data in these skb. E.g. if a SACK block acknowledges seq
62610 to 15, skb1 has seq 10 to 13, skb2 has seq 14 to 20. The seq 14 and
62715 in skb2 would be moved to skb1. This operation is 'shift'. If a
628SACK block acknowledges seq 10 to 20, skb1 has seq 10 to 13, skb2 has
629seq 14 to 20. All data in skb2 will be moved to skb1, and skb2 will be
630discard, this operation is 'merge'.
631
632* TcpExtTCPSackShifted
633A skb is shifted
634
635* TcpExtTCPSackMerged
636A skb is merged
637
638* TcpExtTCPSackShiftFallback
639A skb should be shifted or merged, but the TCP stack doesn't do it for
640some reasons.
641
576TCP out of order 642TCP out of order
577=============== 643===============
578* TcpExtTCPOFOQueue 644* TcpExtTCPOFOQueue
@@ -662,6 +728,60 @@ unacknowledged number (more strict than `RFC 5961 section 5.2`_).
662.. _RFC 5961 section 4.2: https://tools.ietf.org/html/rfc5961#page-9 728.. _RFC 5961 section 4.2: https://tools.ietf.org/html/rfc5961#page-9
663.. _RFC 5961 section 5.2: https://tools.ietf.org/html/rfc5961#page-11 729.. _RFC 5961 section 5.2: https://tools.ietf.org/html/rfc5961#page-11
664 730
731TCP receive window
732=================
733* TcpExtTCPWantZeroWindowAdv
734Depending on current memory usage, the TCP stack tries to set receive
735window to zero. But the receive window might still be a no-zero
736value. For example, if the previous window size is 10, and the TCP
737stack receives 3 bytes, the current window size would be 7 even if the
738window size calculated by the memory usage is zero.
739
740* TcpExtTCPToZeroWindowAdv
741The TCP receive window is set to zero from a no-zero value.
742
743* TcpExtTCPFromZeroWindowAdv
744The TCP receive window is set to no-zero value from zero.
745
746
747Delayed ACK
748==========
749The TCP Delayed ACK is a technique which is used for reducing the
750packet count in the network. For more details, please refer the
751`Delayed ACK wiki`_
752
753.. _Delayed ACK wiki: https://en.wikipedia.org/wiki/TCP_delayed_acknowledgment
754
755* TcpExtDelayedACKs
756A delayed ACK timer expires. The TCP stack will send a pure ACK packet
757and exit the delayed ACK mode.
758
759* TcpExtDelayedACKLocked
760A delayed ACK timer expires, but the TCP stack can't send an ACK
761immediately due to the socket is locked by a userspace program. The
762TCP stack will send a pure ACK later (after the userspace program
763unlock the socket). When the TCP stack sends the pure ACK later, the
764TCP stack will also update TcpExtDelayedACKs and exit the delayed ACK
765mode.
766
767* TcpExtDelayedACKLost
768It will be updated when the TCP stack receives a packet which has been
769ACKed. A Delayed ACK loss might cause this issue, but it would also be
770triggered by other reasons, such as a packet is duplicated in the
771network.
772
773Tail Loss Probe (TLP)
774===================
775TLP is an algorithm which is used to detect TCP packet loss. For more
776details, please refer the `TLP paper`_.
777
778.. _TLP paper: https://tools.ietf.org/html/draft-dukkipati-tcpm-tcp-loss-probe-01
779
780* TcpExtTCPLossProbes
781A TLP probe packet is sent.
782
783* TcpExtTCPLossProbeRecovery
784A packet loss is detected and recovered by TLP.
665 785
666examples 786examples
667======= 787=======