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