Hacker DirectoryHacker Directory

WEB / WEB-04.03

Connection closure and UDP

Follow directional TCP closure through FIN/RST and read the different scope of UDP datagrams.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mechanism

Read every scenario without motion

Ordinary FIN close

  1. Both directions open

    This fixture starts with earlier data already acknowledged; subsequent steps follow the selected FIN and half-close boundaries.

    Client transport
    ESTABLISHED; next SEQ=1007
    Server transport
    ESTABLISHED; next SEQ=7001
  2. Client local close

    The client finished sending; its peer has not received FIN.

    Client transport
    FIN-WAIT-1; FIN prepared SEQ=1007
    Server transport
    ESTABLISHED; next SEQ=7001
  3. Client FIN at server

    The server learned sender EOF and entered CLOSE-WAIT; its own application has not closed.

    Client transport
    FIN-WAIT-1; FIN prepared SEQ=1007
    Server transport
    CLOSE-WAIT; client EOF; ACK=1008 prepared
  4. FIN ACK at client

    The client learned its FIN was acknowledged and can still receive from the server.

    Client transport
    FIN-WAIT-2; ACK1008 received
    Server transport
    CLOSE-WAIT; client EOF; ACK=1008 prepared
  5. Server local close

    The server application also finished sending; LAST-ACK and FIN7001 are prepared.

    Client transport
    FIN-WAIT-2; ACK1008 received
    Server transport
    LAST-ACK; FIN prepared SEQ=7001
  6. Server FIN at client

    The client received peer EOF, entered TIME-WAIT and prepared ACK7002.

    Client transport
    TIME-WAIT; server EOF; ACK7002 prepared
    Server transport
    LAST-ACK; FIN prepared SEQ=7001
  7. Final ACK at server

    The server received acknowledgment of its FIN and closed; the client remains TIME-WAIT.

    Client transport
    TIME-WAIT; server EOF; ACK7002 prepared
    Server transport
    CLOSED; final ACK7002 received
  8. Local 2×MSL boundary

    The selected 60-second elapsed condition is local, not a packet; no OS clock is executed.

    Client transport
    CLOSED; selected 2MSL elapsed
    Server transport
    CLOSED; final ACK7002 received

Half-close reply

  1. Both directions open

    This fixture starts with earlier data already acknowledged; subsequent steps follow the selected FIN and half-close boundaries.

    Client transport
    ESTABLISHED; next SEQ=1007
    Server transport
    ESTABLISHED; next SEQ=7001
  2. Client local close

    The client finished sending; its peer has not received FIN.

    Client transport
    FIN-WAIT-1; FIN prepared SEQ=1007
    Server transport
    ESTABLISHED; next SEQ=7001
  3. Client FIN at server

    The server learned sender EOF and entered CLOSE-WAIT; its own application has not closed.

    Client transport
    FIN-WAIT-1; FIN prepared SEQ=1007
    Server transport
    CLOSE-WAIT; client EOF; ACK=1008 prepared
  4. FIN ACK at client

    The client learned its FIN was acknowledged and can still receive from the server.

    Client transport
    FIN-WAIT-2; ACK1008 received
    Server transport
    CLOSE-WAIT; client EOF; ACK=1008 prepared
  5. Server response prepared locally

    The CLOSE-WAIT server prepared response OK without its own FIN.

    Client transport
    FIN-WAIT-2; ACK1008 received
    Server transport
    CLOSE-WAIT; OK prepared SEQ7001 len2
  6. Response data arrival

    The client receives OK despite its closed sending direction; next expected server sequence is 7003.

    Client transport
    FIN-WAIT-2; received OK; ACK7003 prepared
    Server transport
    CLOSE-WAIT; OK prepared SEQ7001 len2
  7. Response ACK arrival

    The server received its data ACK; the trace ends before full close.

    Client transport
    FIN-WAIT-2; received OK; ACK7003 prepared
    Server transport
    CLOSE-WAIT; OK acknowledged; own FIN not sent

Local application abort

  1. Established abort context

    This branch describes a selected local abort of an existing connection.

    Client transport
    ESTABLISHED; next SEQ=1007
    Server transport
    ESTABLISHED; next SEQ=7001
  2. Server local abort

    The server application selected abort; local state closed and a valid reset indication is prepared.

    Client transport
    ESTABLISHED; next SEQ=1007
    Server transport
    CLOSED; local application abort; reset prepared
  3. Valid reset arrival

    An assumed-valid reset arrived at the client. The client is CLOSED; this is not a graceful FIN exchange.

    Client transport
    CLOSED; accepted valid reset; app not yet notified
    Server transport
    CLOSED; local application abort; reset prepared
  4. Local application notification

    The application learns the abort outcome, without proof of business rollback or peer commit.

    Client transport
    CLOSED; application notified of abort
    Server transport
    CLOSED; local application abort; reset prepared

