{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TCP, UDP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# UDP\n",
    "\n",
    "Kezdjük az egyszerűbb protokollal, az UPD-vel. \"A User Datagram Protocol (UDP) az internet egyik alapprotokollja. Feladata datagram alapú szolgáltatás biztosítása, azaz rövid, gyors üzenetek küldése. Jellemzően akkor használják, amikor a gyorsaság fontosabb a megbízhatóságnál, mert az UDP nem garantálja a csomag megérkezését. Ilyen szolgáltatások például a DNS, a valós idejű multimédia átvitelek, vagy a hálózati játékok.\" - [Wikipedia](https://hu.wikipedia.org/wiki/User_Datagram_Protocol)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Szerver:\n",
    "\n",
    "``` python\n",
    "# based on python.org example\n",
    "import socket\n",
    "import sys\n",
    "\n",
    "# Create a UDP socket\n",
    "sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n",
    "\n",
    "# Bind the socket to the port\n",
    "server_address = (\"localhost\", 5002)\n",
    "#sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n",
    "sock.bind(server_address)\n",
    "\n",
    "print(\"-- UDP server starts -- \\n  Waiting to receive message - %s, %d\" % (server_address[0], server_address[1]))\n",
    "while True:\n",
    "    data, address = sock.recvfrom(4096)\n",
    "    print(\"  New message: %s\" %(data))\n",
    "    print(\"  Received %d bytes from %s\" % (len(data), address))\n",
    "    if len(data) >= 1:\n",
    "        print(\"-- UDP server finishes --\\n\")\n",
    "        exit()\n",
    "```\n",
    "\n",
    "### Kliens:\n",
    "\n",
    "``` python\n",
    "# based on python.org example\n",
    "import socket\n",
    "import sys\n",
    "\n",
    "# Create a UDP socket\n",
    "sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n",
    "sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n",
    "server_address = (\"localhost\", 5002)\n",
    "message = b\"Hello UDP\"\n",
    "\n",
    "print(\"-- UPD client starts --\")\n",
    "try:\n",
    "    # Send data\n",
    "    print(\"  Sending %s\" %(message))\n",
    "    sent = sock.sendto(message, server_address)\n",
    "finally:\n",
    "    print(\"-- UPD client finishes, closing socket -- \")\n",
    "    sock.close()\n",
    "```\n",
    "\n",
    "### A programok futása:\n",
    "\n",
    "```\n",
    "-- UPD client starts --\n",
    "  Sending b'Hello UDP'\n",
    "-- UPD client finishes, closing socket --\n",
    "```\n",
    "\n",
    "------------------------------\n",
    "\n",
    "```\n",
    "-- UDP server starts --\n",
    "  Waiting to receive message - localhost, 5002\n",
    "  New message: b'Hello UDP'\n",
    "  Received 9 bytes from ('127.0.0.1', 58537)\n",
    "-- UDP server finishes --\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TCP\n",
    "\n",
    "\"A TCP egy kapcsolat-orientált protokoll, amely az OSI modell szállítási rétegében helyezkedik el. Fő feladata egy megbízható, és biztonságos kapcsolat kiépítése (és fenntartása) két folyamat között. Menetét alapvetően három részre bonthatjuk: \n",
    "Létrejön a megbízható kapcsolat két állomás között\n",
    "Megkezdődik a tényleges adatátvitel\n",
    "A kapcsolat lezárása, és a számára elkülönített erőforrások felszabadítása.\n",
    "A protokoll a hibamentes átvitelhez az úgynevezett pozitív nyugtázás újraküldéssel (positive acknowledgement with retransmission) néven ismert eljárást használja. A TCP kapcsolatok egyes lépéseit állapotoknak nevezzük. A kapcsolat élettartama alatt különböző állapotváltozásokon megy keresztül:[1] \n",
    "A leírásban szereplő három rövidítés TCP üzenettípusokat jelöl, melyeket a fejlécben szereplő megfelelő bitek segítségével lehet változtatni. \n",
    "#### Rövidítések:\n",
    " - *SYN*: szinkronizációs üzenet, kapcsolat létrehozására, ill. fenntartására irányuló kérés. Emellett a sorszámok szinkronizálása is ezen bit segítségével történik.\n",
    " - *FIN*: kapcsolat bontására irányuló kérés.\n",
    " - *ACK*: nyugtázó üzenet, SYN/FIN üzenetre küldött válasz, ezzel jelezvén az üzenet átvételét.\n",
    " \n",
    "#### Állapotok:\n",
    "- CLOSED: ez az alapértelmezett állapot, amelyből a kapcsolat kiépítésének folyamata indul. Elméleti állapot, a felek között nincs létező kapcsolat (még nem jött létre, vagy már lezárult).\n",
    "- LISTEN: az állomás (általában a szerver) szinkronizálási kérésre várakozik (SYN), saját SYN üzenetét még nem küldte el.\n",
    "- SYN-SENT: az állomás (általában a kliens) elküldte a SYN üzenetet, és várakozik a válaszra a másik féltől (szerver).\n",
    "- SYN-RECEIVED: kapcsolódási kérés (SYN) elküldve és fogadva is, várakozás a másik fél általi nyugtázás beérkezésére (ACK).\n",
    "- ESTABLISHED: a „stabil állapota” egy létrejött TCP kapcsolatnak. Miután mindkét állomás ebbe az állapotba kerül, megkezdődhet az adatok átvitele, ami addig folytatódik, amíg a kapcsolat lezárását egyik fél se kezdeményezi.\n",
    "- CLOSE-WAIT: az állomás kapcsolatbontási kérést (FIN) kapott a másik féltől. Várakozik a helyi alkalmazás nyugtázására, mielőtt elküldené a megfelelő válaszüzenetet.\n",
    "- LAST-ACK: az állomás már fogadott és nyugtázott egy kapcsolatbontási kérést, elküldte a saját FIN üzenetét, és várakozik a másik fél ezen kérésre érkező nyugtájára (ACK).\n",
    "- FIN-WAIT-1: várakozás az elküldött FIN üzenet nyugtázására, vagy a kapcsolatbontási kérés érkezésére másik féltől.\n",
    "- FIN-WAIT-2: megérkezett a nyugta az elküldött kapcsolatbontási üzenetre, várakozás a másik fél FIN üzenetére.\n",
    "- CLOSING: az állomás megkapta a másik fél FIN üzenetét, és nyugtázta azt, de a saját FIN üzenetére nyugtát még nem kapott.\n",
    "- TIME-WAIT: a kapcsolatbontási kérést és a nyugtát (FIN, ACK) az állomás megkapta és kiküldte, a kapcsolat lezárult. Egy rövid ideig várakozik még, hogy biztosítsa a másik fél megkapta a nyugtát, és ne legyen átfedés az újonnan létrejövő kapcsolatokkal.\" - [Wikipedia](https://hu.wikipedia.org/wiki/Transmission_Control_Protocol) UDP\n",
    "\n",
    "Szerencsére a python a protokoll nagyrészét elfedi előlünk.\n",
    "\n",
    "TODO\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### _Used sources_ / Felhasznált források\n",
    "- [Shannon Turner: Python lessons repository](https://github.com/shannonturner/python-lessons) MIT license (c) Shannon Turner 2013-2014\n",
    "- [Siki Zoltán: Python mogyoróhéjban](http://www.agt.bme.hu/gis/python/python_oktato.pdf) GNU FDL license (c) Siki Zoltán\n",
    "- [BME AUT](https://github.com/bmeaut) MIT License Copyright (c) BME AUT 2016-2018\n",
    "- [Wikipedia](https://hu.wikipedia.org/wiki/User_Datagram_Protocol) UDP\n",
    "- [Wikipedia](https://hu.wikipedia.org/wiki/Transmission_Control_Protocol) TCP"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}