a basic flow control can be achieved by doing a ping / pong cycle between client & server.
client : send a ping every time he received a pong
server : send a pong (+ all necessary game packets ) every time he receive a ping
the ping/pong cycle may also be used to synchronize clocks between server & client (you will then use the server synchronized clock later client side to synchronize units animations the same on all clients)
Here is another possible idea for the game :
I will do all the game logic / control server side ( not everything : only units move & states) and let the client display animation on unit based on their active state & location.
client side you can use “time tracks” for each units/entity :
thoses tracks are filled when receiving packets from server, eg : “unit 12 is at location 10,15 at timestamp=100205ms”
when displaying a units you compute it location by reading (interpolating) its tracks at the rendering time using the synchronized server clock minus some delay (3/4 secondes seems ok for an RTS)
track sample :
unit 12 is at location 10 at time 1000
unit 12 is at location 20 at time 2000
rendering frame at server time minus delay, let says 1500:
unit 12 is rendered at location 15 for that frame
inded you have to only send delta change to client
for a simple case you will have two possible packets going from server to client :
unit move to x,y at time T
unit attack x,y at time T
=> two tracks : location, action (both time based)
client will also perform some kind of logic but nothing that can change a fight results or influence other players, but it can choose to rotate the sprite to match the direction it is moving to, or animate it based on its current action & life points , etc…
client can choose to render in different way but everything will end the same, because client are never able to influence/impose a game state change, they only act as a passive viewer