UDP datagram

  1. UDP datagram context

    A UDP endpoint pair is selected; TCP state names do not apply.

    Client transport
    UDP 192.0.2.10:53000; datagram absent
    Server transport
    UDP 198.51.100.200:53001; datagram absent
  2. Local PING preparation

    ASCII PING occupies four bytes and the UDP header eight, giving length 12. No checksum number is supplied because a complete datagram is not encoded.

    Client transport
    UDP PING prepared; length=12
    Server transport
    UDP 198.51.100.200:53001; datagram absent
  3. UDP datagram arrival

    The selected datagram arrived at the server; UDP does not automatically generate ACK or an application reply.

    Client transport
    UDP PING prepared; length=12
    Server transport
    UDP PING received; boundary preserved; app unread
  4. Local datagram read

    The application consumes PING, without an invented PONG or delivery guarantee.

    Client transport
    UDP PING prepared; length=12
    Server transport
    UDP app read PING; no response modeled

ACTORS · STATE · DATA FLOW

Leaving established state proceeds separately by direction

TCP is full-duplex: an endpoint may finish sending while continuing to receive in the other direction. A CLOSE intent is distinct from FIN reaching the peer. Our example starts with earlier data acknowledged, client next sequence 1007, server next sequence 7001 and both peers ESTABLISHED.

A local client close enters FIN-WAIT-1. Its payload-free FIN at SEQ=1007 consumes one sequence position. On FIN arrival the server enters CLOSE-WAIT, while the client stays FIN-WAIT-1 until acknowledgment arrives. State names describe each endpoint’s knowledge rather than one global label.

FIN says the sender has no more data

The server acknowledges client FIN with ACK=1008. Arrival of that ACK moves the client to FIN-WAIT-2. If the server application has not closed its sending side, it may remain in CLOSE-WAIT and send response bytes. In the half-close branch it sends OK at SEQ=7001, making the client’s next expected position 7003.

FIN does not prove that no data remains in the other direction or that an application response is correct. An application supporting half-close can see EOF and still finish its response. Application/API choices can constrain this behavior; do not generalize the selected example to every socket API.

TIME-WAIT is still state in ordinary closing

In the normal branch the server application closes locally and enters LAST-ACK. Server FIN at SEQ=7001 moves the client to TIME-WAIT; arrival of ACK=7002 moves the server to CLOSED. Sending the final ACK does not immediately discard all client connection state.

TIME-WAIT accommodates old duplicate lifetimes and another final ACK if a FIN is retransmitted. The base TCP bound is 2×MSL; our MSL=30 seconds is visible arithmetic, not an OS default. FIN and ACK can be combined and simultaneous close follows another state path, so closure is not universally four separate packets.

RST is different from graceful closure

An accepted valid RST follows an abort path rather than the graceful FIN exchange that completes reliable delivery of queued data. Our selected cause is a local server-application abort. The server closes locally; the peer closes after receiving the assumed-valid reset and conveys abort information to its application.

A real trace containing RST alone does not identify a business failure cause. Endpoint state, sequence validation and application/OS context matter. Validity is a selected precondition here; neither packet encoding nor reset-validation algorithms are executed. Absence of RST likewise does not prove application success.

A UDP datagram does not carry TCP lifecycle states

UDP has an eight-byte header containing source/destination ports, length and checksum. Our ASCII PING payload is four bytes, giving UDP length 12 including its header. The IP header is excluded. This summary invents no numeric checksum; pseudoheader and complete-datagram computation are omitted.

UDP alone supplies no handshake, cumulative ACK, retransmission, ordered stream or FIN/RST lifecycle. An application may locally select a UDP socket peer without any TCP handshake on the wire. An upper protocol can define request/response, timeout and retry, but UDP itself does not provide them.

Datagram receipt is not an application operation

The UDP branch selects one successful arrival of a PING datagram at the server. Application consumption is a later local step; the server does not automatically generate PONG. One successful arrival proves neither guaranteed delivery nor the behavior of all UDP traffic.

