reg is:
client-side or server side
actual bad reg or player misinterpretation
you cannot do anything against server-side bad reg. If everyone on a server is regularly getting dust shots, you're fucked. Go play somewhere else. On a good server, however, optimisation can help a lot: forward all BF2 ports properly, close down all processes that you can, tweak a bit, use the right settings. You will suffer from it occasionally but after having spent weeks tweaking and optimising I've managed to get my dustshots down to acceptable frequencies.
Secondly, many players cannot distinguish between actuall mistakes and genuine bad hit reg. Remember that when you see a shot hit something that is how YOUR computer predicted it. The time it takes for information to reach a server changes this, so in reality, despite ping compensation, time must be compensated for. If you get a headshot on a moving target and it did no damage, chances are you hit, the bullet should have hit, but that's only how it is on your computer: by the time it reaches the server, the player has shifted in that 0.05 seconds enough to have moved away from your shot. Thus, he doesn't get hurt and on your end you see an enemy surviving a headshot.
This means that you have to get a feel for where to place a shot for it to hit. I was quite decent at this back in cs 1.5 where you had to aim up to a meter behind a fast moving target to hit them with an AWP. BF2 is very similair.
And finally, bad reg has nothing to do with packet loss or bad server-client communication. If you get hit by a "bad reg" bullet, you can see it hit you, but you don't take damage. You can even see bad reg in Demo's. This means that the information gets through, the bullet is properly predicted to hit the target, but for other reasons it is not counted as a hit. I have no idea what those reasons are. Maybe some other information is being lost, but I cannot really comment on that.