目錄
網絡協議
網絡的通信方式
需要安裝的組件和需要導入的包模塊
安裝的組件
導入包模塊
如何創建客戶端
如何創建服務端
網絡協議
IPV4:是互聯網協議的第四版,也是目前廣泛使用的網絡協議。它使用32位地址格式,理論上可以提供約43億個唯一的IP地址。
IPv4地址通常以點分十進制格式表示,例如192.168.1.1
。這種協議在互聯網的早期發展中起到了關鍵作用,但由于地址資源有限,隨著互聯網的快速發展,IPv4地址逐漸耗盡。所以為了解決這種情況,所以推出了IPV6
IPV6:是IPv4的下一代協議,旨在解決IPv4地址不足的問題。IPv6使用128位地址格式,能夠提供幾乎無限的地址空間。
IPv6地址通常以冒號分隔的十六進制格式表示,例2001:0db8:85a3:0000:0000:8a2e:0370:7334
。除了地址數量的巨大優勢,IPv6還提供了更好的安全性、更高效的路由機制以及對多播和任播的支持。
網絡的通信方式
異步通信
異步通信是一種數據傳輸方式,發送方和接收方的時鐘是獨立的,它們之間沒有嚴格的同步關系。在這種通信方式中,數據通常以字符為單位傳輸,每個字符之間有明確的起始位和停止位來標識數據的開始和結束。異步通信的優點是簡單靈活,適用于低速通信場景,例如串行端口通信。然而,由于沒有嚴格的時鐘同步,數據傳輸效率相對較低,且容易受到噪聲干擾。
同步通信
同步通信則要求發送方和接收方的時鐘嚴格同步。數據以數據塊(如幀)的形式傳輸,每個數據塊的開始和結束由同步信號標識。同步通信的優點是數據傳輸效率高,適合高速通信場景,例如以太網通信。然而,同步通信需要精確的時鐘同步機制,對硬件要求較高,且對噪聲更為敏感。
三次握手
三次握手是TCP協議建立連接的過程。它確保了雙方在通信之前已經準備好,并且能夠正確接收和發送數據。三次握手的過程如下:
-
SYN(同步序列號):客戶端向服務器發送一個SYN包,請求建立連接,并隨機生成一個初始序列號
X
。 -
SYN-ACK(同步序列號確認):服務器收到SYN包后,回復一個SYN-ACK包,確認客戶端的請求,并隨機生成自己的初始序列號
Y
,同時將客戶端的序列號X
加1后返回。 -
ACK(確認):客戶端收到SYN-ACK包后,發送一個ACK包,確認服務器的序列號
Y
,并將序列號Y
加1后返回。此時,連接建立完成。
四次握手
四次握手是TCP協議關閉連接的過程。它確保了雙方在關閉連接之前已經完成所有數據的傳輸。四次握手的過程如下:
-
FIN(結束):客戶端向服務器發送一個FIN包,表示客戶端已經完成數據發送。
-
ACK(確認):服務器收到FIN包后,回復一個ACK包,確認客戶端的結束請求。
-
FIN(結束):服務器在完成自己的數據發送后,也向客戶端發送一個FIN包,表示服務器也已經完成數據發送。
-
ACK(確認):客戶端收到服務器的FIN包后,回復一個ACK包,確認服務器的結束請求。此時,連接關閉。
需要安裝的組件和需要導入的包模塊
安裝的組件
在進行網絡編程時,通常需要安裝以下組件:
-
操作系統支持的網絡協議棧:例如TCP/IP協議棧,這是操作系統自帶的,用于支持網絡通信。
-
編程語言的運行環境:例如Python的Python解釋器、Java的JDK等。
-
網絡開發工具:例如Wireshark(用于抓包分析)、Postman(用于測試HTTP請求)等。
導入包模塊
在Python中,進行網絡編程通常需要導入以下模塊:
-
socket模塊:用于創建和管理網絡套接字。
-
select模塊:用于實現I/O多路復用。
-
threading模塊:用于實現多線程編程,提高程序的并發能力。
-
asyncio模塊:用于實現異步編程,提高程序的效率。
如何創建客戶端
import socket# 創建socket對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 連接到服務器
server_address = ('127.0.0.1', 8080)
client_socket.connect(server_address)try:# 向服務器發送數據message = 'Hello, Server!'client_socket.sendall(message.encode('utf-8'))# 接收服務器響應response = client_socket.recv(1024)print(f"Received: {response.decode('utf-8')}")finally:# 關閉連接client_socket.close()
如何創建服務端
import socket# 創建socket對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定地址和端口
server_address = ('127.0.0.1', 8080)
server_socket.bind(server_address)# 開始監聽
server_socket.listen(5)
print("Server is listening on port 8080...")try:while True:# 接受客戶端連接client_socket, client_address = server_socket.accept()print(f"Connection from {client_address}")try:# 接收客戶端數據data = client_socket.recv(1024)if data:print(f"Received: {data.decode('utf-8')}")# 向客戶端發送響應response = "Hello, Client!"client_socket.sendall(response.encode('utf-8'))finally:# 關閉客戶端連接client_socket.close()
finally:# 關閉服務器socketserver_socket.close()
注:單獨創建服務端是可以直接運行的,但單獨創建客戶端可以編譯,但是無法運行,因為沒有開啟對服務器的請求處于本地狀態,無法進行數據消息交互傳遞