1. 程式人生 > 其它 >Linux 系統程式設計 學習:6-基於socket的網路程式設計1:有關概念

Linux 系統程式設計 學習:6-基於socket的網路程式設計1:有關概念

知識

一開始學習網路程式設計的時候,看到 socket(套接字) 這個概念比較困擾。但後來通過搜尋 以及在 結合在似懂非懂的開發中,最終弄懂了套接字的含義:

套接字是一種抽象的介面,我們不需要關心網路通訊的具體細節,就可以將資料通過這種"埠"發生到我們希望送達的地方。

有關概念

埠號概念

在網路技術中,埠(Port)包括邏輯埠和物理埠兩種型別。

  • 物理埠指的是物理存在的埠,如ADSL Modem、集線器、交換機、路由器上用於連線其他網路裝置的介面,如RJ-45埠、SC埠等等。
  • 邏輯埠是指邏輯意義上用於區分服務的埠,如TCP/IP協議中的服務埠,埠號的範圍從0到65535,比如用於瀏覽網頁服務的80埠,用於FTP服務的21埠等。

埠號使用:
TCP與UDP段結構中埠地址都是16位元,可以有在0 ~ 65535範圍內的埠號。對於這65536個埠號有以下的使用規定:

  • 埠號小於256的定義為常用埠,伺服器一般都是通過常用埠號來識別的。任何TCP/IP實現所提供的服務都用1 ~ 1023之間的埠號,是由ICANN來管理的;
  • 客戶端只需保證該埠號在本機上是唯一的就可以了。客戶埠號因存在時間很短暫又稱臨時埠號;
  • 大多數TCP/IP實現給臨時埠號分配 1024 ~ 5000之間的埠號。大於5000的埠號是為其他伺服器預留的。

TCP UDP

TCP(即傳輸控制協議)是一種面向連線的傳輸層協議,它能提供高可靠性通訊(即資料無誤、資料無丟失、資料無失序、資料無重複到達的通訊)

適用情況:

  • 適合於對傳輸質量要求較高,以及傳輸大量資料的通訊。
  • 在需要可靠資料傳輸的場合,通常使用TCP協議
  • MSN/QQ等即時通訊軟體的使用者登入賬戶管理相關的功能通常採用TCP協議

UDP(User Datagram Protocol)使用者資料報協議
是不可靠的無連線的協議。在資料傳送前,因為不需要進行連線,所以可以進行高效率的資料傳輸。

適用情況:

  • 傳送小尺寸資料(如對DNS伺服器進行IP地址查詢時)
  • 在接收到資料,給出應答較困難的網路中使用UDP。(如:無線網路)
  • 適合於廣播/組播式通訊中。
  • MSN/QQ/Skype等即時通訊軟體的點對點文字通訊以及音視訊通訊通常採用UDP協議
  • 流媒體、VOD、VoIP、IPTV等網路多媒體服務中通常採用UDP方式進行實時資料傳輸

IP 地址 與 子網掩碼

IP地址:Internet中主機的標識,Internet中的主機要與別的機器通訊必須具有一個IP地址
IP地址為32位(IPv4)或者128位(IPv6);每個資料包都必須攜帶目的IP地址和源IP地址,路由器依靠此資訊為資料包選擇路由。

表示形式:常用點分十進位制形式,如202.38.64.10,最後都會轉換為一個32位的無符號整數。

IP地址分類:根據網路規模可以分為,A類,B類,C類,D類和E類。其中A、B、C是基本類,D、E類作為多播和保留使用。

子網掩碼::(subnet mask)又叫網路掩碼、地址掩碼、子網路遮罩,它是一種用來指明一個IP地址的哪些位標識的是主機所在的子網,以及哪些位標識的是主機的位掩碼。

位元組序

不同型別CPU的主機中,記憶體儲存多位元組整數序列有兩種方法,稱為主機位元組序(HBO, Host Byte Order):

  • 小端序(little-endian):將低位元組儲存在起始地址,稱為“Little-Endian”位元組序,Intel、AMD等採用的是這種方式;
  • 大端序(big-endian):將高位元組儲存在起始地址,稱為“Big-Endian”位元組序,由ARM、Motorola等所採用。

