Check if data is available using Serial.available(). If so, read a byte using Serial.read() and compare. If valid, send back e.g. 0x00 (ACK for valid command) or 0x01 (NACK for invalid command) using Serial.write().
If your commands are always single byte, you can skip the below.
Regarding overhead, you will have to keep your PC and Arduino in sync. Lets say that you send two bytes
0x50 -> switch led on
0x03 -> led on pin 3
You receive 0x50 but for whatever reason miss 0x03; your Arduino will happily be waiting for the second byte to know which led needs to be switched on.
Next you send two bytes to switch the led off
0x51 -> switch led off
0x03 -> led off pin 3
As you missed the 0x03 earlier, the Arduino will now take 0x51 as the second parameter and will switch led 81 on ;)
So you need to design a protocol. E.g. for transmission from PC to Arduino
start byte; the Arduino code will ignore any serial data till it has seen the start byte
data length; how many bytes are to be expected
data bytes; the actual data
checksum; so you can validate the received data
end byte; indicates end of data and Arduino code will wait for start byte again
There is a bit more to that; what if the data can contain the start byte (e.g. start byte is defined as 0x50 but command can also be 0x50). If the Arduino missed the start byte for whatever reason, it will see the command 0x50 as the start byte and use the next byte as the length.
So think about it before thinking that it might save you overhead :)