Protocol Compatibility & Wire Specs
In-depth technical breakdown of protocol implementations across Desktop/Core (Python) and Edge (Go), packet-level wire specifications, and homebrew client support matrix.
Specifications
PS2 Servers implements the
udpfsd protocol by
pcm720 (UDPFS over UDPRDMA), the
UDPBD block protocol, the parts of Microsoft's SMBv1, SMB2 and SMB3 specifications that PS2 clients use, NFS version 4.0 (RFC 7530) as unfs4 uses it, and HTTP range requests. The host conformance tests under
conformance/ run client code against these servers on a PC; for SMB and NFS that is the real PS2 client code (usmb2, unfs4, libsmb2) built for the PC. None of them is a test on a PS2.
1. Console Homebrew Compatibility Matrix
Loader support varies by project and version. Review this matrix to match your loader to the correct server mode:
| Loader / Application |
SMBv1 |
SMB2 / SMB3 |
UDPFS |
UDPBD |
HTTP |
NFS |
| RiptOPL |
Full Support |
Full Support |
Full Support |
Full Support |
Full Support |
NFS 4.0 via unfs4; OPL core and Ember PS1 games; console validation pending |
| Official OPL (ps2homebrew) |
Full Support |
Not in stock |
Not in stock |
Not in stock |
Not in stock |
Not in stock |
| Neutrino (Core) |
No |
SMB 3.0 via usmb2 (merged 2026-10-31, not in a release or development build yet); read-only ISO, TCP 445; console validation pending |
Native Primary |
Native Primary |
No |
NFS 4.0 via unfs4 (merged 2026-11-12, not in a release or development build yet); read-only ISO, TCP 2049; console validation pending |
| NHDDL (Neutrino GUI) |
No |
No |
Native Primary |
Native Primary |
No |
No |
| Open-PS2-Loader-HTTP (Docmine17) |
No |
No |
No |
No |
Native Primary |
No |
Launchstation, a file manager rather than a loader, browses SMB2/SMB3 shares (smb:) and NFS exports (nfs:) from these servers; see SMB and NFS. The Neutrino rows are for a Neutrino built after the backend was merged: upstream's latest development build is still v1.8.0-61-g7be8de2 of 2026-08-31 (checked 2026-11-13) and has neither.
2. Core (Python) vs Edge (Go) Wire Differences
While both implementations produce compatible network flows, they differ in several low-level operational details:
Socket Binding Semantics
- Core (Python): Passing
--bind IP binds only the dynamically allocated data socket; the discovery listener continues to listen on 0.0.0.0 (all interfaces) to catch broadcasts.
- Edge (Go): Passing
--bind IP binds both the discovery socket and the data socket to that explicit IP.
Compressed-Image Block Cache
- Core (Python): Keeps the most recently used decompressed blocks of each open compressed image, 32 by default (
--compression-cache-size).
- Edge (Go): Keeps the same number of blocks per image (same option and default), dropping the oldest first, and also caps each image's cache at 8 MiB, less on a machine with little memory.
UDPFS runs over UDPRDMA, the small reliable-UDP layer of udpfsd. Discovery is on UDP port 62966 (0xF5F6). Every packet starts with a 2-byte header, little-endian:
bits 0-3 packet type: 0 DISCOVERY, 1 INFORM, 2 DATA
bits 4-15 sequence number
DISCOVERY and INFORM add 4 bytes: the service ID (0xF5F5 for UDPFS) and a port. DATA adds a 4-byte header:
bits 0-11 sequence number acknowledged
bits 12-13 flags: 1 ACK, 2 FIN
bits 14-17 application header size, in 4-byte words
bits 18-31 data byte count
A DATA packet carries at most 1408 bytes of data. Its application header starts with the UDPFS message type: OPEN (0x10), CLOSE (0x12), READ (0x14), WRITE (0x16, data in 0x17), LSEEK (0x1A), DREAD (0x1C), GETSTAT (0x1E), MKDIR (0x20), REMOVE (0x22), RMDIR (0x24), and the block reads and writes BREAD (0x28) and BWRITE (0x2A). The replies are OPEN_REPLY (0x11), CLOSE_REPLY (0x13), WRITE_DONE (0x18), LSEEK_REPLY (0x1B), DREAD_REPLY (0x1D), GETSTAT_REPLY (0x1F) and RESULT_REPLY (0x26).