Python之socket編程(53)
小朋友們好,大朋友們好!
我是貓妹,一名愛上Python編程的小學生。
和貓妹學Python,一起趣味學編程。
今日主題
今天的內容比較多哦,主要是網(wǎng)絡編程的一些入門知識。
這些知識在互聯(lián)網(wǎng)發(fā)展過程中很重要,貓妹拋磚引玉。
OSI七層模型和TCP/IP四層模型
IP地址和端口
TCP/UDP
socket
Python實現(xiàn)TCP服務器客戶端
Python實現(xiàn)UDP服務器客戶端
OSI七層模型和TCP/IP四層模型
OSI七層模型和TCP/IP四層模型是互聯(lián)網(wǎng)通信的基石,我們之所以可以愉快地上網(wǎng),底層就是它的功勞。
它們在底層默默工作,我們仿佛感覺不到它的存在。其實底層的設計和實現(xiàn)匯集了眾多人類的智慧。

OSI七層模型和TCP/IP四層模型都是網(wǎng)絡通信中常用的分層架構。
OSI七層模型更加詳細,涵蓋了更多的功能和細節(jié);而TCP/IP四層模型則更加簡潔明了,便于理解和應用。

下面分別對它們進行簡要介紹:
OSI七層模型:
OSI(Open Systems Interconnection)是一種定義了網(wǎng)絡通信協(xié)議棧的國際標準。它將網(wǎng)絡通信分為七個層次,每一層都有特定的功能和任務。從底層到頂層分別是:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡層、傳輸層、會話層、表示層和應用層。
? * 物理層:負責在物理媒介上傳輸比特流,主要涉及硬件接口和信號傳輸。
? * 數(shù)據(jù)鏈路層:負責在相鄰節(jié)點之間建立可靠的數(shù)據(jù)傳輸通路,實現(xiàn)數(shù)據(jù)的分組和錯誤檢測。
? * 網(wǎng)絡層:負責將數(shù)據(jù)包從源節(jié)點發(fā)送到目的節(jié)點,實現(xiàn)端到端的連接。
? * 傳輸層:負責控制和管理數(shù)據(jù)傳輸過程中的流量控制、錯誤恢復和數(shù)據(jù)重組等。
? * 會話層:負責建立、管理和終止應用程序之間的會話。
? * 表示層:負責數(shù)據(jù)的格式轉換、加密和解密等。
? * 應用層:負責為用戶提供各種網(wǎng)絡應用服務,如電子郵件、文件傳輸、遠程登錄等。

TCP/IP四層模型:
TCP/IP(Transmission Control Protocol/Internet Protocol)是一種廣泛應用于互聯(lián)網(wǎng)的分層架構。它將網(wǎng)絡通信分為四個層次,每一層都有特定的功能和任務。從底層到頂層分別是:網(wǎng)絡接口層、網(wǎng)際層、傳輸層和應用層。
? * 網(wǎng)絡接口層:負責處理數(shù)據(jù)包的物理介質(如以太網(wǎng)、Wi-Fi等)以及地址和路由選擇等問題。
? * 網(wǎng)際層:負責在不同網(wǎng)絡之間建立邏輯連接,實現(xiàn)端到端的數(shù)據(jù)傳輸。
? * 傳輸層:負責控制和管理數(shù)據(jù)傳輸過程中的流量控制、錯誤恢復和數(shù)據(jù)重組等。
? * 應用層:負責為用戶提供各種網(wǎng)絡應用服務,如電子郵件、文件傳輸、遠程登錄等。

IP地址和端口
我們要上網(wǎng),離不開兩個東西,一個是IP地址,一個是端口。
IP地址和端口是網(wǎng)絡通信中兩個重要的概念,它們共同用于在互聯(lián)網(wǎng)上唯一標識一個設備或應用服務。
IP地址用于在數(shù)據(jù)包頭中指明源設備的地址,而端口號則用于在網(wǎng)絡上唯一標識一個應用服務。

IP地址唯一標識一臺連接在互聯(lián)網(wǎng)上的電腦。
IP(Internet Protocol)地址是一個32位的二進制數(shù),用于在互聯(lián)網(wǎng)上唯一標識一個設備。
IP地址分為IPv4和IPv6兩種格式。
IPv4地址通常以點分十進制表示法(如192.0.2.1),而IPv6地址則采用冒號分隔的128位十六進制數(shù)(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。
IP地址用于在數(shù)據(jù)包頭中指明源設備的地址,以便接收方能夠將數(shù)據(jù)包正確地發(fā)送到目標設備。

有了IP地址還不夠,一臺電腦有許多應用程序,端口用于區(qū)分應用程序。
端口(Port)是網(wǎng)絡通信中設備之間進行通信的邏輯接口。
取值0~65535,0~1023系統(tǒng)占用,其他端口應用程序隨機分配。
每個應用程序都使用一個唯一的端口號來標識自己的通信服務。
常見的端口號有80(HTTP)、21(FTP)、25(SMTP)、3306(MySQL)等。
TCP和UDP
TCP和UDP位于TCP/IP四層模型中的傳輸層。

TCP(Transmission Control Protocol)特點:
可靠性高:TCP是一種面向連接的協(xié)議,它通過建立可靠的連接來保證數(shù)據(jù)傳輸?shù)目煽啃浴.敂?shù)據(jù)包在傳輸過程中丟失或損壞時,TCP會進行重傳,直到數(shù)據(jù)被完全接收。
流控制:TCP使用滑動窗口機制來控制數(shù)據(jù)的發(fā)送速率,避免網(wǎng)絡擁塞。發(fā)送方會根據(jù)接收方的緩沖情況動態(tài)調整發(fā)送速率。
有序性:TCP保證數(shù)據(jù)包的順序性和完整性,確保接收方能夠按照正確的順序接收到數(shù)據(jù)。
適用場景:TCP適用于需要可靠數(shù)據(jù)傳輸?shù)膽脠鼍埃缥募鬏?、電子郵件等。

