Environment
- Windows Server 2025 Standard, build 26100.33296 (August 2026 cumulative applied)
- Domain controller, DHCP role, standalone (failover relationship removed during troubleshooting)
- Clean OS install July 2026; DHCP config migrated from Server 2016 via
Export-DhcpServer / Import-DhcpServer — no database files copied
- Scope 10.5.112.0/20 (10.5.112.12–10.5.127.240), 12-hour lease
- ~3,400 addresses available, ~600 active leases, 15% utilization
- ~800 wireless clients, majority ChromeOS (vendor class
chromeos), on a single VLAN behind a Cisco SVI with ip helper-address
- K-12 high school: clients associate in large bursts at bell times
Problem
Under concurrent client load, the DHCP server issues a DHCPACK and then NAKs that same client for that same address within seconds. The address is then handed to a different client, whose lease is also revoked within seconds. This repeats continuously during periods of high client activity.
Example from the audit log — address 10.5.114.116, three different ChromeOS clients in five minutes:
11:45:16 NACK 10.5.114.116 900F0CC2F581
11:45:16 Assign 10.5.114.116 900F0CC2F581
11:45:22 NACK 10.5.114.116 900F0CC2F581
11:45:26 NACK 10.5.114.116 900F0CC2F581 (x2)
11:45:27 NACK 10.5.114.116 900F0CC2F581
11:45:27 Assign 10.5.114.116 900F0CC2F581 <- reassigned to same client
11:45:34 NACK 10.5.114.116 900F0CC2F581
11:45:35 NACK 10.5.114.116 E8C829E9BCB8
11:45:35 Assign 10.5.114.116 E8C829E9BCB8 <- different client
11:50:12 NACK 10.5.114.116 60A5E2B62FEC
11:50:12 Assign 10.5.114.116 60A5E2B62FEC <- third client
Note the NACK and Assign entries for the same client and address repeatedly share a timestamp. In one case the Assign is logged before the NACK in the same second.
A second client walking multiple addresses in under two minutes:
11:18:43 NACK/Assign 10.5.114.147 900F0CC27195
11:18:54 NACK 10.5.114.147
11:18:58 NACK 10.5.114.147 (x2)
11:18:59 NACK/Assign 10.5.114.11
11:19:05 NACK 10.5.114.11
11:19:09 NACK 10.5.114.11 (x2)
11:19:10 NACK/Assign 10.5.114.11 <- same address again
11:19:22 NACK/Assign 10.5.114.136
11:20:09 NACK/Assign 10.5.114.136 <- again
11:20:21 NACK/Assign 10.5.115.46
11:20:41 NACK/Assign 10.5.115.46 <- again
Six DHCPACKs across four addresses in 118 seconds, each revoked within 5–11 seconds.
Reproducible on demand
Put a Chromebook to sleep and resume it. It loses its valid unexpired lease and cycles through 3–5 addresses over 30–45 seconds before settling. One client lost three consecutive 12-hour leases 16–18 minutes after each assignment (assigned 09:32:53, NAKed 09:50:57; assigned 09:51:44, NAKed 10:07:20; assigned 10:07:43).
At the time of each NAK the lease record showed AddressState: Active with a ClientId matching the client being denied.
Load dependency
NAK rate scales directly with concurrent client count:
| Condition |
NAKs per 5 min |
| Morning arrival (~800 clients associating) |
1,900–2,230 |
| -------- |
-------- |
| Morning arrival (~800 clients associating) |
1,900–2,230 |
| Mid-day class change |
500–600 |
| Mid-day steady |
270–300 |
| Building empty (school closed) |
2–4 |
Leases are still being issued throughout — 200–500 per 5-minute interval — so the service is not hung. It simply does not appear to persist the bindings it creates.
Packet capture
Over-the-air capture confirms clients are behaving correctly. DHCPREQUEST frames contain Option 50 (requested address) and Option 54 (server identifier naming this server), i.e. the client is accepting this server's own offer, and the NAK follows roughly 16 ms later. giaddr is correct (10.5.112.1) on every frame.
Ruled out
| Checked |
Result |
| DHCP failover |
Relationship removed entirely — no change in behavior |
| -------- |
-------- |
| DHCP failover |
Relationship removed entirely — no change in behavior |
| Scope exhaustion |
3,400+ free, 15% utilization |
| Conflict detection |
Tested at 0 and at 1 — no change to the assign/NAK cycle |
| DNS dynamic updates |
Zero DNS events (IDs 30/31/32) against 1,144 assigns |
| Database inconsistency |
Repair-DhcpServerv4IPRecord finds nothing |
| Database integrity |
Clean install, j50.chk current, normal JET log rotation, 3 MB dhcp.mdb |
| DHCP policies |
None defined at scope or server level |
| Relay path |
Single SVI, correct /20 mask, giaddr correct in capture |
| Rogue DHCP servers |
All other AD-authorized servers verified to have no DHCP role |
| Server resources |
CPU 8–15%, disk write latency 1.7 ms, queue 0–1, 25 GB free RAM |
| Patch level |
Issue present before and after August 2026 cumulative (26100.33296) |
| Client behavior |
Capture shows RFC-conformant DHCPREQUEST with Option 54 |
| Wireless infrastructure |
Frame duplication in capture traced to multi-AP capture artifact |
Questions
- Has anyone seen Server 2025 DHCP fail to persist lease bindings under burst client load — hundreds of clients transacting within a few minutes?
- Is there a diagnostic beyond the audit log that would show why a lease commit fails? The audit log records the ACK and the NAK but gives no reason code.
- Are there registry values governing DHCP request-processing concurrency, thread pool size, or JET commit behavior that would be worth adjusting for this load profile?
- Would a
netsh trace on the server, or DHCP Server debug logging, capture the internal reason for the NAK?
Happy to provide full audit logs, the packet capture, and any additional output.Environment
- Windows Server 2025 Standard, build 26100.33296 (August 2026 cumulative applied)
- Domain controller, DHCP role, standalone (failover relationship removed during troubleshooting)
- Clean OS install July 2026; DHCP config migrated from Server 2016 via
Export-DhcpServer / Import-DhcpServer — no database files copied
- Scope 10.5.112.0/20 (10.5.112.12–10.5.127.240), 12-hour lease
- ~3,400 addresses available, ~600 active leases, 15% utilization
- ~800 wireless clients, majority ChromeOS (vendor class
chromeos), on a single VLAN behind a Cisco SVI with ip helper-address
- K-12 high school: clients associate in large bursts at bell times
Problem
Under concurrent client load, the DHCP server issues a DHCPACK and then NAKs that same client for that same address within seconds. The address is then handed to a different client, whose lease is also revoked within seconds. This repeats continuously during periods of high client activity.
Example from the audit log — address 10.5.114.116, three different ChromeOS clients in five minutes:
11:45:16 NACK 10.5.114.116 900F0CC2F581
11:45:16 Assign 10.5.114.116 900F0CC2F581
11:45:22 NACK 10.5.114.116 900F0CC2F581
11:45:26 NACK 10.5.114.116 900F0CC2F581 (x2)
11:45:27 NACK 10.5.114.116 900F0CC2F581
11:45:27 Assign 10.5.114.116 900F0CC2F581 <- reassigned to same client
11:45:34 NACK 10.5.114.116 900F0CC2F581
11:45:35 NACK 10.5.114.116 E8C829E9BCB8
11:45:35 Assign 10.5.114.116 E8C829E9BCB8 <- different client
11:50:12 NACK 10.5.114.116 60A5E2B62FEC
11:50:12 Assign 10.5.114.116 60A5E2B62FEC <- third client
Note the NACK and Assign entries for the same client and address repeatedly share a timestamp. In one case the Assign is logged before the NACK in the same second.
A second client walking multiple addresses in under two minutes:
11:18:43 NACK/Assign 10.5.114.147 900F0CC27195
11:18:54 NACK 10.5.114.147
11:18:58 NACK 10.5.114.147 (x2)
11:18:59 NACK/Assign 10.5.114.11
11:19:05 NACK 10.5.114.11
11:19:09 NACK 10.5.114.11 (x2)
11:19:10 NACK/Assign 10.5.114.11 <- same address again
11:19:22 NACK/Assign 10.5.114.136
11:20:09 NACK/Assign 10.5.114.136 <- again
11:20:21 NACK/Assign 10.5.115.46
11:20:41 NACK/Assign 10.5.115.46 <- again
Six DHCPACKs across four addresses in 118 seconds, each revoked within 5–11 seconds.
Reproducible on demand
Put a Chromebook to sleep and resume it. It loses its valid unexpired lease and cycles through 3–5 addresses over 30–45 seconds before settling. One client lost three consecutive 12-hour leases 16–18 minutes after each assignment (assigned 09:32:53, NAKed 09:50:57; assigned 09:51:44, NAKed 10:07:20; assigned 10:07:43).
At the time of each NAK the lease record showed AddressState: Active with a ClientId matching the client being denied.
Load dependency
NAK rate scales directly with concurrent client count:
| Condition |
NAKs per 5 min |
| Morning arrival (~800 clients associating) |
1,900–2,230 |
| Mid-day class change |
500–600 |
| Mid-day steady |
270–300 |
| Building empty (school closed) |
2–4 |
Leases are still being issued throughout — 200–500 per 5-minute interval — so the service is not hung. It simply does not appear to persist the bindings it creates.
Packet capture
Over-the-air capture confirms clients are behaving correctly. DHCPREQUEST frames contain Option 50 (requested address) and Option 54 (server identifier naming this server), i.e. the client is accepting this server's own offer, and the NAK follows roughly 16 ms later. giaddr is correct (10.5.112.1) on every frame.
Ruled out
| Checked |
Result |
| DHCP failover |
Relationship removed entirely — no change in behavior |
| Scope exhaustion |
3,400+ free, 15% utilization |
| Conflict detection |
Tested at 0 and at 1 — no change to the assign/NAK cycle |
| DNS dynamic updates |
Zero DNS events (IDs 30/31/32) against 1,144 assigns |
| Database inconsistency |
Repair-DhcpServerv4IPRecord finds nothing |
| Database integrity |
Clean install, j50.chk current, normal JET log rotation, 3 MB dhcp.mdb |
| DHCP policies |
None defined at scope or server level |
| Relay path |
Single SVI, correct /20 mask, giaddr correct in capture |
| Rogue DHCP servers |
All other AD-authorized servers verified to have no DHCP role |
| Server resources |
CPU 8–15%, disk write latency 1.7 ms, queue 0–1, 25 GB free RAM |
| Patch level |
Issue present before and after August 2026 cumulative (26100.33296) |
| Client behavior |
Capture shows RFC-conformant DHCPREQUEST with Option 54 |
| Wireless infrastructure |
Frame duplication in capture traced to multi-AP capture artifact |
Questions
- Has anyone seen Server 2025 DHCP fail to persist lease bindings under burst client load — hundreds of clients transacting within a few minutes?
- Is there a diagnostic beyond the audit log that would show why a lease commit fails? The audit log records the ACK and the NAK but gives no reason code.
- Are there registry values governing DHCP request-processing concurrency, thread pool size, or JET commit behavior that would be worth adjusting for this load profile?
- Would a
netsh trace on the server, or DHCP Server debug logging, capture the internal reason for the NAK?
Happy to provide full audit logs, the packet capture, and any additional output.