The application must design any needed duplicate/reordering and retry handling. Transport choice does not establish user authorization or once-only execution. Separating connection lifecycle from datagram handling prevents assigning upper-protocol behavior to the wrong layer.

2. Red · Trust & Impact

Read every scenario without motion

Half-close

  1. Directional closure has a scope

    The client closes its send direction with FIN while clientCanStillReceive=true. Peer EOF is not the end of the whole bidirectional exchange.

    Transport evidence
    Send closed / receive open
    Lifecycle boundary
    Application incomplete
    Business outcome
    No business outcome
  2. No premature business outcome was given

    The server is in CLOSE-WAIT and may send OK. Application protocol completion is kept separate from one-direction EOF.

    Transport evidence
    Send closed / receive open
    Lifecycle boundary
    Server response still possible
    Business outcome
    No business outcome
  3. Data history was included

    In the half-close example, the server sends two bytes OK from seq 7001, yielding expected ACK 7003. Normal payload-free server FIN uses ACK 7002 under another data history. Values are not copied blindly between branches.

    Transport evidence
    OK +2 → ACK7003 / FIN +1 separate
    Lifecycle boundary
    Server response still possible
    Business outcome
    No business outcome
  4. Retry outcomes were not inferred from transport

    Transport acknowledgment of OK does not establish a sufficient application response. This half-close branch has no RST; business completion and whether to retry an operation depend on the application contract.

    Transport evidence
    OK +2 → ACK7003 / FIN +1 separate
    Lifecycle boundary
    Server response still possible
    Business outcome
    Commit / retry authority unknown
  5. Half-close retains its own final states

    This branch ends before the server's own FIN. The client is FIN-WAIT-2 and the server CLOSE-WAIT, with OK acknowledged. TIME-WAIT and 2×MSL from ordinary closure are not the final states of this unfinished exchange.

    Transport evidence
    OK +2 → ACK7003 / FIN +1 separate
    Lifecycle boundary
    Client FIN-WAIT-2 / server CLOSE-WAIT
    Business outcome
    Commit / retry authority unknown
  6. Closure did not expand business scope

    The half-close trace ends before full closure. An open receive direction can be ordinary protocol behavior; no permanent failure is claimed.

    Transport evidence
    OK +2 → ACK7003 / FIN +1 separate
    Lifecycle boundary
    Client FIN-WAIT-2 / server CLOSE-WAIT
    Business outcome
    Half-close valid / completion separate

Abort boundary

  1. Directional closure has a scope

    Abort supplies local-server-application-abort and assumes reset validity for an existing connection. The RST flag does not establish an actual root cause.

    Transport evidence
    Selected abort / cause supplied
    Lifecycle boundary
    Application incomplete
    Business outcome
    No business outcome
  2. No premature business outcome was given

    A transport reset does not undo earlier application work. Processed bytes or commit require application-outcome evidence, not CLOSED state.

    Transport evidence
    Selected abort / cause supplied
    Lifecycle boundary
    Rollback not proven
    Business outcome
    No business outcome
  3. Local abort is not peer receipt

    The server application's local abort first closes its own TCP state. Before receiving the assumed-valid reset, the client remains ESTABLISHED. Both peers do not gain closure knowledge simultaneously; this branch contains no OK or FIN exchange.

    Transport evidence
    Server CLOSED / client awaits reset
    Lifecycle boundary
    Rollback not proven
    Business outcome
    No business outcome
  4. Retry outcomes were not inferred from transport

    After reset, queuedDataReliablyDeliveredClaimed=false. Safe/idempotent retry under unknown business completion depends on the application contract; this trace proves no once-only operation.

    Transport evidence
    Server CLOSED / client awaits reset
    Lifecycle boundary
    Rollback not proven
    Business outcome
    Commit / retry authority unknown
  5. A valid reset skips graceful FIN stages

    Arrival of the assumed-valid RST closes the client, followed by a local abort notification to its application. This abort branch does not execute graceful FIN, LAST-ACK or TIME-WAIT stages. CLOSED does not imply that earlier business work was rolled back.

    Transport evidence
    Server CLOSED / client awaits reset
    Lifecycle boundary
    Both endpoints CLOSED after valid RST
    Business outcome
    Commit / retry authority unknown
  6. Closure did not expand business scope

    Abort is not a graceful FIN exchange and establishes no transaction rollback. Transport closure is known; earlier application effects need separate evidence.

    Transport evidence
    Server CLOSED / client awaits reset
    Lifecycle boundary
    Both endpoints CLOSED after valid RST
    Business outcome
    Transport closed / business unknown

