C/C++ socket編程教程:1天玩轉socket通信技術

2019-08-04     CPPLinux開發架構師

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

socket 的典型應用就是 Web 伺服器和瀏覽器:瀏覽器獲取用戶輸入的URL,向伺服器發起請求,伺服器分析接收到的URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視頻等元素呈現給用戶。

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

IP位址(IP Address)

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

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

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

埠(Port)

有了 IP 地址,雖然可以找到目標計算機,但仍然不能進行通信。一台計算機可以同時提供多種網絡服務,例如Web服務、FTP服務(文件傳輸服務)、SMTP服務(郵箱服務)等,僅有 IP 地址,計算機雖然可以正確接收到數據包,但是卻不知道要將數據包交給哪個網絡程序來處理,所以通信失敗。

為了區分不同的網絡程序,計算機會為每個網絡程序分配一個獨一無二的埠號(Port Number),例如,Web服務的埠號是 80,FTP 服務的埠號是 21,SMTP 服務的埠號是 25。

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



協議(Protocol)

協議(Protocol)就是網絡通信的約定,通信的雙方必須都遵守才能正常收發數據。協議有很多種,例如 TCP、UDP、IP 等,通信的雙方必須使用同一協議才能通信。協議是一種規範,由計算機組織制定,規定了很多細節,例如,如何建立連接,如何相互識別等。

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

所謂協議族(Protocol Family),就是一組協議(多個協議)的統稱。最常用的是 TCP/IP 協議族,它包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百個互為關聯的協議,由於 TCP、IP 是兩種常用的底層協議,所以把它們統稱為 TCP/IP 協議族。

數據傳輸方式

計算機之間有很多數據傳輸方式,各有優缺點,常用的有兩種:SOCK_STREAM 和 SOCK_DGRAM。

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

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

QQ 視頻聊天和語音聊天就使用 SOCK_DGRAM 傳輸數據,因為首先要保證通信的效率,儘量減小延遲,而數據的正確性是次要的,即使丟失很小的一部分數據,視頻和音頻也可以正常解析,最多出現噪點或雜音,不會對通信質量有實質的影響。

注意:SOCK_DGRAM 沒有想像中的糟糕,不會頻繁的丟失數據,數據錯誤只是小機率事件。

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

綜上所述:IP位址和埠能夠在廣袤的網際網路中定位到要通信的程序,協議和數據傳輸方式規定了如何傳輸數據,有了這些,兩台計算機就可以通信了。

當真正開始學習的時候難免不知道從哪入手,學習時頻繁踩坑,導致效率低下影響繼續學習的信心,最終浪費大量時間。為了讓學習變得輕鬆、高效!今天給大家免費分享一套教學資源,幫助大家在成為架構師的道路上披荊斬棘。獲取資料轉發+關注+私信我「資料」獲取

合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間「來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!都看到這裡了,確定不領一份資料嗎

文章來源: https://twgreatdaily.com/zh-sg/RAvUXmwBUcHTFCnfcIjl.html