Random Quick Zoning Disconnects

Discussion in 'General Discussion' started by Break, Jun 15, 2026.

  1. gmponyo

    gmponyo New Member

    Messages:
    4
    Zoning isn't one handoff, it's three connections. The old zone sends you the approval packet and commits (character save, group update), then the client opens a fresh UDP connection to world to ask where to go, then another fresh connection to the destination zone. The rest of the game runs entirely on connections that already exist. Zoning is the one moment where everything depends on packets getting through in a short window, with the server already committed. There's no retry of the sequence as a whole, so loss that would just be a lag spike mid-game is fatal at the loading screen.

    The fast boot instead of LD is interesting. World runs a cleanup sweep that purges a client entry after a few missed check-ins, which works out to roughly 20-30 seconds. A character stuck mid-handoff gets cleanly removed, which is why we can log straight back in. Matches Rimi's video.

    One detail from Rimi's post is quite interesting. The packet that makes your UI disappear is sent on the existing connection to the zone you're leaving, and the code resends it roughly every half second until it's acknowledged. Arriving 15 seconds late means around thirty resends in a row got eaten on a connection that had been working fine for hours. And since other boxes on the same IP keep playing normally through it, it's not the whole IP being throttled. Something on the path is dropping one specific flow hard, right around the zone event, while the rest of your traffic gets through fine.

    It's per-flow (one box drops, siblings fine), it's route-dependent (Rimi's VPN endpoint tests), it started mid-patch with no netcode changes in the public repo since early 2025, and it survived yesterday's reboot, which rules out the server working itself into a bad state over time since a reboot clears all of that. Tulu's old case might be the best clue in the thread: same machine, same ISP, TAKP broken while TLP worked fine, and changing ISP cured it completely. Traffic gets assigned to physical paths by hashing source and destination together, so TAKP and TLP flows from the same player can ride different links even from the same house. All of it fits a bad link in a load-balanced bundle at or near the datacenter, where each flow gets hashed onto one path and some paths are broken. It would also explain why restarting the client fixes it instantly: new client = new port = new flow = new roll of the dice. And it suggests this isn't brand new, just much worse since early June; Tulu was apparently hitting the same weak spot months ago with an unlucky route.

    Things that could help :
    1. Are TAKP and TLP on different public IPs, and if so do they route through different upstream links? Whatever differs between those two is probably where this lives.
    2. World already logs a line like "Received request for character X from ip:port" every time someone zones. Next time someone reports a failed zone with a timestamp, checking whether that line exists for the attempt would immediately show whether the client's reconnect ever reached the server. If it's missing, packets are dying inbound before world ever sees them, and that's a concrete datacenter conversation.
    3. A tcpdump on the host watching one affected player's IP while they reproduce it (sounds like Rimi can trigger it in minutes off-VPN) would settle direction and layer in one capture.
    A question for others getting this: at the moment one of your characters freezes at the zone, do your other characters keep playing perfectly smoothly, or do they show any signs of packet loss for those few seconds (rubber-banding, delayed spells or chat, NPCs skipping around)? Mine stay perfectly smooth. This matters because it separates two possible causes: if something at the datacenter were punishing your whole IP, all your characters would stutter together. If only one connection is being dropped while the rest stay clean, that points at a broken path that only some connections get assigned to, which is the theory above.

    I think EvanEQ's crash is a separate thing. The "ExecuteCmd : Exit" and Zone ID of ffffffff in the dump mean the client crashed while shutting down after quitting the stuck client, not during the zone attempt itself. The old client (and sometimes Zeal hooks) can crash on exit when things are in a weird state. Annoying, but probably downstream of the disconnect rather than the cause, so I wouldn't chase it.
     
    Pithy, Break and Tuluvien like this.
  2. showstring

    showstring I Feel Loved

    Messages:
    3,563
    very good post, thank you
    zero issues with any other clients
    i don't have any issues with my clients in general, except for zoning disconnect.
    there's no elevated lag or packet loss at all and everything is 100% stable in all other aspects of gameplay.
    it's solely the zoning handshake getting dropped for me

    yep this is just resolved using the updated client .dll files here: https://www.takproject.net/forums/i...dows-client-mods-to-replace-eqw-eqgame.36397/
    you will no longer crash the client, but you will still disconnect
    if you leave the client open you'll either come back to server select screen, or char select screen (i've had both happen)
     
  3. Pithy

    Pithy I Feel Loved

    Messages:
    2,794
    My other characters keep playing smoothly. No signs of packet loss. Mac client.
     
  4. Pithy

    Pithy I Feel Loved

    Messages:
    2,794
    FWIW, when this happens for me on the Mac client, the crashing instance first attempts to zone, then freezes with the UI up for about 10 seconds, then the UI disappears as it typically does when zoning, then the crashing character is booted from group and the server about 10 seconds later.
     
    solar likes this.
  5. Pryde

    Pryde New Member

    Messages:
    4
    New issue for me in addition to the zoning issues. About 50% of the time I go to log in now I get stuck here:

    upload_2026-7-3_19-11-10.png

    and it will just keep me there. Have to close the client and start again, that usually fixes it. Also crashed again about 50% of the time zoning.

    Anyone else have the login server issue? I'm west coast (so cal)
     
  6. tomgggg

    tomgggg Member

    Messages:
    51
    Both of these issues are happening to me as well, and a lot. By both issues I mean the zoning timeout, and the login problems.
     
  7. benoeb

    benoeb People Like Me

    Messages:
    442
    Similar behavior to what I have experienced in the thread I posted here https://www.takproject.net/forums/index.php?threads/random-client-disconnects-no-linkdeath.38362/

    Oddly enough if I use a VPN and connect to US-MA#60 via ProtonVPN, I do not experience this issue. Yet, if I use a direct connection via windows 10 or bazzite 44 via my public IP provided by my ISP Wyyerd Fiber this is a constant problem.
     
  8. solar

    solar Administrator Staff Member

    Messages:
    1,635
    Thanks everyone for providing additional information. I have been investigating this for days and I have a hopeful server code fix that may resolve this.
     
    Inacht, Elroz, Rossignol and 8 others like this.
  9. robregen

    robregen Administrator Staff Member

    Messages:
    8,701
    I hotfix to include this fix. So we'll see how it goes.
     
    Inacht, showstring, Mechaike and 7 others like this.
  10. showstring

    showstring I Feel Loved

    Messages:
    3,563
    zoned a bunch, no disconnects so far, looking good!
    thank you!
     
    Break, Pithy, Tuluvien and 2 others like this.
  11. Pithy

    Pithy I Feel Loved

    Messages:
    2,794
    I didn't get a ton of time to play today, but I also didn't get any disconnects. So far so good!
     
    Break and solar like this.
  12. solar

    solar Administrator Staff Member

    Messages:
    1,635
    It always seems so simple once you understand the problem and have already solved it, but this was an interesting puzzle.

    BLUF: The reported behavior was triggered by packet reordering in the network. I fixed it by suppressing an additional packet that was breaking the protocol when it arrived out-of-order and that packet wasn't needed in the first place.

    The zone failure problem resisted simple debugging by swapping out components like the server, the client, or the user because of the combination of factors required to produce it. There is a sensitive portion of the protocol where the client and server are exchanging control messages to gracefully disconnect from each other that failed to process the disconnect on the client (leading to a timeout) only when two specific packets sent from the server arrived out of order at the client.

    Investigation:
    Users report that switching ISPs or using VPNs can either make the problem go away or make it start happening. Normally the simple conclusion would be that there is something different with the user's equipment/software that is disturbing the 'default' and that's why it doesn't work, possibly DNS errors, and the user should just figure it out, but this problem is reported by multiple users using both the Macintosh and Windows clients, with or without add ons, and they're using all different equipment/software for their network so that's not a good explanation.

    One of the common failure modes I considered is router state filling up - a home router doing NAT can only hold so many connections at a time and people resolve failures by rebooting it which temporarily makes it forget all connections and it works for a little while until it's 'full' again. That doesn't apply here because while it's a common failure, the reported issue is too specific in how it presents and it's affecting too many users to explain it that way.

    The EQ network protocol uses a reliable transport that resends packets until acknowledged, and there is some timing sensitivity here, so I considered that high latency is somehow aggravating a race condition problem. High latency can happen even for users close to the server due to an issue called bufferbloat, and this seemed like a promising lead. I attempted to simulate high latency and varying degrees of packet loss using linux qdiscs and ifb but the transport protocol's resend logic made it work reliably regardless of what I tried - asymmetric latency, high latency, varying latency.. and even though I didn't find the problem, it's nice to see that it's working so well and able to tolerate poor quality connections.

    Rimidal/showstring and benoeb used a VPN to fix the issue while playing since their native connection was experiencing the problem. This likely increases latency further so that's another ding against the latency trigger idea. These VPN services exist primarily for watching out-of-region Netflix shows so they offer multiple servers labeled by country that hopefully geoIP to the where the user wants to be, and after trying various servers in the list we found that some of them produce the zoning issue and some don't. Then I considered maybe there's some firewall or other device that filters/rate limits/mangles packets as this is something that happens with UDP as network admins try to mitigate abuse and then forget to remove the filters afterward. It can go unnoticed because HTTPS is TCP and continues to work even with UDP filtered. This theory kind of falls apart because the failure is so specific/predicatble where it happens and it only happens during zoning - still, it is possible that a certain packet involved in zoning matches some IDS signature and gets mangled/filtered so at this point I had to go for capturing packets. Looking at EQ packets in tcpdump/wireshark and counting bytes is something I haven't had to do since I started doing eqemu 25 or so years ago while figuring out the basics, so I was really hoping to find the problem some other way.

    I ended up signing up for the VPN service that showstring is using so that I could try to reproduce the problem myself, and I needed to do it on a dev server not just on the live one, so that I could experiment. At this point showstring had only been able to produce the failure on the TAKP server and not TLP, p99 or my dev server but without being able to reproduce and try things I still had nothing to go on. I ended up building out several dev server copies of TAKP and eventually finding a VPN server + EQ server combination that did produce the problem which was the key to me being able to actually move forward. So I thought that I would just capture on both sides and try to compare, see if any loss happened, or packets got changed in transit. After accounting for clock differences and latency to align the client and server captures, I hashed every packet and compared the list to see that every packet sent at the server was actually seen on the client and vice versa, and it came up clean even though it was producing the zone failure. So that's a good sign kind of, it's not some weird mangling issue that's affecting people all over the internet on different ISPs, it's probably something we can fix then. What I did not do is compare the order of the packets at this point - it's a large data set, so I just went with the idea of verifying the contents matched, that every packet hash was present in both lists. I did not find any packet mangling issues so I went back to focusing on the client's code to try to understand where it was failing and what circumstances could trigger that.

    I have some instrumentation in my eqclientmod (on github) that logs debug messages in the client and I had received some of those logs and packet captures from showstring so I was able to confirm that my repro was correct and hitting the same failure mode. I discovered several secondary issues with the zoning process, things that could be improved, but turned out not to be the cause of this failure, so then I went lower level and started studying the EQ protocol headers themselves. There are combinations of bits that are used to signal for flow control, and I was able to decompile and compare the signalling between the client and server. I knew the failure was that it was hanging while trying to disconnect waiting for the finalization packet, but I could see the finalization packet in the packet capture so why wasn't it processing? It turned out there were 2 of those packets that got sent back to back. In our code, it's just something like Disconnect() that ended up getting called twice during the zoning process, and these are reliable messages meaning they have a sequence number so they get retransmitted until acknowledged. When I saw the 2 close messages and the sequence numbers on them, I realized that the client received the one with the higher sequence number first and the lower sequence number second. Studying the client code, when this happens it ends up ignoring the lower sequenced one, so the protocol state desyncs and the server keeps trying to retramisit while the client ignores it and eventually times out. This only happens some of the time, when the packet order is swapped by the network, which is not ideal but it is a thing that happens at this low level. TCP is tolerant of this, as long as it's not a high rate of reordered packets, so facebook loads, youtube works, nobody knows it happened. It would be better if the network didn't do this, but it does, and applications need to tolerate it. EverQuest does tolerate it well, but this particular packet is handled in a special way and it is improper for the server to send two close packets anyway, but it's been mostly working because this is a random occurrence.

    It's an error to send multiple finalization packets, so I fixed it by making the server only send one.
     
    Gamer1047, benoeb, Palarran and 13 others like this.
  13. Frosst

    Frosst People Like Me

    Messages:
    159
    Great sleuthing, and great solution. /salute
     
    RichardCox and solar like this.
  14. thoran

    thoran New Member

    Messages:
    4
    Wow amazing testing and research!
     
    RichardCox likes this.
  15. showstring

    showstring I Feel Loved

    Messages:
    3,563
    Impressive work to figure this out so quickly. Thank you for all your efforts.

    Still no issues with disconnections after further playing. Very good fix!

    Great to see the netcode and user experience be continuously improved after so many years. All the client and zoning crashes are pretty much totally fixed now. Can finally start playing.
     
    RichardCox and gmponyo like this.
  16. Pithy

    Pithy I Feel Loved

    Messages:
    2,794
    Enjoyed the play-by-play geekery! Thanks for your work on this.
     
    Palarran likes this.
  17. gmponyo

    gmponyo New Member

    Messages:
    4
    Great job! Thank you all!
     
  18. Polly

    Polly Active Member

    Messages:
    51
    Strong research! What a dev team.
     
    showstring and RichardCox like this.
  19. benoeb

    benoeb People Like Me

    Messages:
    442
    Thank you for the work Solar and Rob.
     
    Tuluvien likes this.
  20. tomgggg

    tomgggg Member

    Messages:
    51
    Thank you!
     
  21. showstring

    showstring I Feel Loved

    Messages:
    3,563
    this is still happening for me tho :(

    upload_2026-7-16_13-58-36.png

    retrying works