Sprawozdanie: ACK i RET
This commit is contained in:
parent
c746e560c0
commit
bcd17576bb
@ -28,6 +28,7 @@
|
||||
\usepackage{multirow}
|
||||
\usepackage{etoolbox}
|
||||
\usepackage{color}
|
||||
\usepackage{pgfkeys}
|
||||
|
||||
\pgfplotsset{compat=1.15}
|
||||
\usepgfplotslibrary{groupplots}
|
||||
@ -40,10 +41,12 @@
|
||||
\newcommand{\todo}[1]{{\color{blue}\textbf{TODO:} #1}}
|
||||
|
||||
\makeatletter
|
||||
\newcommand{\member}[2]{%
|
||||
\ifcsdef{last}{\node[packet, right=of \last, text width=(#2*4mm)]}{\node[packet, text width=(#2*4mm)]} (#1) {\texttt{#1}};%
|
||||
\node[below=of #1] {#2};
|
||||
\def\last{#1}%
|
||||
\newrobustcmd{\member}[3][]{%
|
||||
\ifcsdef{last}{\node[packet, right=of \last, text width=(#3*7.5mm)]}{\node[packet, text width=(#3*7.5mm)]} (#2)
|
||||
{\texttt{#2}};%
|
||||
\node[below=of #2] {#3};
|
||||
\node[above=of #2.north, text depth=0pt] {\texttt{#1}};
|
||||
\def\last{#2}%
|
||||
}%
|
||||
\newenvironment{packet}{%
|
||||
\begin{tikzpicture}[packet/.style={draw, auto, align=center, minimum height=7mm}, node distance=0]%
|
||||
@ -138,12 +141,10 @@ ten, który przyszedł pierwszy ponieważ są one od siebie niezależne.
|
||||
Protokół opiera się o wysyłanie datagramów UDP między wszystkimi klientami. Ze względu na specyfikę UDP (brak gwarancji
|
||||
dotarcia pakietów, brak gwarancji kolejności, brak gwarancji poprawności) przyjmuje się następujące założenia:
|
||||
\begin{itemize}
|
||||
\item nie wszystkie pakiety są ważne
|
||||
\item nie wszystkie pakiety są ważne, niektóre można pominąć
|
||||
\item wszystkie pakiety aby zostać przetworzone muszą dojść w całości poprawnie
|
||||
\item pakiety są numerowane
|
||||
\item przez ważne pakiety rozumiemy te, które zmieniaja stan mapy
|
||||
\item pakiety mogą wymagać konkretnego poziomu stanu gry
|
||||
\item pakiety zawierają timestamp aby w razie kolizji ustalić pierwszeństwo
|
||||
\end{itemize}
|
||||
|
||||
Ze względu na konieczność szybkiego przesyłania informacji pomiędzy klientami, zaprojektowany protokół jest protokołem
|
||||
@ -158,10 +159,9 @@ binarnym, o konstrukcji pakietu widocznej poniżej.
|
||||
\member{ClientId}{2}
|
||||
\member{State}{4}
|
||||
\member{PacketId}{4}
|
||||
\node[packet, dotted, right=of PacketId, text width=6cm] (Data) {Packet Data ...};
|
||||
\end{packet}
|
||||
|
||||
\caption{Budowa pakietu}
|
||||
\caption{Preambuła pakietu}
|
||||
\end{figure}
|
||||
|
||||
\begin{table}[H]
|
||||
@ -177,12 +177,43 @@ binarnym, o konstrukcji pakietu widocznej poniżej.
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
Dla ułatwienia implementacji przyjmuje się, że dla pakietów, których najstarszy bit typu (\texttt{Type \& 0xC0}) jest
|
||||
Dla ułatwienia implementacji przyjmuje się, że dla pakietów, których najstarszy bit typu (\texttt{Type \& 0x80}) jest
|
||||
ustawiony na 1 nie zachodzi potrzeba retransmisji - czyli są to pakiety mało istotne bądź szybko przedawniające się.
|
||||
Przykładem takiego pakietu może być aktualizacja pozycji gracza - nie ma potrzeby retransmisji ponieważ prawdopodobnie i
|
||||
tak w drodze jest następny pakiet z nowszą pozycją.
|
||||
|
||||
Aby upewnić się, że transmisja ważnego pakietu się powiodła, każdy klient musi zwrócić
|
||||
W celu zapewnienia poprawności transmisji, każdy pakiet poprzedzany jest 32-bitową sumą kontrolną \texttt{CRC32},
|
||||
pozwalającą upewnić się, że dane zostały odebrane poprawnie. Suma kontrolna liczona jest ze wszystkich składowych
|
||||
pakietu poczynając od \texttt{Type} włącznie.
|
||||
|
||||
W wypadku niezgodności przesłanej sumy kontrolnej z sumą wyliczoną po stronie odbierającego, odbierający wysyła pakiet
|
||||
\texttt{RET = 0x81}. Dla pakietów mało ważnych nie zachodzi potrzeba retransmisji.
|
||||
|
||||
Aby upewnić się, że transmisja ważnego pakietu się powiodła, każdy klient musi odpowiedzieć pakietem \texttt{ACK}
|
||||
(\texttt{Type = 0x80}). W wypadku, gdyby odpowiedź \texttt{ACK} nie dotarła w ciągu $t \text{ms}$ pakiet zostaje
|
||||
wysłany ponownie.
|
||||
|
||||
W przypadku wielokrotnego otrzymania pakietu o tym samym \texttt{PacketId} (np. w wypadku automatycznej retramsnisji),
|
||||
każdorazowo należy potwierdzić jego otrzymanie odpowiedzią \texttt{ACK} jednak akcja związana z tym pakietem powinna
|
||||
zostać wykonana tylko raz.
|
||||
|
||||
Pakiety \texttt{ACK} oraz \texttt{RET} w polu \texttt{PacketId} zawierają id pakietu, którego dotyczą. Dodatkowo ze
|
||||
wzgledu na to, że \texttt{ACK} nie jest bezpośrednio związany z rozgrywką, wymagany stan (\texttt{Sate}) zawsze wynosi
|
||||
0.
|
||||
|
||||
\begin{figure}[H]
|
||||
\center
|
||||
\begin{packet}
|
||||
\member{CRC32}{4}
|
||||
\member[Type]{0x80}{1}
|
||||
\member[Size]{17}{2}
|
||||
\member{ClientId}{2}
|
||||
\member[State]{0}{4}
|
||||
\member{PacketId}{4}
|
||||
\end{packet}
|
||||
|
||||
\caption{Pakiet \texttt{ACK}}
|
||||
\end{figure}
|
||||
|
||||
\section{Rozwiązania}
|
||||
O nie w tym wypadku też ciężko
|
||||
|
Loading…
Reference in New Issue
Block a user