I would suggest that you include the type of request/response in your messages. You could perhaps have an enum with your message types and that way you can check once you parse the message. Of course this means that you might need to use optionals for the payload of your message. Parsing to identify the type of message is frowned upon as all messages with the same structure parse as the same thing. Reflection is mostly used in my experience to query the structure of an already identified message.
An idea could be to have for both request and response a structure like this:
message Rpc1 { ... }
message Rpc2 { ... }
message RpcMessage {
required uint32 message_type = 1;
optional Rpc1 rpc1 = 2;
optional Rpc2 rpc2 = 3;
}