Reading Bitcoin Developer Guide, I couldn't fully answer following question:
What is the exact purpose of the Stopping Hash field inside a GetBlocks Message?
Node1 announces block B3, using an 'inv' message with B3's gash.
Node2 does not know about B3, or its parent B2, but does know the grandparent B1. It sends a getblocks message, starting from B1, but stopping at B3.
Node1 replies with an inv for B2, but not with B3 or any potential successor B4 thay may have appeared.
The purpose is just avoiding sending too many hashes in case the sender already knows some successor.
Note that since Bitcoin Core 0.10.0, getblocks is no longer used. getheaders has similar logic though.