Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: TCP maksimiviive

HannuTapio [09.05.2022 05:26:38]

#

Projektia,

Hei, minä en enää esitä näitä lautapelejä täällä, mutta, kyselen silti tästä projektistani ja sen kehittelystä tässä ketjussa.

Minulla on tälläinen kysymys, kun minulla on tämä hiekkaset luolalentely siirtymässä rakenteluun, niin, minulla on ongelmana tämä tcp liikenne, en ole aiemmin koodannut live peliä jossa on näppäin painalluksia, ja 16 pelaajaa.

Kysymys : Kuinka vanha paketti voi TCP paketti olla kun se saapuu perille ? Voiko olla yli sekunnin vanhoja paketteja kun paketti saapuu perille ? vai onko tällöin jo kyse koko internetin seisomisesta, kuinka vanhoja TCP paketteja voi saapua perille ?

Minulla on tarkoitus antaa lupa siirtyä eteenpäin aina kellon mukaan, ja haluaisin tietää kuinka kauan tälläisen luvan siirtyminen toisille pelaajille voi kestää ?

Onko kyse aina ihan millisekunneista, vai voiko olla satoja millisekuntteja tai sekuntti tai kaksi ?

Minä jo hieman juttelin aiemmin tätä, ja silloin neuvottiin, että, ei tarvitse antaa lupaa, mutta, minulla on helpompi ajatella, tätä omaa koodia, kun käytän lupa pelikello aikaa, johonka voi pelin hetki siirtyä.

Minä aina annan joka pelaajalle, luvan siirtyä 175ms eteenpäin, pelin kulussa, aina 50ms välein ja sitten näppäin painallukset aina 200ms päähän toteutumaan, eteenpäin siirtymisen lupa vahvistetaan, kun lupa on saatu siirtyä joka pelaajalta.

:) :) :)

--

Mod. aloitti uuden aiheen. Yksi asia per ketju!

Metabolix [09.05.2022 09:25:52]

#

TCP toimii siten, että jos paketin vastaanottajalta ei tule kuittausta (ACK), paketti yritetään lähettää uudestaan. Jos toistuvista yrityksistä huolimatta ei saada kuittausta, käyttöjärjestelmä tulkitsee, että yhteys on katkennut. Saapuvan paketin maksimi-ikä on siis suunnilleen se, miten pitkän ajan jälkeen käyttöjärjestelmä tekee viimeisen yrityksen, ennen kuin tulkitsee yhteyden katkenneeksi.

Yhteyden katkeamisen aikarajaa voi säätää, asetukset riippuvat käyttöjärjestelmästä, ja oletus on yleensä jotain kymmenien sekuntien ja jopa minuuttien luokkaa. Yksi tähän liittyvä asetus on Linuxissa tcp_retries2 ja Windowsissa ilmeisesti TcpMaxDataRetransmissions.

Grez [09.05.2022 10:35:48]

#

Kysymyksen voinee ymmärtää myös muotoon: "Kuinka suuri enimmäisviive on realistinen TCP-paketeilla?"

Jos paketti menee ensimmäisellä yrityksellä perille, niin viive on tyypillisesti suomen sisällä alle 10ms ja esim. jenkkeihin alle 100ms. Enimmilläänkin yhdensuuntainen viive on yleensä alle 200ms mikäli yhteyksissä ei ole hetkellistä ruuhkaa (paketit eivät jää jossain kohti jonoon). Sinänsä olen siinä käsityksessä että paketteja ei kovin suuria määriä varastoida, vaan ylikuormittunut yhteys käytännössä hyvin nopeasti (luokkaa ms) johtaa jonon täyttymiseen ja siihen että osa paketeista "tiputetaan". Siitä päästäänkin seuraavaan kohtaan.

Ehkä mielenkiintoisempi tilanne on, jos paketti jostain syystä ei mene ensimmäisellä yrityksellä, vaan lähetetään uudelleen. Tällöin siis lähettävä tietokone ei saa odottamaansa kuittausta paketin saapumisesta ja tietyn viiveen jälkeen lähettää paketin uudelleen. Tämä viive riippuu lähettävän koneen käyttöjärjestelmästä, asetuksista ja siitä onko kyseessä alkupään paketit vai onko yhteys ollut pidempään auki. Esim. Windows 7:ssä (eka dokumentaatio mikä tuli vastaan) uudelleenyritys tehdään oletuksena aluksi 3 sekunnin kuluttua siitä kun kuittausta ei saada, mutta sitä säädetään RFC793 mukaisesti.

Lopputuloksena tulisin siihen johtopäätökseen että hyvillä yhteyksillä paketit tulevat perille alle sekunnissa erittäin suurella todennäköisyydellä, paitsi jos yhteys on juuri avattu.

Metabolix kirjoitti:

Yksi tähän liittyvä asetus on Linuxissa tcp_retries2 ja Windowsissa ilmeisesti TcpMaxDataRetransmissions.

Niin tuo TcpMaxDataRetransmission siis kertoo montako yritystä tehdään. Oletus taitaa olla 5. Ja jokaisella uudelleenyrityksellä viive tuplataan. Jos siis ensimmäinen uudelleenyritys tehdään 3 sekunnin kuluttua, niin sitten viimeinen yritys tehdään 3+6+12+24+48 = 93 sekunnin kuluttua ensimmäisestä lähetyksestä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta