The Internet is based on the TCP/IP (v4 for the moment, v6 is currently "just starting" as it has been for a number of years), is based on splitting data up in packets and sending these independently to the target. The important part is, that IP is by design assumed to be non-perfect, e.g. an overloaded router is supposed to drop packets, and this is the
correct behaviour, higher layers rely on this to handle the situation in a sensible way. E.g. TCP does have builtin rules how long to wait for acknowledgement, before starting to resent data, and so on.
Btw, this applies in truth to all ISPs, not just mobiles.
So back to our (simplified) story how a webpage is fetched to your mobile. First the mobile sends a packet to the server to request the page. The request travels over the air to a base station of your network, travels over the internal network and at some point passes over to the public internet, and arrives at the server. The data back from the server travels more or less the same path back.
So where is the problem with this?
Data packets can be dropped at any stage, and especially the last stage over the radio waves is prone, because of overload and/or bad coverage. Now your phone does not get a packet of the response data, hence does not acknowledge hence the server starts to retransmit the response. Depending on your luck, your mobile gets this and acknowledges it, or not, which starts another retransmit.
Okay, that's fine, that's how the Internet is supposed to work.
Well, the Internet yes, but the Internet has been designed without the idea of toll booth, hence it's very hard to count data usage correctly. Most networks count probably at the border to the radio waves, which admittingly is probably the customer-friendliest way to count, but it still does not take into account if the packet is really received by the customer. Basically metered voice calls/texts have the property that usage is clearly observable by the user. Data usage OTOH, cannot even be correctly observed by the device. If your device cannot record correctly the usage, how are you supposed to notice it?
Depending how on local network conditions (coverage, load) about 5-10% difference between what your mobile tells you that you used and what your network charges you can be explained this way.
But there are further issues. Many networks provide only "private" IP addresses. If so, you have basically a "PBX-style" setup, were you can communicate outside, but your extension is not direct dial-able. Which can give you some issues with P2P communications, e.g. for multiplayer games. The most important from our point of view is that without your device initiating traffic, nobody can directly send data to your device. (That's why most PUSH systems in the mobile space are in truth more like connect-and-wait-till-something-interesting-like-email-happens.)
If on the other hand you've got a public IP address, basically anyone can send you garbage, and the usage data counter won't be able to tell these packets from stuff you wanted, not only will your connectivity start to crawl like a snail, your data cap will be used up pretty fast, ...
If you wonder how to tell which way your provider handles this, you can install something like
IP Widget to see what address your device has been assigned. If it starts with 10, 172.16-31, or 192.168 you've got a
private address that is being translated by the provider when you access the Internet. If not, you've got a public address that can be used to access your phone from the outside.
And there is just a third way that might use up your data cap pretty quickly.
Most providers use billing increments and bill at least one billing increment every time you connect to the network. If the increment is 32KB, that's ugly but somehow tolerable. But an increment of say 1MB can add up quickly, especially if connect it with bad coverage which increases the probability that your phone with kill the non-working (from the point of the TCP/IP networking software in your phone) connection and reconnect from scratch, oops, here your billing increment goes. E.g. everytime I walk the dog, I pass through the elevator that has no coverage, and the travel time is long enough that the mobile notices the coverage problem, so that implies on my contract, that implies 3.8MB data usage (in the worst case, the average will probably be 1.9MB) by rounding. (2 times daily times 2 in/out times 30 days a month * 32KB increment).
So to summarize, paying by data used, always includes some inaccuracy, and worse, in some cases can you expose to data usage that was not caused by you, as the data traffic counter never can know if the packets are garbage, or just the newest cool app that transmits only encrypted data.