How are transactions efficiently distributed to network nodes before inclusion within blocks? How does the bitcoin core efficiently distribute transactions so that they are added to node transaction pools to be inserted into a future block?

I understand that each bitcoin node has a list of peers which they are in communication with.  As an originating node makes a payment, they send the payment across their peer network, which then continues the distribution process by forwarding the transactions to the peers within their peer list.

How is this process effeciently executed, such that transactions sent from one peer, sent numerous times across the network as it is distributed?  (For further clarification of the problem, see my Problem Outline below.)

In other words, how does a node resolve which peers to send new transactions to so that the transactions can be included into their local transaction pool?  If peer filtering doesn't take place, then the result would be a considerable amount of redundant, network traffic.

PROBLEM OUTLINE

Consider the following...


Distribution level #1 - Originator (A) sends a transaction to peers (B) &amp; (C).
Distribution level #2 - Peer (B) forwards the transaction to peers (D) &amp; (E), &amp; peer (C) forwards the transaction to peers (F) &amp; (G).
Distribution level #3 (Partial) - Peer (D) forwards the transaction to (C) and (G).


This is where we see the problem!  Peer (D) is completely unaware that nodes (C) and (G) have already received this transaction.  At best, (D) can only know that nodes (A)-&gt;(B)-&gt;(D) have received this transaction.  Since (D) is completely unaware of the state of the transaction in nodes (C), (E) &amp; (F), peer (D) can potentially forward the transaction along to a high number of peers that are aware of the transaction.  

Scale this to thousands of nodes and thousands of transactions and you could have a BIG problem.  How is this resolved?
Have a look into the specifications https://en.bitcoin.it/wiki/Protocol_specification

Check the "inv" --> "getdata" --> "tx" sequence of transaction distribution