How to Trace TCP Socket TCP_INFO tcpi_retrans_syn Drop Bursts in Linux Using eBPF

In high-throughput Linux network stacks, connection establishment failures often surface as subtle latency spikes long before service endpoints experience connection timeouts. The Linux kernel tracks SYN retransmission attempts within the tcp_info structure via the tcpi_retrans_syn counter. By leveraging extended Berkeley Packet Filter (eBPF) tracing scripts, systems engineers can observe SYN drop bursts with sub-microsecond precision directly at kernel hooks, bypassing passive polling latency.

Understanding tcpi_retrans_syn Mechanics in the Kernel Stack

When an active socket initiates a TCP handshake via tcp_connect(), the kernel arms the retransmission timer. If no corresponding SYN-ACK packet arrives within the initial timeout interval (governed by tcp_syn_retries), tcp_retransmit_skb() executes, incrementing tcpi_retrans_syn inside the socket structure. Bursts of these events indicate intermediate packet loss, SYN-flood protection drops, or queue congestion on top-of-rack switches.

Authoring a Custom eBPF Tracer with bpftrace

Using bpftrace allows rapid prototyping of kernel instrumentation without the complexity of compiling dedicated C programs and loading BPF bytecode manually. The following script monitors tcp_retransmit_skb, filters for initial connection requests, and correlates drops with process IDs and remote addresses:

#!/usr/bin/env bpftrace

#include <net/sock.h>
#include <linux/tcp.h>

kprobe:tcp_retransmit_skb
{
  $sk = (struct sock *)arg0;
  $inet_sk = (struct inet_sock *)arg0;
  $tp = (struct tcp_sock *)arg0;

  // Check if socket is in SYN_SENT state
  if ($sk->__sk_common.skc_state == 2) {
    $daddr = ntop($inet_sk->skc_daddr);
    $dport = bswap($inet_sk->skc_dport);
    $syn_retries = $tp->total_retrans;

    printf("%-8s %-6d %-16s -> %s:%-5d [SYN Retrans Count: %d]
",
      comm, pid, $inet_sk->skc_prot->name, $daddr, $dport, $syn_retries);
    
    @syn_drop_bursts[$daddr] = count();
  }
}

interval:s:10
{
  time("%H:%M:%S ");
  print(@syn_drop_bursts);
  clear(@syn_drop_bursts);
}

Running and Interpreting Kernel Traces

Deploy the script on production or staging environments with administrative privileges:

sudo bpftrace syn_retrans_trace.bt

When connection bursts occur, the output aggregates drop events by destination IP address:

16:40:02 @syn_drop_bursts[192.0.2.14]: 42
16:40:02 @syn_drop_bursts[198.51.100.8]: 18

Remediation Strategies for SYN Retransmission Spikes

When high concentrations of SYN retransmissions are detected, evaluate kernel sysctl tuneables:

  • net.ipv4.tcp_syn_retries: Lower the limit to fail fast when failover mechanisms exist.
  • net.ipv4.tcp_max_syn_backlog: Increase backlog size if inbound connections overwhelm the listen queue.
  • net.core.somaxconn: Scale system-wide socket connection limits to prevent listener queue overflows.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.