It is intrinsic in the nature of TCP that long packets may be broken up and small packets may be combined. The bytes will eventually arrive in the same order, but you can't count on the grouping. You may send 800 bytes and another 800 bytes and the 1600 bytes may arrive as packets of 100, 900, and 600. A typical transmission unit over Ethernet is 1500 bytes. (You may have some control over this via socket options such as MTU, but any router the packets flow through can change the divisions.)
The recv call returns when any data is available; the LENGTH parameter is a maximum, not a minimum. So, either you have to loop, or you use a method that implicitly loops, like readline, also known as <>. If your data always ends with a CR and there's no CR in the data, you can:
$/ = "\r";
$buf = <$new_sock>;
You don't have to use binmode on sockets. They use bytes by default.