RDP over UDP failing on Windows 10 1809 with reduced MTU links

rdpwindows 10

Since updating to Windows 10 build 1809 on both RDP client and server, I'm seeing a black screen after the initial logon sequence completes when connecting over a link with a smaller-than-ethernet MTU, and when UDP transport is enabled.

These scenarios work as expected:

  • LAN link, MTU 1500 bytes, both TCP and UDP transports enabled.
  • VPN link, MTU ~1350 bytes, only TCP transport enabled.
  • 1809 client to older server (e.g. Windows Server 2012 R2), both transports enabled, any MTU link.
  • 1803 client to 1809 server, both transports enabled, any MTU link.

This does not work:

  • VPN link, MTU ~1350 bytes, 1809 client, 1809 server, both transports enabled.

Looking at a packet capture of the non-working configuration, the initial login sequence is as expected (TCP control channel, UDP data channel). Then, a short while later (corresponding to the "black screen" shown in the client), there's lots of IP fragments which Wireshark doesn't manage to reassemble:

Wireshark capture of RDP-UDP fragments
I notice that build 1809 introduces RDP over UDP extensions v2: https://msdn.microsoft.com/en-us/library/mt847234.aspx – I wonder if this is failing to do path MTU discovery correctly?

A workaround is to disable the UDP protocol (https://getadmx.com/?Category=Windows_10_2016&Policy=Microsoft.Policies.TerminalServer::TS_SELECT_TRANSPORT), but obviously this comes at the expense of performance in slightly lossy networks, so isn't ideal.

Another is to use the UWP RDP app – I assume this doesn't use RDP-UDP.

I'm guessing this is a bug – I wonder if anyone's had it acknowledged by Microsoft?

Best Answer

I think you can try disabling URCP (Universal Rate Control Protocol) for Terminal Services on your server as described here: Windows 10 RDP black screen when connecting to Server 2019

On your Server 2019, open the registry editor and navigate to HKLM\SOFTWARE\Microsoft\Terminal Server Client

Create a new d-word (32-bit) value and name it UseURCP with decimal value of 0

I am not 100% sure if that will help you, but I think its worth of a try.

Related Topic