Lets first define some terms:
Host: The player who is acting as the host for a game, being the server to other players clients.
Server Split: Where a game that contains more then one player splits between two hosts, causing a portion of the players to be "Split" in to their own game, showing them as disconnecting to the others, and vice-versa.
Disconnect: When a player disconnects from the host.
Desync: When one player says a value is X, whereas another says the same value is Y. The host seems to be the one to declare what is right and wrong in the way of sync, thus being out of sync with the host would cause a disconnection.
As for the causes:
Server Split: Who the feck knows. If anyone does, please do enlighten me.
Desync: The main cause of disconnects is from desyncs within the maps code. Other things have been known to cause desynchronizing and / or a simple disconnection, such as abnormally large values on damage dice. GetLocalPlayer() can be a major cause of desyncs, as it returns a different value for each player. There are many, many other causes of desyncs. Too many to list off the top of my head.