In fact, you cannot keep them completely syncronized. You cannot hope to run the WorldUpdate function simultaneously.

A things to keep in mind is that server should be the "official copy" of the game, while the clients are a kind of "best effort copy", where slight errors can be present.
So the server is responsible to decide collisions and events in general of the game. For example, it can happends that in a client, little errors can result on a collision (for example a missile hitting the target), while in the other clients and in the server this doesn't happend (the missile miss the target). In this case you get a de-syncronization (or whatever it calls )
A way to handle this is to remove all controls and events from the clients and let the server do the calculation and notify clients of happening of events in the game.
The client should simply obey to server notification and try to correct delays if it can. For example, the server can put in the notification, information about position and orientation of the interested objects. In this way, the clients, when receive the notification, can also do some adjustment .

This is a little more problematic in ODE becouse of some things:
- sending the object information on collisions means to send the position, orientation, linear velocity, angular velocity, etc etc..
- correction are difficoult to apply. ODE is made to work naturally by itself, if you "hard move" the objects by changing the position manually, it can take it bad..

About the protocol, i think you should use UDP. It is more quick and the problem of loosing packets is very limited. The fact that it is not granted that the packets arrive, doesn't mean it will loose many of them. In my life i've never seen and UDP packet being lost while i used them in my games.
Anyway, for the "control communications", you should use a normal TCP connection. It's far more easy for that job. You should use for client and server initialization, and to send the "start" message. Then you switch to UDP until the end of the game.
Don't warry about the delay of the "start" message. That for cycle you've written that handle the delay is useless IMHO. It's not a single packet that causes problems, and the starting delay is adjusted as soon as the first packets start to travel to and forth.

Let me know how you do it and how it comes out since i'm interested in it.. i'd like to add multiplayer support to FunkyCars.

Bye!