Networking reliable physics is quite a hefty and challenging task to undergo. Depending on how you design your game, you could be looking at designing systems like interpolation, extrapolation and client-side prediction. Each of which have their own pro's and con's associated. A great article to read, which I found helped me a lot, is Valve's Multiplayer Networking.
https://developer.valvesoftware.com/wiki/Source_Multiplayer_NetworkingHowever, some of the methods described in here may not be ideal for your game, it all depends on what you are trying to achieve.
I am trying to make a physics-heavy sandbox game (much like Garrysmod). Initially I thought a full authoritative approach would work best, however I quickly ran into problems with client-side prediction. As it so turns out, CLSP seems almost impossible in the current version of Unity, without sacrificing a lot of freedom, or by implementing some sort of 3rd party physics library. In terms of sacrificing freedoms, you could alternatively make your own Rigidbody class and use straight line motion formulas to predict movement and correct errors, and then use a CharacterController.Move command to get instant collison feedback. The downside of this being that all your predicted objects cannot be anything other than capsule colliders. And for the sakes and purposes of my game, I couldn't do this.
So I had to scrap the idea of CLSP and with it a fully authoritative approach. My next point of option was semi-authoritative. Where the client takes care of his own position and relays it to the server, which then relays it to the other connected clients. In order to prevent jittery movement I implemented an interpolation system which delays the players view back 100ms. Based heavily off the default networking script and this one here:
http://wiki.unity3d.com/index.php?title=NetworkView_Position_SyncHowever I found that players often moved around with slightly jitter movement. Not too bad, but noticeable enough to look unnatural. It seemed that the players would move at a much lower framerate.
I synched packets at ~ 20 times per second, is this too much? Is this not enough?.
In my game, players also have the option to spawn in and manipulate objects, rotating, dragging them around, etc. My current implementation uses a semi-authoritative approach. The server is authoritative of all entities until a client picks one up, then the client tells the server where the object moves and interpolates between (once again slightly jittery). The downside I have yet to resolve is that once the player lets go of the object, and the server assumes control again, there is a noticeable jump as the server is not fully up to date with what the client was prior to exchanging ownership. Something I have also yet to fix.
Another thought occurred to me that perhaps I just let the individual players simulate their own physics, and let the server send out a heartbeat every once and awhile to correct errors, however I quickly found out that things went out of sync very fast and the correction of errors was far to noticeable to allow for any smooth sort of gameplay.
After weeks of networking and prototyping I'm becoming ever frustrated with approaches on how I can solve these issues.
What do you guys thinks?
EDIT: I noticed that with a lot of the examples here, that the colliders get updated to server position straight away, and the renders lag behind. Is this a better method than what I currently have? What would be the drawbacks, etc from using this over interpolating everything.