I read that there are IGMP Join, Leave and Query messages. However I read that CGMP has Join, Leave and Query messages too.
Are they the same? What's the difference?
IGMP is the protocol used between end hosts and router to exchange multicast membership information.
IGMP join and leave messages are sent by end hosts to multicast router to join or leave any multicast stream and IGMP query message is sent by router on a specified interval to check for any member.
CGMP message is sent by router to switch to inform which mac addresses are part of a specific multicast mac address. CGMP only have join and leave messages.
CGMP messages will have User Source Address and Group Destination Address fields. If a CGMP join message is sent with say, USA as A.A.A and GDA as B.B.B, it conveys the switch that stream destinated to B.B.B should be forwarded to A.A.A and CGMP leave message to not forward the stream to specified USA.