mu*index
lezen
thema
MCCP  [protocol]
Compressie van de stroom. Goedkoop, breed uitgerold, en het protocol dat de
leerzaamste bug in de geschiedenis van dit project opleverde.
https://www.mudhalla.net/tintin/protocols/mccp/

Gemeten adoptie
  216 van 886 vermelde spellen hebben we het zien aanbieden (24.4%)
  /nl/games?protocol=MCCP

  De spellen die hier niet meetellen zijn geen spellen zonder het protocol. Een
  spel telt mee wanneer we zijn server de optie in een handshake hebben zien
  aanbieden; de rest zijn servers die het ons niet aangeboden hebben en servers
  waarvan we de handshake niet gelezen hebben, en welke van beide het is kunnen
  we niet zeggen.

  Naar codebase, van de spellen die we hebben vastgesteld
    CoffeeMUD            31 van 32 boden het aan
    FluffOS              24 van 28 boden het aan
    ROM                  13 van 55 boden het aan
    Evennia              11 van 11 boden het aan
    DikuMUD              8 van 35 boden het aan
    CircleMUD            4 van 47 boden het aan
    MUCK                 3 van 24 boden het aan
    SMAUG                2 van 20 boden het aan
    AresMUSH             0 van 18 boden het aan
    CobraMUSH            0 van 2 boden het aan
    PennMUSH             0 van 34 boden het aan
    RhostMUSH            0 van 40 boden het aan
    tbaMUD               0 van 5 boden het aan
    TinyMUSH             0 van 9 boden het aan

MCCP comprimeert de stroom van server naar client met zlib. Versie 1 is
telnet-optie 85 en is feitelijk historisch; versie 2 is optie 86 en is waarover
moderne servers onderhandelen. Nadat de server IAC SB MCCP2 IAC SE gestuurd
heeft, hoort elke byte die volgt bij één doorlopende zlib-stroom.

Het is een echte besparing op een tekstprotocol — MUD-uitvoer laat zich
uitzonderlijk goed comprimeren — en het is gangbaar in de Diku- en LP-families,
waar ruwweg een derde van de codebases in ons onderzoek erover onderhandelt.

HOE HET MISGAAT, EN WAAROM DAT HIER UITMAAKT

Een client die over MCCP2 onderhandelt en de stroom vervolgens niet uitpakt,
ontvangt binaire rommel vanaf het compressiemarkeerpunt. Geen foutmelding, geen
verbroken verbinding: het verbindingsscherm komt binnen als een muur van
vervangingstekens, en alles daarna — het WHO-antwoord, elke latere MSSP, de hele
sessie — is verloren.

Dit is niet hypothetisch. Onze eigen telnet-bibliotheek deed precies dat. Ze
onderhandelde over de optie, vuurde haar callback voor ‘compressie ingeschakeld’
af, en pakte geen enkele byte uit. De payload liet zich met een gewone
zlib-aanroep zonder problemen decomprimeren, en dat maakte ondubbelzinnig
duidelijk dat de servers gelijk hadden en wij niet. Dertien van de achtendertig
codebases in ons onderzoek waren geraakt, en zolang het duurde konden we niet
waarnemen waarover die servers na het begin van de compressie onderhandelden —
dus ons beeld van hun mogelijkheden stelde ze te laag voor.

Het is upstream opgelost. Een vervolgdefect — de inflater die per leesbewerking
opnieuw wordt aangemaakt in plaats van voor de duur van de verbinding bewaard te
blijven, wat halverwege een groot verbindingsscherm misgaat — is gemeld en staat
open, en treft de staart van de grootste schermen.

Twee dingen die een lezer hieruit mee moet nemen. Een protocolcijfer op deze
pagina is net zozeer een meting van onze crawler als van de hobby, en waar we
weten dat het fout is geweest, zeggen we dat. En schrijf je een client: over
MCCP onderhandelen is makkelijk, en het correct uitpakken is waar het werk zit.

Zie ook
  ROM — /nl/reference/codebases/rom
  DikuMUD — /nl/reference/codebases/dikumud
  GMCP — /nl/reference/protocols/gmcp