mu*index
lezen
platte tekst
thema

protocol

MCCP

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 — 24.4%

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.

Spellen die we MCCP in een handshake hebben zien aanbieden, naar de codebase waarvan we vaststelden dat ze erop draaien.
codebase bood het aan vastgesteld
CoffeeMUD 31 32
FluffOS 24 28
ROM 13 55
Evennia 11 11
DikuMUD 8 35
CircleMUD 4 47
MUCK 3 24
SMAUG 2 20
AresMUSH 0 18
CobraMUSH 0 2
PennMUSH 0 34
RhostMUSH 0 40
tbaMUD 0 5
TinyMUSH 0 9

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 De bekendste afstammeling van Merc, en de gevechtsengine waarop een groot deel van de MUD's uit de jaren negentig gebouwd is.
  • DikuMUD De wortel van de familie gevecht-MUD's. Levels, klassen, uitrusting en areabestanden — en een licentie die een generatie afgeleiden vormgaf.
  • GMCP Het Generic Mud Communication Protocol — gestructureerde JSON-berichten naast de tekst, en het out-of-bandkanaal waar de meeste moderne clients tegenaan bouwen.