If you play many online multiplayer games on PS4, you may have been running into connectivity problems. For example, in Call of Duty Ghosts your NAT Type might often times be “Moderate” instead of “Open”. After some research and a little bit of programming, I think I have some proof of a 100% reproducible bug in the PS4’s handling of Universal Plug and Play, or UPnP for short.
UPnP is a network protocol that allows devices on a network to communicate with a UPnP-enabled router and request ports be opened and forwarded through the router’s firewall. This automates what used to be the old game of figuring out how to manually forward the ports on your router by yourself to allow you to play certain games online, or be able to run a Minecraft server or what have you.
The PS3 firmware’s network settings has a setting to allow you to toggle UPnP support on and off. For whatever reason, the PS4 has no option for UPnP. My theory is that there is some logic in the PS4’s firmware that attempts to determine whether the network has a UPnP-enabled router and dynamically enables or disables UPnP, or just forces you to keep UPnP on.
I happen to have multiple PS4s in my house, and I could not for the life of me get both consoles to have Open NAT in CoD Ghosts. UPnP solved the problem fine on my PS3s and I got Open NAT on both consoles. When I tried to rely solely on UPnP for PS4, both consoles would have Moderate NAT and the corresponding lag and matchmaking problems. Manually opening port 3074 on one PS4 worked of course for that console, but the 2nd console was still out of luck.
I don’t give up that easily. My network setup is a little bit exotic; my router/firewall is a Linux box, so I have all of the network diagnostic tools at my disposable. I’m also a programmer, so I added some extra diagnostic code to the Linux IGD code that provides UPnP support to give me a better idea of what was going on.
It turns out, the first console wasn’t making UPnP requests. It would just go straight to using Moderate NAT. The second console would actually make a UPnP request, but would end up getting some other random port (not 3074/UDP, the default port used by Call of Duty games). Ghosts would interpret this as failure and fallback to Moderate NAT.
I tried quitting the game on both consoles, resetting my firewall and restarting the UPnP services — maybe it was something wrong with my network configuration. After loading the game back up on both consoles, I got the exact same behavior. I tried resetting the firewall, UPnP service and rebooting both consoles; same behavior.
By chance, I tried running the Internet Connection Test in Network Settings on the first console. I saw the first UPnP request come through from that console! I booted up Ghosts; lo and behold, it made a UPnP request for 3074/UDP and got Open NAT. I booted up Ghosts on the second console, it requested 3074/UDP and saw that 3074/UDP was already reserved by another device, requested another random port, and got Open NAT as well.
After several more tests, the only reliable way of getting Ghosts to make the UPnP requests was to run the Internet Connect Test before I launched Ghosts on the first console. The PS3 of course has the network setting available to allow you to control whether or not UPnP is enabled, so UPnP works as it should on PS3.
My working theory is that the PS4 firmware is not initializing UPnP during its boot up process. The Internet Connection Test forces it to check UPnP. This happens even when there is no other console connected to the network, and whether you start from a full “Power Off” or when booting up from Standby mode. Not being a licensed PlayStation developer I of course have no way of confirming the theory, and my attempts at contacting Sony directly have gone unanswered. Hopefully this post will both spur them into action and help other users running into the same problem to at least be able to work around the problem until it is eventually fixed.
Have you run into connectivity problems with online multiplayer games on PS4? Submit your own experiences in the comments.