sequenceDiagram participant Client as FetchClient participant Fetcher as StateFetcher participant State as NetworkState participant Session as Active Peer Session participant Peers as PeerManager loop Send Request, retry if retriable and remaining retries Client->>Fetcher: DownloadRequest{GetHeaders, GetBodies} Note over Client,Fetcher: Request and oneshot Sender sent via `request_tx` channel loop Process buffered requests State->>Fetcher: poll action Fetcher->>Fetcher: Select Available Peer Note over Fetcher: Peer is available if it's currently idle, no inflight requests Fetcher->>State: FetchAction::BlockDownloadRequest State->>Session: Delegate Request Note over State,Session: Request and oneshot Sender sent via `to_session_tx` channel end Session->>Session: Send Request to remote Session->>Session: Enforce Request timeout Session-->>State: Send Response Result via channel State->>Fetcher: Delegate Response Fetcher-->>Client: Send Response via channel opt Bad Response Client->>Peers: Penalize Peer end Peers->>Peers: Apply Reputation Change opt reputation dropped below threshold Peers->>State: Disconnect Session State->>Session: Delegate Disconnect end end