This is mostly likely not a SQL server issue but the setup seems to only be affecting BULK INSERTS to SQL Servers.
We have recently moved VM Hardware and all the guests that were moved had their virtual switches changed from standard to distributed.
I then started receiving
A fatal error occurred while reading the input stream from the network. The session will be terminated (input error: 64, output error: 0)
on a two SQL servers during BULK INSERT operations. One of the SQL servers was a VM with the new configuration and the other was a physical server. Both BULK INSERT operation originated from a VM with the new configuration. The BULK INSERTs would not fail every time, it was very random when it would.
When we changed the virtual switch to be a standard switch instead of a distributed switch the issue goes away.
I am looking for more of an explanation to why it doesn't work with a distributed switch instead of a resolution. My guess would be that the BULK INSERT operation is serial and with a distributed switch the packets are being routed through different hosts, some of which may be busier than others, and are arriving at the destination server beyond some latency threshold. (note: there is nothing in the windows event log at the times of the errors on either the source or destination server)
UPDATE: turns out the issue was due to the NIC. All of our VMs were configured with an E1000 NIC which functioned well enough on standard switches. Once we moved to distributed switches, we started seeing issues with large data transfers, not just sql queries. Changing the NIC to VMXNET3 seems to have resolved the issue.