The Wiki makes this statement:
It [
getdata
message] can be used to retrieve transactions, but only if they are in the memory pool or relay set - arbitrary access to transactions in the chain is not allowed to avoid having clients start to depend on nodes having full transaction indexes (which modern nodes do not). [my emphasis]
https://en.bitcoin.it/wiki/Protocol_documentation#getdata
Yet "Connection Bloom filtering" (BIP-37) seems to require just such an index system:
The filter can be tested against arbitrary pieces of data, to see if that data was inserted by the client. Therefore the question arises of what pieces of data should be inserted/tested.
To determine if a transaction matches the filter, the following algorithm is used. Once a match is found the algorithm aborts.
An ordered list of criteria is then given.
It appears that a node supporting such a filter would also need to maintain an index (or several), or risk denial of service attacks.
I saw this question:
70% of nodes accept Bloom filters, despite DoS attack vector?
which doesn't appear to answer the question about indexes.
I saw this question:
the only answer to which implies, without stating explicitly, that no indexes are created at all.
What indexes does a node create for the sole purpose of supporting Bloom filtering for SPV nodes?
If none are created and transactions are filtered on the fly, how can this statement in the linked question above be true?
Thus you can easily trigger exactly the same DoS attack by just using regular getdata requests on large blocks over and over. You don't need Bloom filtering. If you don't want to actually download the blocks just don't TCP ACK the packets and then FIN after a few seconds .... the data will all have been loaded and be sitting in the send buffers.