继续讲述/proc/net/netstat, /proc/net/snmp中TCP的故事。
TCP Congestion Processing
类别 | 名称 | 描述 |
---|---|---|
TcpExt | TCPDSACKUndo | tcp_ack() -> tcp_fastretrans_alert() -> tcp_try_undo_dsack() Disorder状态下,undo完成(undo_retrans == 0)的次数。 |
TcpExt | TCPFullUndo | tcp_ack() -> tcp_fastretrans_alert() -> tcp_try_undo_recovery() Recovery状态时,接收到到全部确认(snd_una >= high_seq)后且已经undo完成(undo_retrans == 0)的次数。 |
TcpExt | TCPPartialUndo | tcp_ack() -> tcp_fastretrans_alert() -> tcp_undo_partial() Recovery状态时,接收到到部分确认(snd_una < high_seq)时但已经undo完成(undo_retrans == 0)的次数。 |
TcpExt | TCPLossUndo | tcp_ack() -> tcp_fastretrans_alert() -> tcp_try_undo_loss() Loss状态时,接收到到全部确认(snd_una >= high_seq)后且已经undo完成(undo_retrans == 0)的次数。 |
TcpExt | TCPRenoReorder | 在tcp_update_reordering()中更新,当metric > tp->reordering并且没有启用SACK,本计数器加1 综合来说,在sacked_out“不可靠”时,tp->reordering被更新为当前窗口中的“已用seg”个数,同时包括未确认(和已确认的?)数据,但不包括lost_out。
A. tcp_ack() -> tcp_fastretrans_alert() -> tcp_add_reno_sack() -> tcp_check_reno_reordering() -> tcp_update_reordering(): 注:
|
TcpExt | TCPSACKReorder | 在tcp_update_reordering()中更新,当metric > tp->reordering并且启用SACK但关闭FACK时,本计数器加1 A. tcp_ack() -> tcp_sacktag_write_queue() -> tcp_update_reordering() 在tcp_sacktag_walk()中会计算fackets_out(通过累加state.fack_count),这个值即从snd_una开始到已经SACK的最高序号间的seg数量(包括没有被SACK覆盖的)。判断发生乱序的条件是: (1)发现针对重传报文的D-SACK;(2)当前接收到SACK序号比以前接收到的最大SACK序号小。state.reord是发生乱序时的最小fack_count,即在“snd_una + fack_count”处发生了乱序。 metric = tp->fackets_out – state.reord,即可能发生乱序的最多报文数。 B. tcp_ack() -> tcp_clean_rtx_queue() -> tcp_update_reordering() 与A.类似,tcp_clean_rtx_queue()计算rtx queue中被SACK过的数据(非重传)中空洞,reord保存“最小号”空洞的位置(在重传队列中的“座次”)。而prior_fackets – reord即可能发生乱序的TCP segments数量。如果没有SACK,reorder = prior_fackets = 0 metric = prior_fackets – reord |
TcpExt | TCPFACKReorder | 与TCPSACKReorder类似,如果同时启用了SACK和FACK,就增加本计数器。 |
TcpExt | TCPTSReorder | tcp_ack() -> tcp_fastretrans_alert() -> tcp_undo_partial() -> tcp_update_reordering() Recovery状态时,接收到到部分确认(snd_una < high_seq)时但已经undo完成(undo_retrans == 0)的次数。 数量上与TCPPartialUndo相等。 |
TCP Others
类别 | 名称 | 描述 |
---|---|---|
TcpExt | TCPRenoRecoveryFail | tcp_retransmit_timer(): 在Reovery状态下发生RTO,并且没有启用SACK,加1 |
TcpExt | TCPRenoFailures | tcp_retransmit_timer(): 在Reorder状态下,或者sacked_out不为0时,发生RTO,并且没有启用SACK,加1 |
TcpExt | TCPRenoRecovery | tcp_fastretrans_alert(): 不使用SACK的TCP进入Reovery状态的次数 |
TcpExt | ArpFilter | arp_rcv() -> NETFILTER(ARP_IN) -> arp_process() 与TCP无关,接收到ARP packet时做一次输出路由查找(sip, tip),如果找到的路由项的device与输入device的不同,计数器加1 |
TcpExt | EmbryonicRsts | tcp_v4_do_rcv() -> tcp_v4_hnd_req() -> tcp_check_req(): 在三手握手时的SYN_RECV状态中接收到RST或者SYN的次数。 |
TcpExt | LockDroppedIcmps | tcp_v4_err(): 接收到ICMP错误报文,但tcp socket被user锁住 |
TcpEx | OfoPruned | tcp_data_queue() -> tcp_try_rmem_schedule() 慢速路径中,如果不能将数据直接复制到user space,需要加入到sk_receive_queue前,会检查receiver side memory是否允许,如果rcv_buf不足就可能prune ofo queue。此时计数器加1 |
TcpExt | OutOfWindowIcmps | tcp_v4_err(): 接收到的ICMP,但ICMP中的TCP头序号不在接收窗口之内的次数,有两个可能情况:(1)LISTEN状态时,序号不等待ISN;(2)其他状态时,序号不在SND_UNA .. SND_NXT之间 |
TcpExt | PAWSActive | tcp_rcv_synsent_state_process(): 在发送SYN后,接收到ACK,但PAWS检查失败的次数。 |
TcpExt | PAWSEstab | tcp_validate_incoming() tcp_timewait_state_process() tcp_check_req() 输入包PAWS失败次数。 |
TcpExt | PAWSPassive | tcp_v4_conn_request(): 三路握手最后一个ACK的PAWS检查失败次数。 |
TcpExt | PruneCalled | tcp_data_queue() -> tcp_try_rmem_schedule() 慢速路径中,如果不能将数据直接复制到user space,需要加入到sk_receive_queue前,会检查receiver side memory是否允许,如果rcv_buf不足就可能prune ofo queue。此时计数器加1 |
TcpExt | RcvPruned | tcp_data_queue() -> tcp_try_rmem_schedule() 慢速路径中,如果不能将数据直接复制到user space,需要加入到sk_receive_queue前,会检查receiver side memory是否允许,如果rcv_buf不足就可能prune receive queue,如果prune失败了,此计数器加1。 |
TcpExt | SyncookiesFailed | cookie_v4_check(): SYN cookie检查失败次数。 |
TcpExt | SyncookiesRecv | cookie_v4_check(): 接收SYN cookie次数。 |
TcpExt | SyncookiesSent | cookie_v4_init_sequence(): 生成SYN cookie次数。 |
TcpExt | TCPAbortFailed | tcp_send_active_reset(): alloc_skb()或者tcp_transmit_skb()失败。 |
TcpExt | TCPAbortOnClose | tcp_close(): sk_receive_queue中仍有数据的次数。 |
TcpExt | TCPAbortOnData | tcp_rcv_state_process(): 在FIN_WAIT_1/FIN_WAIT_2状态下接收到后续数据(序号>RCV_NXT);或者,TCP_LINGER2设置值<0,计数器加1 tcp_close(): 没有未读数据,但设置了SO_LINGER并且linger timeout=0, 计数器加1,此时TCP正常断开连接sk_prot->disconnect()。 |
TcpExt | TCPAbortOnLinger | tcp_close(): 因TCP_LINGER2设置值<0,FIN_WAIT_2立即切换到CLOSE的次数。 |
TcpExt | TCPAbortOnMemory | 在执行tcp_close()/probe timer/keepalive timer时,orphan sockets数量和tcp_memory_allocated是否超过最大值的次数。 |
TcpExt | TCPAbortOnSyn | tcp_validate_incoming(): 出现SYN,并且序号大于RCV_NXT的次数。 |
TcpExt | TCPAbortOnTimeout | RTO/probe/keepalive timer到达最大重试次数或者最长重试时间的次数 |
转载请注明:爱开源 » TCP SNMP counters (二)