It's the firewall.
I wrote about this at the IHOC Quakeboard forum, but that's a registered-users-only forum so I'll repost it here:
I tried various servers using WinQuake and they all gave me the connected...(nothing) thing. It's probably my firewall. The reason more people are seeing this problem now is just that more people are using firewalls now.
Quake uses a very firewall-unfriendly protocol -- the first server->client packet contains a server port number for further packets, followed immediately by packets from the server on that port. There's no way any firewall can deal with this except to be very loose about what incoming packets it allows, or by actually reading the contents of packets and recognizing various application protocols. I think some firewalls might do this for FTP; I even hacked the Linux 2.0 firewall code years ago to understand the Quake protocol, but unfortunately my mods were not applicable to Linux 2.2 or 2.4.
To illustrate, here's an example Quake client/server conversation:
client:43711 -> server:26000 : request connection
server:26000 -> client:43711 : accept : (use port 4812)
server:4812 -> client:43711 : some init stuff
server:4812 -> client:43711 : some init stuff
...
server:4812 -> client:43711 : world update
client:43711 -> server:4812 : player input
etc.
I chose 43711 and 4812 at random; these ports are chosen randomly by the client and server per session. Only the 26000 request/status port is constant.
The problem is that the client's firewall doesn't know about that magical "use port 4812" command in the first server->client packet. All it sees is 43711->26000, so it only allows return traffic on 26000->43711 and blocks the 4812->43711 packets. When the player does a "ping" the client sends the ping on 43711->4812 so now the firewall knows about that remote port and allows return traffic from it. So the conversation looks like this:
client:43711 -> server:26000 : request
server:26000 -> client:43711 : accept : use port 4812
server:4812 -> client:43711 : some init stuff (blocked)
server:4812 -> client:43711 : some init stuff (blocked)
server:4812 -> client:43711 : some init stuff (blocked)
server:4812 -> client:43711 : some init stuff (blocked)
client:43711 -> server:4812 : ping
server:4812 -> client:43711 : some init stuff (accepted)
server:4812 -> client:43711 : some init stuff (accepted)
...
server:4812 -> client:43711 : world update
client:43711 -> server:4812 : player input
etc.
I suspect ProQuake has an automatic client:43711->server:4812 (probably a "nop" command) to overcome this problem. So the conversation looks like this:
client:43711 -> server:26000 : request
server:26000 -> client:43711 : accept : use port 4812
client:43711 -> server:4812 : nop
server:4812 -> client:43711 : some init stuff (accepted)
server:4812 -> client:43711 : some init stuff (accepted)
...
server:4812 -> client:43711 : world update
client:43711 -> server:4812 : player input
etc.
Basically ProQuake does the initial "ping" for you automatically. This isn't a problem with the ProQuake server, it's an inherent problem with the Quake 1 network protocol which the ProQuake client managed to overcome with a little kludge.
As I said the Quake 1 network protocol is firewall unfriendly, but that's not all that's wrong with it. Notice the sequence of packets during initialization: 1 packet from client->server, then a bunch of packets from server->client. By spoofing the source address on a connect request, you can trick a server into sending several kilobytes of data to somebody else's IP address. This is known as a "smurf attack". Back when there were hundreds of Quake servers, attackers could "smurf" all of them simultaneously to DDoS someone. That's what those "unconnected" floods were, when all the servers would fill up with "unconnected" players all at once. If Id had just required a single client->server acknowledgement right after the server's acceptance, both the "smurf" vulnerability and the "connected...(nothing)" problem would never have existed.[/url]