To make things clearer, there are two variables here:
Protocol - TCP vs UDP
Routing - Client-Client vs Client-Server-Client
The UDP setting in the Graal settings changes both variables:
- UDP disabled: Graal uses a TCP Client-Server-Client connection.
- UDP enabled: Graal uses a UDP Client-Client connection.
In summary, the UDP setting in Graal changes two things: the protocol, and the path the data takes to get to other clients.
Now, to analyze both of these variables a little...
TCP vs UDP
TCP is a protocol that has a lot of machinery to protect against temporary issues in between the two endpoints that are talking to each other. In other words, if there is a packet loss issue, TCP will try to resend the packets so no data is lost.
TCP is particularly good if you're, for example, downloading a large file. You don't want packet loss to corrupt your file.
UDP on the other hand has none of this protection. In gaming, this is sometimes better, since you can write your own "data-protection" protocol which suits your purposes better. But this usually involves some extra work, since just doing raw UDP isn't the greatest idea on a lossy link.
Client-Client vs Client-Server-Client
This is a really tricky question. Client-Server-Client data transfer is probably the "fairest" solution, and it's how I would do it.
Client-Client data transfer has the potential to be much more "lagless" if you're near each other in the real world, but also has the potential to be much worse. If there are more than 2 people in the level, it gets a hella lot more confusing, since every person will have a direct connection to one-another, and everyone will be seeing their own picture of what's going on in the level.
There is also the question of security in Client-Client connections, because there is no 3rd-party which can monitor what's going on.
Overall, I would personally do it like this: UDP Client-Server-Client. Doing Client-Client is a beehive of confusing lag for some players, terrible lag for some players, and security issues.