Socket網絡編程(一):基本概念

什麼是套接字?

概念

socket 的原意是“插座”,在計算機通信領域,socket 被翻譯爲“套接字”,它是計算機之間進行通信的一種約定或一種方式,也可以理解爲操作系統提供的對外通信的接口。通過 socket 這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。

在理解socket之前,可以先了解一下文件描述符的概念:
UNIX/Linux 程序在執行任何形式的 I/O 操作時,都是在讀取或者寫入一個文件描述符。一個文件描述符只是一個和打開的文件相關聯的整數,它的背後可能是一個硬盤上的普通文件、FIFO、管道、終端、鍵盤、顯示器,甚至是一個網絡連接。對於每個進程,操作系統內核在u_block結構中維護文件描述符表;Windows 也有類似“文件描述符”的概念,但通常被稱爲“文件句柄”。網絡連接也是一個文件描述符。

我們可以通過 socket() 函數來創建一個網絡連接,或者說打開一個網絡文件,socket() 的返回值就是文件描述符。有了文件描述符,我們就可以使用普通的文件操作函數來傳輸數據了,例如在linux系統下:

  • 用 read() 讀取從遠程計算機傳來的數據;
  • 用 write() 向遠程計算機寫入數據。

套接字類型

一般的網絡系統提供了三種不同類型的套接字,以供用戶在設計網絡應用程序時根據不同的要求來選擇。這三種套接爲流式套接字(SOCK-STREAM)、數據報套接字(SOCK-DGRAM)和原始套接字(SOCK-RAW)。

流式套接字(SOCK-STREAM) 在傳輸層使用TCP協議,提供雙向可靠無差錯 的傳輸,保證數據的傳輸順序,內部實現有流量控制擁塞控制超時重傳等機制;面向連接的套接字會比無連接的套接字多出很多數據包,因爲發送端每發送一個數據包,接收端就會返回一個數據包。此外,建立連接和斷開連接的過程也會傳遞很多數據包。
這種方式適用於對數據準確性和完整性要求較高的應用,比如文件傳輸、HTTP的HTML傳輸等。

數據報套接字(SOCK-DGRAM) 在傳輸層使用UDP協議,無連接不可靠的雙向傳輸,不保證數據的傳輸順序,傳輸速度快通信代價較小數據有邊界性
這種方式適用於對數據準確性和完整要求不高,但是對傳輸速度要求較高的應用,比如音視頻實時通話等。

關於有連接和無連接套接字的區別

流套接字是面向連接的套接字,數據報套接字是無連接的套接字,總的來說:
有連接套接字非常可靠,萬無一失,但是傳輸效率低,耗費資源多。無連接套接字傳輸效率高,但是不可靠,有丟失數據包、搗亂數據的風險;

OSI網絡模型與TCP/IP協議族

OSI 是 Open System Interconnection 的縮寫,譯爲“開放式系統互聯”。OSI 模型把網絡通信的工作分爲 7 層,從下到上分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。OSI 只是存在於概念和理論上的一種模型,它的缺點是分層太多,增加了網絡工作的複雜性,所以沒有大規模應用。後來人們對 OSI 進行了簡化,合併了一些層,最終只保留了 4 層,從下到上分別是接口層網絡層傳輸層應用層,這就是大名鼎鼎的 TCP/IP 模型
在這裏插入圖片描述
我們平常使用的程序(或者說軟件)一般都是通過應用層來訪問網絡的,程序產生的數據會一層一層地往下傳輸,直到最後的網絡接口層,就通過網線發送到互聯網上去了。數據每往下走一層,就會被這一層的協議增加一層包裝,等到發送到互聯網上時,已經比原始數據多了四層包裝。整個數據封裝的過程就像俄羅斯套娃。
當另一臺計算機接收到數據包時,會從網絡接口層再一層一層往上傳輸,每傳輸一層就拆開一層包裝,直到最後的應用層,就得到了最原始的數據,這纔是程序要使用的數據。
給數據加包裝的過程,實際上就是在數據的頭部增加一個標誌(一個數據塊),表示數據經過了這一層,我已經處理過了。給數據拆包裝的過程正好相反,就是去掉數據頭部的標誌,讓它逐漸現出原形。

我們所說的 socket 編程,是站在傳輸層的基礎上,所以可以使用 TCP/UDP 協議,但是不能幹「訪問網頁」這樣的事情,因爲訪問網頁所需要的 http 協議位於應用層。

TCP/IP 模型包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百個互爲關聯的協議,其中 TCP 和 IP 是最常用的兩種底層協議,所以把它們統稱爲“TCP/IP 協議族”。

MAC地址、IP地址、端口號

MAC地址

真正能唯一標識一臺計算機的是 MAC 地址,每個網卡的 MAC 地址在全世界都是獨一無二的。計算機出廠時,MAC 地址已經被寫死到網卡里面了(當然通過某些“奇巧淫技”也是可以修改的)。局域網中的路由器/交換機會記錄每臺計算機的 MAC 地址。

MAC 地址是 Media Access Control Address 的縮寫,直譯爲“媒體訪問控制地址”,也稱爲局域網地址(LAN Address),以太網地址(Ethernet Address)或物理地址(Physical Address)。

數據包中除了會附帶對方的 IP 地址,還會附帶對方的 MAC 地址,當數據包達到局域網以後,路由器/交換機會根據數據包中的 MAC 地址找到對應的計算機,然後把數據包轉交給它,這樣就完成了數據的傳遞。

IP地址

IP地址是 Internet Protocol Address 的縮寫,譯爲“網際協議地址”。目前大部分軟件使用 IPv4 地址,但 IPv6 也正在被人們接受,尤其是在教育網中,已經大量使用。
一臺計算機可以擁有一個獨立的 IP 地址,一個局域網也可以擁有一個獨立的 IP 地址(對外就好像只有一臺計算機)。對於目前廣泛使用 IPv4 地址,它的資源是非常有限的,一臺計算機一個 IP 地址是不現實的,往往是一個局域網才擁有一個 IP 地址。
在因特網上進行通信時,必須要知道對方的 IP 地址。實際上數據包中已經附帶了 IP 地址,把數據包發送給路由器以後,路由器會根據 IP 地址找到對方的地裏位置,完成一次數據的傳遞。路由器有非常高效和智能的算法,很快就會找到目標計算機。

端口號

有了 IP 地址和 MAC 地址,雖然可以找到目標計算機,但仍然不能進行通信。一臺計算機可以同時提供多種網絡服務,例如 Web 服務(網站)、FTP 服務(文件傳輸服務)、SMTP 服務(郵箱服務)等,僅有 IP 地址和 MAC 地址,計算機雖然可以正確接收到數據包,但是卻不知道要將數據包交給哪個網絡程序來處理,所以通信失敗。
爲了區分不同的網絡程序,計算機會爲每個網絡程序分配一個獨一無二的端口號(Port Number),例如,Web 服務的端口號是 80,FTP 服務的端口號是 21,SMTP 服務的端口號是 25。
端口(Port)是一個虛擬的、邏輯上的概念。可以將端口理解爲一道門,數據通過這道門流入流出,每道門有不同的編號,就是端口號。

其實對socket一種更爲直觀(簡單粗暴)的理解:socket即爲IP地址加端口號。

下一篇:Socket網絡編程(二):主要API調用方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章