為了避免不同類別主機之間在資料交換時由於對於位元組序的不同而導致的差錯,引入了網路位元組序。網路中傳輸的資料必須按網路位元組序,即大端位元組序

在大部分PC機上,當應用程序將整數送入socket前,需要轉化成網路位元組序;當應用程序從socket取出整數後,要轉化成主機位元組序(系統所採用的位元組序)

在後面我們會用到一些轉換函式。

c
// 主機位元組序到網路位元組序
u_long htonl(u_long hostlong);
u_short htons(u_short short);

// 網路位元組序到主機位元組序
u_long ntohl(u_long hostlong);
u_short ntohs(u_short short);

補充知識 :Socket 處在網路層次中的哪個位置?

雖然我對於套接字有自己的體會,但是我們可以結合OSI網路模型來加深我們的理解。

套接字(socket)程式設計介面是從頂上三層(網路協議的應用層)進入傳輸層的介面。除了提到的原始套接字,套接字程式設計可以徹底繞過IP層直接讀寫資料鏈路層的幀。

為什麼套接字提供的是從OSI模型的頂上三層進入傳輸層的介面,有兩個原因:

  • 頂上三層處理具體網路應用(如FTP、HTTP)的所有細節,而對通訊細節瞭解很少;低下四層對具體網路應用瞭解不多,卻處理所有的通訊細節(傳送資料、等待確認、校驗等)。
  • 頂上三層通常構成所謂的使用者程序,底下四層卻通常作為作業系統核心的一個部分提供。現代作業系統都提供分隔使用者程序與核心的機制。

所以,在第4層和第5層之間的介面是構建API的自然位置。

補充:Windows下的socket開發與Linux有何區別?

Windows下的socket程式開發和Linux思路相同,細節處區別如下:
1)Windows下的socket程式依賴Winsock.dll或ws2_32.dll,必須提前載入。
2)Linux使用“檔案描述符”的概念,而Windows使用“檔案控制代碼”的概念;Linux不區分socket檔案和普通檔案,而Windows區分;Linux下socket()函式的返回值為int型別,而Windows下為SOCKET型別,也就是控制代碼。
3)Linux下使用read()/write()函式讀寫,而Windows下使用recv()/send()函式傳送和接收
4)關閉socket時,Linux使用close()函式,而Windows使用closesocket()函式。

知識

一開始學習網路程式設計的時候,看到 socket(套接字) 這個概念比較困擾。但後來通過搜尋 以及在 結合在似懂非懂的開發中,最終弄懂了套接字的含義:

套接字是一種抽象的介面,我們不需要關心網路通訊的具體細節,就可以將資料通過這種"埠"發生到我們希望送達的地方。

有關概念

埠號概念

在網路技術中,埠(Port)包括邏輯埠和物理埠兩種型別。

  • 物理埠指的是物理存在的埠,如ADSL Modem、集線器、交換機、路由器上用於連線其他網路裝置的介面,如RJ-45埠、SC埠等等。
  • 邏輯埠是指邏輯意義上用於區分服務的埠,如TCP/IP協議中的服務埠,埠號的範圍從0到65535,比如用於瀏覽網頁服務的80埠,用於FTP服務的21埠等。

埠號使用:
TCP與UDP段結構中埠地址都是16位元,可以有在0 ~ 65535範圍內的埠號。對於這65536個埠號有以下的使用規定:

  • 埠號小於256的定義為常用埠,伺服器一般都是通過常用埠號來識別的。任何TCP/IP實現所提供的服務都用1 ~ 1023之間的埠號,是由ICANN來管理的;
  • 客戶端只需保證該埠號在本機上是唯一的就可以了。客戶埠號因存在時間很短暫又稱臨時埠號;
  • 大多數TCP/IP實現給臨時埠號分配 1024 ~ 5000之間的埠號。大於5000的埠號是為其他伺服器預留的。

TCP UDP

TCP(即傳輸控制協議)是一種面向連線的傳輸層協議,它能提供高可靠性通訊(即資料無誤、資料無丟失、資料無失序、資料無重複到達的通訊)

適用情況:

  • 適合於對傳輸質量要求較高,以及傳輸大量資料的通訊。
  • 在需要可靠資料傳輸的場合,通常使用TCP協議
  • MSN/QQ等即時通訊軟體的使用者登入賬戶管理相關的功能通常採用TCP協議

