opensubscriber
   Find in this group all groups
 
Unknown more information…

o : openplay-dev@lists.apple.com 4 January 2006 • 9:00PM -0500

Re: Host id race condition?
by Ed Zavada

REPLY TO AUTHOR
 
REPLY TO GROUP





On Jan 2, 2006, at 7:19 PM, zmorris@mac.... wrote:

> On Jan 2, 2006, at 10:20 AM, Randy Thompson wrote:
>
>> Zack-
>>
>> Is this just a testing issue, or does the ConOps of your network game  
>> strategy really include launching a joiner on the same machine as the  
>> host at almost the same moment?

> Hey thanx for the replies.  This is all for our game Khufu, which is  
> almost peer to peer because the host is playing too, and not just a  
> server somewhere.  I have been experimenting for 10 years with various  
> networking methods, and am using NetSprocket so I can make sure the  
> game logic really works, without having to worry about the lowest  
> level stuff.  I don't think the problem is with my logic, because when  
> I call NSpGame_Host() then immediately NSpPlayer_GetMyID() on the  
> host, I am getting ids like 2.

I would have to disagree, based on what you say below the problem is  
your logic:

> In my netsprocket wrapper, I have a command to keep the client  
> retrying to join about 60 times a second (this will be slowed to once  
> a second eventually).  That way I can try to join a game that may not  
> be hosting yet, but the join happens in the background without me  
> having to babysit it.

This means that there is a request in transit (in the outgoing packet  
buffers, on the wire, or in the incoming packet buffer) to the host  
even though the host doesn't exist yet. This causes the join request  
sent by the client to be received before the host itself can join. 60  
times a second is a very high rate for network traffic, and pretty much  
guaranteed not to work in real world (internet) conditions -- by that I  
mean that the connection attempts will get bunched up and possibly even  
reordered en-route (TCP guarantees in-order delivery, but you are  
trying to establish a TCP connection, not send data over TCP) so rather  
than 60 distinct query replies you will get batches of connection  
attempts that are handled in random order.

Go ahead and slow the retry attempts to once a second now, and you  
should see a significant drop-off in the frequency of the host getting  
id 2.

> I will probably fix this by hosting the game before telling the  
> tracker that I am hosting.

Yes, this will guarantee that the host will always get id 1, and it's  
the way Net Sprocket expects to work.

> But I am concerned that hackers could just be port scanning and hack a  
> game by being the first one in.  I guess this wouldn't matter if a  
> game was properly written to not rely on the host being id 1.  I do  
> wonder what would happen if all of the clients joined and the host  
> couldn't get in on a free slot?

Even if they were port scanning, they would have to identify that the  
port they saw was a NetSprocket game port, and then run through enough  
of the NetSprocket protocol to actually join the game. This is pretty  
unlikely unless your game is very popular (ie: sells millions of  
copies) or you are giving away valuable prizes for tournaments or  
something.

Nevertheless there are ways to prevent that completely or make it  
harder:

1. Have the game shut itself down with a notice to all players that the  
game is being hacked and the IP address of the hacker if the host gets  
an Id other than 2 (it would report the remote IP address of the player  
on id 1).

2. Have the tracker coordinate the join and once all players have been  
approved to join a game by the tracker, the tracker passes their IP  
addresses back to the host so that the host knows who will be joining.  
Anyone connecting from another address will be immediately disconnected  
and not be assigned a player ID. Note that this would cause a small  
percentage of legitimate players to be dropped, because some ISPs  
(notably AOL) don't always give you the same externally visible IP  
between TCP connections, even in the same session.

3. Randomize the port you are hosting on, so only the host and the  
tracker knows what port you are on, and once the tracker knows it's  
already safe to connect because the host has connected. Note that this  
will cause massive headaches to anyone trying to configure a firewall  
or NAT to allow the incoming traffic, and you'll have to be careful to  
avoid conflicts with well known services. I don't believe this one is  
worth the hassle.

Hope this helps,
Ed

>
>> P.S.  I think I recall meeting you a about 5-6 years ago at the  
>> "NetSprocket/OpenPlay Birds of a Feather" workshop at the Apple  
>> WWDC... was that you?
>
> I think you have me confused with another Zack Morris :-P  I am just  
> yer average garage programmer out here in lil ol' Idaho and rarely  
> venture outside the state anymore.  I would love to though, next year  
> when I'm a millionaire :-P  Oh but come to think of it, I was on the  
> Uber list for a while back in college, say 1998-1999.
>
> Thanx,
>
> -----------------------------------------------------------------------
> -
> Zack Morris              Z Sculpt Entertainment               This  
> Space
> zmorris@zscu...      http://www.zsculpt.com                 For  
> Rent
> -----------------------------------------------------------------------
> -
> If the doors of perception were cleansed, everything would appear to  
> man
>   as it is, infinite. -William Blake, The Marriage of Heaven and Hell
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Openplay-dev mailing list      (Openplay-dev@list...)
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/openplay-dev/ezavada%40io.com
>
> This email sent to ezavada@io.c...
>
>
Ed Zavada
Pixel Dust Games
ed@pixe...
http://www.pixeldustgames.com/

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Openplay-dev mailing list      (Openplay-dev@list...)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/openplay-dev/subscriber%40opensubscriber.com

This email sent to subscriber@open...

Bookmark with:

Delicious   Digg   reddit   Facebook   StumbleUpon

Related Messages

opensubscriber is not affiliated with the authors of this message nor responsible for its content.