ASSUMPTION · BOUNDARY · CONTROL

Broken assumption: EOF ends the entire exchange

An application automatically closing its response direction on peer FIN may truncate an intended half-close exchange. The condition is treating one-direction EOF as completion of both directions.

Track sending, receiving and application-protocol completion separately. CLOSE-WAIT alone is not a failure diagnosis; duration and application context determine its meaning.

Broken assumption: reset rolls back earlier work

TCP abort does not automatically roll back application work already performed. The peer may have processed some bytes; RST ends transport state. The mistaken condition is interpreting transport abort as transaction rollback.

Define application outcomes and retry semantics at their own layer. A reset flag alone proves neither a business commit nor its failure cause.

Broken assumption: a UDP checksum means reliability

Checksum error detection differs from guaranteed delivery/ordering. Seeing a checksum field does not prove lost data was retransmitted or processed by an application.

State the required transport/application properties explicitly. A missing response does not mean UDP itself must generate an error reply.

3. Blue · Secure development & defense

Read every scenario without motion

FIN ledger

  1. The transport-evidence type was selected

    Ordinary active close starts with ESTABLISHED/ESTABLISHED and unacknowledgedDataAtStart=0. Simultaneous close is outside this trace.

    Lifecycle evidence
    Ordinary close / no outstanding data
    Arithmetic review
    No calculation
    Outcome review
    No conclusion
  2. Byte or sequence arithmetic was done

    Client FIN 1007 consumes one sequence and expects ACK 1008; server FIN 7001 expects ACK 7002. PayloadBytes=0 and sequenceSpaceUsed=1 are different fields.

    Lifecycle evidence
    Ordinary close / no outstanding data
    Arithmetic review
    FIN1007→ACK1008 / FIN7001→ACK7002
    Outcome review
    No conclusion
  3. Arrival was separated from preparation

    Local client close gives FIN-WAIT-1 while the server stays ESTABLISHED. Client FIN arrival makes the server CLOSE-WAIT; opposite-end ACK state is not imported early.

    Lifecycle evidence
    Local close ≠ peer arrival
    Arithmetic review
    FIN1007→ACK1008 / FIN7001→ACK7002
    Outcome review
    No conclusion
  4. Normal final-state scope was preserved

    Final ACK arrival gives server CLOSED and client TIME-WAIT; selected local 2MSL expiry separately closes the client. Each state has its own owner.

    Lifecycle evidence
    Local close ≠ peer arrival
    Arithmetic review
    Server closed / client waits separately
    Outcome review
    No conclusion
  5. No missing higher-layer claim was added

    FIN/ACK segments may be combined; four separate segments are not universal. Graceful TCP closure states are not imported into abort or UDP; no actual socket/API measurement follows from this ledger.

    Lifecycle evidence
    Local close ≠ peer arrival
    Arithmetic review
    Server closed / client waits separately
    Outcome review
    Different lifecycle profiles retained
  6. Review finished within arithmetic scope

    FIN arithmetic and endpoint-state order agree for the supplied ordinary-close example. Actual evidence needs FIN/ACK observations for the tuple and local CLOSE/timer records. This calculation measures neither application completion nor a real OS TIME-WAIT duration.

    Lifecycle evidence
    Local close ≠ peer arrival
    Arithmetic review
    Server closed / client waits separately
    Outcome review
    FIN states consistent / business unknown

