Lekcja 14 - http, API, TCP/IP (notatki)

Lekcja 14 - http, API, TCP/IP (notatki)

Adresy internetowe

Komputery łącząc się z serwerami internetowymi korzystają z adresów liczbowych (np. 127.0.0.1). Jak to się dzieje, że możemy korzystać z adresów wpisując "normalne" nazwy np. wikipedia.pl? Komputery mają wbudowanego "tłumacza" - DNS (ang. Domene name server), które przekłada adres nazwowy na liczbowy.

Inną ważną kwestią jest NAT-owanie. Jako, że adresy liczbowe składają się tylko z czterech liczb, w przedziale 0-250, oddzielone kropką, to w krótkim czasie wykorzystano wszystkie możliwe kombinacje. Dlatego konieczne okazało się skorzystanie z NAT, który umożliwia używanie adresów prywatnych w sieciach lokalnych.

Uwaga! Jeśli adres liczbowy zaczyna się od 127 to zwróci Was do komputera, z którego zadane jest pytanie. Po publicznym adresie IP można ustalić gdzie znajduje się sprzęt z niego korzystający, ponieważ mieści się w przedziale należącym do danego kraju.

Nasze lokalne adresy IP się zmieniają, router nadaje różne adresy w ustalonym zakresie np. 192.168.1.1-192.168.1.255.

Serwer VPN

Przy zastosowaniu serwera VPN można zmienić "ścieżkę" dostępu do internetu:

komputer lokalny -> router -> serwer VPN -> Internet

Jest to bezpieczniejsze, ponieważ jest ona dodatkowo szyfrowana, chociaż wszystko zależy od firmy, która nam dostarcza ten serwis.

CIEKAWOSTKA! W ten sposób można "oszukać" serwisy internetowe, imitując adres IP z innego kraju.

TCP/IP

Protokół IP jest częścią zestawu protokołów TCP/IP, podobnie jak HTTP, TCP, czy UDP.

HTTP używamy do przeglądania serwisów internetowych. Wbudowane są w niego metody GET, POST i DELETE etc.

Ćwiczenie

Tworzymy własny serwis www. Zaczynamy od zaimportowania biblioteki socket oraz ustalenia dwóch stałych:

import socket

SERWER_IP = "127.0.0.1"
SERWER_PORT = 8080

Można wpisać zamiast 127 local host, ale lepiej działa adres liczbowy.

serwer_gniazdko = socket.socket()
serwer_gniazdko.bind((SERWER_IP, SERWER_PORT))

Metoda bind() wpina do gniazdka

serwer_gniazdko.listen()

print(f"Nasluchujemy na porcie {SERWER_PORT}")

Serwer nasłuchuje czyli czeka na zapytania ze strony użytkownika.

Następnie tworzymy pętle while, by działało w nieskończoność. Następnie korzystamy z tuple unpacking - możliwości przypisania do kolejnych elementów krotki różnych zmiennych. W połączeniu z metodą accept(), która służy do przyjęcia danego połączenia i zwraca nam krotkę zawierającą nasze połączenie i adres zwrotny, na który możemy odpowiedzieć.

while True:
    polaczenie , adres_zwrotny = serwer_gniazdko.accept()
    zapytanie = polaczenie.recv(1024).decode()

    print(zapytanie)

Deklarujemy ile danych przyjmiemy

    odpowiedz = """HTTP/1.1 200 OK

<html>
<head>
<title>To nasza strona</title>
<meta charset="utf8">
</head>

<body>
<center><h1>To odpowiedz z prostego serwera www.</h1></center>
</body>
</html>
"""

Tworzymy podstawowy html.

polaczenie.sendall(odpowiedz.encode(encoding="utf-8"))
  polaczenie.close()  

Po uruchomieniu, wstawiamy w przeglądarkę internetową: 127.0.0.1:8080 i możemy oglądnąć naszą stronę 😄

import socket

SERWER_IP = "127.0.0.1"
SERWER_PORT = 8080

serwer_gniazdko = socket.socket()
serwer_gniazdko.bind((SERWER_IP, SERWER_PORT))

serwer_gniazdko.listen()

print(f"Nasluchujemy na porcie {SERWER_PORT}")

while True:
    polaczenie , adres_zwrotny = serwer_gniazdko.accept()

    zapytanie = polaczenie.recv(1024).decode()

    print(zapytanie)

    odpowiedz = """HTTP/1.1 200 OK

<html>
<head>
<title>To nasza strona</title>
<meta charset="utf8">
</head>

<body>
<center><h1>To odpowiedz z prostego serwera www.</h1></center>
</body>
</html>
"""
    polaczenie.sendall(odpowiedz.encode(encoding="utf-8"))
    polaczenie.close()

Pełny kod

Proxy

Proxy jest pośrednikiem pomiędzy naszym komputerem a serwisem internetowym. W przypadku bardziej popularnych witryn stosuje się reverse proxy, która rozładowuje tę kolejkę przekierowując zapytania do konkretnych serwerów.

Serwery www

APACHE - serwer, który pierwszy spopularyzował serwery internetowe, obecnie najpopularniejszy jest nginx, ale jest ich dużo więcej np. Caddy. Ostatni jest bardzo prosty w obsłudze, automatycznie pobiera certyfikat TLS, co oznacza, że od razu będzie to strona szyfrowana.

Docker