socket程式設計 01 socket簡介

2021-09-13 13:25:00 字數 1704 閱讀 3939

在計算機通訊領域,socket 被翻譯為「套接字」,它是計算機之間進行通訊的一種約定或一種方式。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。

學習 socket,也就是學習計算機之間如何通訊,並編寫出實用的程式。

計算機分布在世界各地,要想和它們通訊,必須要知道確切的位置。確定計算機位置的方式有多種,ip 位址是最常用的,例如,114.114.114.114 是國內第乙個、全球第三個開放的 dns 服務位址,127.0.0.1 是本機位址。

其實,我們的計算機並不知道 ip 位址對應的地理位置,當要通訊時,只是將 ip 位址封裝到要傳送的資料報中,交給路由器去處理。路由器有非常智慧型和高效的演算法,很快就會找到目標計算機,並將資料報傳遞給它,完成一次單向通訊。

目前大部分軟體使用 ipv4 位址,但 ipv6 也正在被人們接受,尤其是在教育網中,已經大量使用。

有了 ip 位址,雖然可以找到目標計算機,但仍然不能進行通訊。一台計算機可以同時提供多種網路服務,例如web服務、ftp服務(檔案傳輸服務)、smtp服務(郵箱服務)等,僅有 ip 位址,計算機雖然可以正確接收到資料報,但是卻不知道要將資料報交給哪個網路程式來處理,所以通訊失敗。

為了區分不同的網路程式,計算機會為每個網路程式分配乙個獨一無二的埠號(port number),例如,web服務的埠號是 80,ftp 服務的埠號是 21,smtp 服務的埠號是 25。

埠(port)是乙個虛擬的、邏輯上的概念。可以將埠理解為一道門,資料通過這道門流入流出,每道門有不同的編號,就是埠號。如下圖所示:

協議(protocol)就是網路通訊的約定,通訊的雙方必須都遵守才能正常收發資料。協議有很多種,例如 tcp、udp、ip 等,通訊的雙方必須使用同一協議才能通訊。協議是一種規範,由計算機組織制定,規定了很多細節,例如,如何建立連線,如何相互識別等。

協議僅僅是一種規範,必須由計算機軟體來實現。例如 ip 協議規定了如何找到目標計算機,那麼各個開發商在開發自己的軟體時就必須遵守該協議,不能另起爐灶。

所謂協議族(protocol family),就是一組協議(多個協議)的統稱。最常用的是 tcp/ip 協議族,它包含了 tcp、ip、udp、telnet、ftp、smtp 等上百個互為關聯的協議,由於 tcp、ip 是兩種常用的底層協議,所以把它們統稱為 tcp/ip 協議族。

計算機之間有很多資料傳輸方式,各有優缺點,常用的有兩種:sock_stream 和 sock_dgram。

sock_stream 表示面向連線的資料傳輸方式。資料可以準確無誤地到達另一台計算機,如果損壞或丟失,可以重新傳送,但效率相對較慢。常見的 http 協議就使用 sock_stream 傳輸資料,因為要確保資料的正確性,否則網頁不能正常解析。

sock_dgram 表示無連線的資料傳輸方式。計算機只管傳輸資料,不作資料校驗,如果資料在傳輸中損壞,或者沒有到達另一台計算機,是沒有辦法補救的。也就是說,資料錯了就錯了,無法重傳。因為 sock_dgram 所做的校驗工作少,所以效率比 sock_stream 高。

注意:sock_dgram 沒有想象中的糟糕,不會頻繁的丟失資料,資料錯誤只是小概率事件。

有可能多種協議使用同一種資料傳輸方式,所以在 socket 程式設計中,需要同時指明資料傳輸方式和協議。

Socket 網路程式設計01

什麼是埠 同乙個ip接收到的資料要分發給該ip下的不同裝置,這就要通過埠號來作為裝置標識 由於埠號資源是有限的,因此採用的是動態分配的方式,那如何判斷裝置是否還在進行通訊呢?這就是心跳包,如果裝置心跳停止,則 該埠資源,當該裝置重新啟用的時候,再在埠池 ip池 乙個運營商有很多ip 動態隨機分配乙個...

01 socket程式設計 OSI介紹

1.物理層 物理層的任務就是為它的上一層提供物理連線,以及規定通訊節點之間的機械和電器特徵,如規定電纜和接頭的型別,床送訊號的電壓。在這一層,資料作為原始的位元 bit 流傳輸。本層的典型裝置是集線器。2.資料鏈路層 資料鏈路層負責在兩個相鄰節點間的路線上,無差錯的傳送以幀為單位的資料。資料鏈路層要...

python 網路程式設計學習 套接字socket

以前也學過套接字程式設計,這次想系統全面的學習下python網路程式設計的使用。做這個,為檢測進度,也為後續留下筆記和足跡。socket 常用函式 socket.gethostname socket.gethostbyname import socket host socket.gethostnam...