UDP特點:
不可靠性高:UDP是一種無連接的協(xié)議,它不保證數(shù)據(jù)傳輸?shù)目煽啃?。當?shù)據(jù)包在傳輸過程中丟失或損壞時,UDP不會進行重傳,而是直接丟棄。
快速性:UDP沒有復雜的控制流程,因此具有較快的傳輸速度和較低的延遲。
無序性:UDP不保證數(shù)據(jù)包的順序性和完整性,接收方可能收到亂序的數(shù)據(jù)包。
適用場景:UDP適用于對實時性要求較高、不需要可靠數(shù)據(jù)傳輸?shù)膽脠鼍?,如視頻流媒體、在線游戲等。

TCP就像打電話,對方必須在線才能通過。
UDP就像寫信,寫好直接發(fā)送就是了。
沒有優(yōu)劣,各有千秋。
socket
TCP/UDP是很復雜的,為了使應用開發(fā)更簡單。
在應用層和TCP/UDP之間有一層,叫socket。

Socket(套接字)是計算機網(wǎng)絡編程中的一種通信機制,用于實現(xiàn)不同計算機之間的數(shù)據(jù)傳輸。
簡單來說,Socket就是一種用于建立網(wǎng)絡連接的抽象接口,它允許程序員通過網(wǎng)絡協(xié)議進行數(shù)據(jù)傳輸。
在網(wǎng)絡編程中,Socket通常由兩部分組成:客戶端和服務器端。
客戶端發(fā)送數(shù)據(jù)到服務器端,而服務器端接收并處理這些數(shù)據(jù)。

Socket通信可以基于TCP(傳輸控制協(xié)議)或UDP(用戶數(shù)據(jù)報協(xié)議)兩種不同的協(xié)議。
使用Socket進行網(wǎng)絡編程需要以下步驟:
? 1. 創(chuàng)建Socket對象:首先需要創(chuàng)建一個Socket對象,指定要使用的協(xié)議類型。
? 2. 綁定Socket:將Socket與特定的IP地址和端口號綁定在一起,以便客戶端能夠找到服務器端。
? 3. 連接Socket:當客戶端想要與服務器端通信時,需要建立連接。這可以通過調用Socket對象的connect()方法來實現(xiàn)。
? 4. 發(fā)送和接收數(shù)據(jù):一旦連接建立成功,就可以使用Socket對象的send()和recv()方法來發(fā)送和接收數(shù)據(jù)。
? 5. 關閉Socket:當通信完成后,需要關閉Socket對象以釋放資源。
總之,Socket是網(wǎng)絡編程中非常重要的一個概念,它提供了一種通用的、跨平臺的通信機制,使得程序員可以輕松地實現(xiàn)不同計算機之間的數(shù)據(jù)傳輸。
Python實現(xiàn)TCP服務器客戶端
TCP客戶端服務器交互流程圖:

socket關鍵函數(shù)介紹:
函數(shù)描述socket()獲取socket類對象bind((hostname, port))在指定主機的端口綁定監(jiān)聽listen()在綁定端口上開啟監(jiān)聽,參數(shù)表示最大等待建立連接的個數(shù)accept()等待客戶端連接,連接后返回客戶端地址send(data)發(fā)送數(shù)據(jù),data 是二進制數(shù)據(jù)recv(buffer)表示接收數(shù)據(jù), buffersize 是每次接收數(shù)據(jù)的長度close()關閉套接字連接connect((hostname, port))設置要連接的主機名稱與端口號
TCP協(xié)議客戶端服務器代碼測試:

注:服務端可以持續(xù)監(jiān)聽連接,客戶端下線,服務端自動斷開連接。客戶端再次上線,服務端建立連接。
Python實現(xiàn)UDP服務器客戶端
UDP客戶端服務器交互流程圖:

客戶端流程:
導入包socket
創(chuàng)建一個套接字
收發(fā)消息(優(yōu)先發(fā)送)
關閉套接字
服務器流程:
導入包socket
創(chuàng)建一個套接字
綁定信息
收發(fā)消息(優(yōu)先接收)
關閉套接字
UDP協(xié)議客戶端服務器代碼測試:

需要代碼的小伙伴,可從和貓妹學Python,下圖第一名平臺的次條推文獲取哦!
平臺太多了,代碼排版太耗時了。


好了,我們今天就學到這里吧!
如果遇到什么問題,咱們多多交流,共同解決。
我是貓妹,咱們下次見!