UDP length

  1. The transport-evidence type was selected

    The UDP example uses client port 53000 and server port 53001 with four ASCII bytes PING. The header has sourcePort, destinationPort, length and checksum; TCP lifecycle states do not apply.

    Lifecycle evidence
    UDP / PING / no TCP states
    Arithmetic review
    No calculation
    Outcome review
    No conclusion
  2. Byte or sequence arithmetic was done

    An eight-byte UDP header plus four PING bytes gives length 12. No numeric checksum is supplied. The length calculation proves neither complete datagram encoding nor successful checksum verification.

    Lifecycle evidence
    UDP / PING / no TCP states
    Arithmetic review
    8+4=12 / checksum unknown
    Outcome review
    No conclusion
  3. Arrival was separated from preparation

    selectedSuccessfulArrival=true belongs only to the selected datagram. Local read and applicationResponseProduced=false remain separate; no transport ACK or automatic reply is produced.

    Lifecycle evidence
    Selected arrival / application response absent
    Arithmetic review
    8+4=12 / checksum unknown
    Outcome review
    No conclusion
  4. Normal final-state scope was preserved

    orderedReliableDeliveryProvidedByUDP=false. Presence of a checksum field proves neither retransmission, ordering nor application acceptance.

    Lifecycle evidence
    Selected arrival / application response absent
    Arithmetic review
    Checksum ≠ reliable delivery
    Outcome review
    No conclusion
  5. Datagram and application evidence differ

    The length field relates header and payload sizes only. Actual receipt needs a datagram observation for the relevant endpoint and tuple; an application read needs separate application evidence. This example selects one successful arrival, without covering loss, duplication or retries.

    Lifecycle evidence
    Selected arrival / application response absent
    Arithmetic review
    Checksum ≠ reliable delivery
    Outcome review
    Datagram receipt ≠ application outcome
  6. Review finished within arithmetic scope

    UDP length=12 agrees with the supplied field contract; network reliability and application response remain UNKNOWN. One successful arrival does not test every loss/duplicate case.

    Lifecycle evidence
    Selected arrival / application response absent
    Arithmetic review
    Checksum ≠ reliable delivery
    Outcome review
    Length agrees / no delivery guarantee

IMPLEMENTATION · SECURITY CONTROL · VERIFICATION

Track +1 in the FIN ledger

Compute ACK1008 for client FIN=1007 and ACK7002 for server FIN=7001. Change only the receiver state at each arrival, rather than advancing the peer before its ACK arrives.

The half-close OK is two bytes and needs ACK7003. Do not blindly reuse FIN values across connections with different data histories.

Separate graceful and abort evidence

The normal branch shows FIN-WAIT-1/2, CLOSE-WAIT, LAST-ACK and TIME-WAIT for an ordinary close. The abort branch does not follow that sequence; its selected valid reset is a different event.

In an application review relate transport observations to completion and shutdown intent. The selected local timer here is not an OS measurement.

Check UDP length and scope by hand

Add the eight-byte header to PING’s ASCII byte count to obtain 12. The scene separates datagram arrival and local read without adding a transport ACK, FIN or automatic application reply.

If reliability is required, explain how an upper protocol provides it. One successful datagram arrival is not an implementation covering all loss/duplicate cases.

NOW APPLY IT TO THE CASE

Which acceptance stages are not completed by FIN, RST or UDP length?

The server can still send OK after client FIN. An abort does not automatically undo earlier business work. The 12-byte UDP PING example is only a field calculation for the selected datagram.

Where does the connection carrying the response differ from application outcome? Do not substitute network or transport evidence for body-parsing or DOM success.

Open the related case file ↗

READ THE EXAMPLE TOGETHER

Directional-close and datagram ledger

Select a field and examine what it supports and where the evidence ends.

