{ "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 }