UDP(User Datagram Protocol)使用者資料報協議
是不可靠的無連線的協議。在資料傳送前,因為不需要進行連線,所以可以進行高效率的資料傳輸。

適用情況:

  • 傳送小尺寸資料(如對DNS伺服器進行IP地址查詢時)
  • 在接收到資料,給出應答較困難的網路中使用UDP。(如:無線網路)
  • 適合於廣播/組播式通訊中。
  • MSN/QQ/Skype等即時通訊軟體的點對點文字通訊以及音視訊通訊通常採用UDP協議
  • 流媒體、VOD、VoIP、IPTV等網路多媒體服務中通常採用UDP方式進行實時資料傳輸

IP 地址 與 子網掩碼

IP地址:Internet中主機的標識,Internet中的主機要與別的機器通訊必須具有一個IP地址
IP地址為32位(IPv4)或者128位(IPv6);每個資料包都必須攜帶目的IP地址和源IP地址,路由器依靠此資訊為資料包選擇路由。

表示形式:常用點分十進位制形式,如202.38.64.10,最後都會轉換為一個32位的無符號整數。

IP地址分類:根據網路規模可以分為,A類,B類,C類,D類和E類。其中A、B、C是基本類,D、E類作為多播和保留使用。

子網掩碼::(subnet mask)又叫網路掩碼、地址掩碼、子網路遮罩,它是一種用來指明一個IP地址的哪些位標識的是主機所在的子網,以及哪些位標識的是主機的位掩碼。

位元組序

不同型別CPU的主機中,記憶體儲存多位元組整數序列有兩種方法,稱為主機位元組序(HBO, Host Byte Order):

  • 小端序(little-endian):將低位元組儲存在起始地址,稱為“Little-Endian”位元組序,Intel、AMD等採用的是這種方式;
  • 大端序(big-endian):將高位元組儲存在起始地址,稱為“Big-Endian”位元組序,由ARM、Motorola等所採用。

為了避免不同類別主機之間在資料交換時由於對於位元組序的不同而導致的差錯,引入了網路位元組序。網路中傳輸的資料必須按網路位元組序,即大端位元組序

在大部分PC機上,當應用程序將整數送入socket前,需要轉化成網路位元組序;當應用程序從socket取出整數後,要轉化成主機位元組序(系統所採用的位元組序)

在後面我們會用到一些轉換函式。

c
// 主機位元組序到網路位元組序
u_long htonl(u_long hostlong);
u_short htons(u_short short);

// 網路位元組序到主機位元組序
u_long ntohl(u_long hostlong);
u_short ntohs(u_short short);

補充知識 :Socket 處在網路層次中的哪個位置?

雖然我對於套接字有自己的體會,但是我們可以結合OSI網路模型來加深我們的理解。

套接字(socket)程式設計介面是從頂上三層(網路協議的應用層)進入傳輸層的介面。除了提到的原始套接字,套接字程式設計可以徹底繞過IP層直接讀寫資料鏈路層的幀。

為什麼套接字提供的是從OSI模型的頂上三層進入傳輸層的介面,有兩個原因:

  • 頂上三層處理具體網路應用(如FTP、HTTP)的所有細節,而對通訊細節瞭解很少;低下四層對具體網路應用瞭解不多,卻處理所有的通訊細節(傳送資料、等待確認、校驗等)。
  • 頂上三層通常構成所謂的使用者程序,底下四層卻通常作為作業系統核心的一個部分提供。現代作業系統都提供分隔使用者程序與核心的機制。

所以,在第4層和第5層之間的介面是構建API的自然位置。

補充:Windows下的socket開發與Linux有何區別?

Windows下的socket程式開發和Linux思路相同,細節處區別如下:
1)Windows下的socket程式依賴Winsock.dll或ws2_32.dll,必須提前載入。
2)Linux使用“檔案描述符”的概念,而Windows使用“檔案控制代碼”的概念;Linux不區分socket檔案和普通檔案,而Windows區分;Linux下socket()函式的返回值為int型別,而Windows下為SOCKET型別,也就是控制代碼。
3)Linux下使用read()/write()函式讀寫,而Windows下使用recv()/send()函式傳送和接收
4)關閉socket時,Linux使用close()函式,而Windows使用closesocket()函式。