Read the raw artifact and field explanations
{
  "context": {
    "tcpClient": "192.0.2.10:51000",
    "tcpServer": "198.51.100.200:443",
    "clientNextSeq": 1007,
    "serverNextSeq": 7001,
    "unacknowledgedDataAtStart": 0,
    "initialStates": [
      "ESTABLISHED",
      "ESTABLISHED"
    ]
  },
  "normalFin": [
    {
      "from": "client",
      "to": "server",
      "seq": 1007,
      "payloadBytes": 0,
      "sequenceSpaceUsed": 1,
      "expectedAck": 1008
    },
    {
      "from": "server",
      "to": "client",
      "seq": 7001,
      "payloadBytes": 0,
      "sequenceSpaceUsed": 1,
      "expectedAck": 7002
    }
  ],
  "normalStates": [
    {
      "event": "initial",
      "owner": 0,
      "client": "ESTABLISHED",
      "server": "ESTABLISHED"
    },
    {
      "event": "local-client-close",
      "owner": 0,
      "client": "FIN-WAIT-1",
      "server": "ESTABLISHED"
    },
    {
      "event": "client-fin-arrival",
      "owner": 1,
      "client": "FIN-WAIT-1",
      "server": "CLOSE-WAIT"
    },
    {
      "event": "fin-ack-arrival-at-client",
      "owner": 0,
      "client": "FIN-WAIT-2",
      "server": "CLOSE-WAIT"
    },
    {
      "event": "local-server-close",
      "owner": 1,
      "client": "FIN-WAIT-2",
      "server": "LAST-ACK"
    },
    {
      "event": "server-fin-arrival",
      "owner": 0,
      "client": "TIME-WAIT",
      "server": "LAST-ACK"
    },
    {
      "event": "final-ack-arrival-at-server",
      "owner": 1,
      "client": "TIME-WAIT",
      "server": "CLOSED"
    },
    {
      "event": "selected-2MSL-local-expiry",
      "owner": 0,
      "client": "CLOSED",
      "server": "CLOSED"
    }
  ],
  "timeWait": {
    "duration": "2*MSL",
    "selectedMslSeconds": 30,
    "selectedWaitSeconds": 60,
    "actualOsDefaultClaimed": false,
    "purpose": [
      "old-duplicate-lifetime",
      "allow-final-ACK-again-if-FIN-retransmitted"
    ]
  },
  "halfClose": {
    "clientSendClosed": true,
    "clientCanStillReceive": true,
    "serverStateAfterClientFin": "CLOSE-WAIT",
    "serverReply": {
      "seq": 7001,
      "payload": "OK",
      "payloadBytes": 2,
      "expectedAck": 7003
    },
    "serverFinNotYetSent": true,
    "traceEndsBeforeFullClose": true
  },
  "abort": {
    "selectedCause": "local-server-application-abort",
    "resetValidity": "assumed-valid-for-existing-connection-not-encoded",
    "receiverStateAfterValidReset": "CLOSED",
    "gracefulFinExchange": false,
    "queuedDataReliablyDeliveredClaimed": false,
    "realResetCauseDerivableFromFlagAlone": false
  },
  "udp": {
    "client": "192.0.2.10:53000",
    "server": "198.51.100.200:53001",
    "headerFields": [
      "sourcePort",
      "destinationPort",
      "length",
      "checksum"
    ],
    "headerBytes": 8,
    "payload": "PING",
    "payloadBytes": 4,
    "length": 12,
    "checksumNumericValue": "not-supplied; no complete datagram encoding",
    "selectedSuccessfulArrival": true,
    "orderedReliableDeliveryProvidedByUDP": false,
    "tcpLifecycleStatesApply": false,
    "applicationResponseProduced": false
  },
  "lifecycleScope": {
    "ordinaryActiveClose": true,
    "simultaneousClose": "not-modeled",
    "FINAndAckMayBeCombined": true,
    "fourSeparateSegmentsUniversal": false,
    "RSTInjectionOrLiveSocket": "not-performed"
  }
}
normalFin
FIN consumes one sequence position even without payload.
normalStates
Separate peer states for ordinary active close.
timeWait
2×MSL with selected duration, not an OS default.
halfClose
The response direction may remain open after client sending ends.
udp.length
UDP header plus payload bytes, excluding IP header.

FIN/RST and UDP fields are semantic summaries only. No real sockets, pcap, checksums, timers or OS results are produced.

Two reality checks

Receiving peer FIN ends data in both directions.

FIN ends the sender’s direction. An endpoint supporting half-close can continue responses in the other direction.

Selecting a UDP socket peer creates a TCP-like handshake.

Local peer selection adds no SYN/ACK, FIN or delivery guarantee to UDP. Upper-protocol behavior is separate.

YOUR TURN

Work through this story.

Predict the outcome, find the evidence boundary, and explain it in your own words.

The client sent FIN; the server is in CLOSE-WAIT. Can the server still send OK?

  1. Yes; the client receive direction remains open in the selected half-close.
  2. No; one FIN closes both directions at once.
Read the explained answer

Yes; the client receive direction remains open in the selected half-close. — ClientSendClosed=true, clientCanStillReceive=true. The server FIN has not been sent yet.

How is UDP length=12 formed, and what does it say about a response?

Selected lesson artifact fields; teaching example

udp.headerBytes
8
udp.payloadBytes
4
udp.length
12
udp.applicationResponseProduced
false
  1. 8 header bytes+4 PING bytes; an application response is not established.
  2. A 12-byte application payload was received and a TCP ACK returned.
Read the explained answer

8 header bytes+4 PING bytes; an application response is not established. — Even with a selected successful arrival, applicationResponseProduced=false; UDP supplies no ACK/reliable reply.

Explain the evidence difference between observing RST in a record and this fixture’s local-server-application-abort branch.

Read the explained answer

The fixture supplies local application abort as the cause and assumes reset validity for the existing connection. A real RST flag alone does not establish the same cause. Reset is not a graceful FIN exchange and does not guarantee reliable delivery of queued data.

□ I distinguished the supplied cause from an observed flag.

□ I inferred no data-delivery guarantee from reset.

Open the application console · request / response / browser
Also open request, URL, cookie and DOM examples

Sources and scope