The problem is likely with the Windows guest and how it is communicating with the virtual NIC. Here are some things to try:
Disable TCP chimney offloading in the Windows guest. To determine if it is enabled run
netsh int tcp show global. To disable it run
netsh int tcp set global chimney=disabled
Disable TCP Offloading on the NIC in the Windows guest. In the guest Windows installation, go to device manager, open the NIC in question, go to the advanced tab and search for any option pertaining to TCP/UDP, checksum, largesend and/or TCP/IP offloading. Disable them. If it says "offloading" disable it.
Disable Receive Side Scaling in the Windows guest. Check if it is enabled with
netsh int tcp show global. Disable it with
netsh int tcp set global rss=disabled.
Disable NetDMA in the Windows guest. Check if it is enabled with
netsh int tcp show global. To enable / disable it manually a registry key needs to be added. Check to see if it already exists with
get-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -name EnableTCPA. If it does not exist and NetDMA is enabled, create the following registry key with PowerShell:
New-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableTCPA
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\" -Name "EnableTCPA" -Value 0 -PropertyType "DWord"
Disable Windows Network Task Offload in the Windows Guest. Check if the registry key exists using PowerShell:
get-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -name DisableTaskOffload. If it doesn't, add this registry key with PowerShell:
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\" -Name "DisableTaskOffload" -Value 1 -PropertyType "DWord"
Disable Autotuning in the Windows Guest. Check first to see if it's enabled:
Netsh interface tcp show global. If it is, disable it with:
Netsh interface tcp set global autotuning=disabled
Disable Remote Differential Compression in the Windows Guest if it is enabled. Go to the run command and run appwiz.cpl, select "Turn Windows Features on or Off" and deselect remote differential compression.
Check if Anti-virus is set to scan live traffic. Antivirus tools can be set to scan all traffic coming and going from the host for anything malicious. If that is the case on your Windows guest, disable it temporarily to test.
Some last ditch efforts on this include:
- One of my guesses was that there was a port speed mismatch - but you addressed that. Unless there's more options you can frob with in this regard.
- I usually recommend updating the network driver but this is less necessary in a VM since the virtual NIC is rather vanilla.
- Install the latest guest tools into the Windows Guest.
- I've seen some issues with IPv6 on Windows clients causing mysterious TCP/IP slowdowns. No idea why; I haven't researched it deeply. I suppose you could uninstall / remove v6 from the NIC.
- Check TCP/IP stats in the Windows guest to see if there are lots of errors or other interesting numbers.
netstat -es will do the trick.
- Last, but certainly not least, install Network Monitor and inspect the traffic for anything unusual. CRC errors, reconnections, dropped packets... who knows. Anything that looks ugly.