2-2:套接字(Socket)编程之深入了解套接字
文章目錄
- (1)Socket背景知識
- (2)深入了解套接字
- (3)套接字的三種類型
- A:流式套接字(SOCK_STREAM)
- B:數據包套接字(SOCK_DGRAM)
- C:原始套接字
(1)Socket背景知識
在 80 年代早期,遠景研究規劃局(Advanced Research Projects Agency, ARPA)資助了佳利福尼亞大學伯克利分校的一個研究組,讓他們將 TCP/IP 軟件移植到 UNIX 操作系統中,并將結果提供給其他網點。作為項目的一部分,設計者們創建了一個接口,應用進程使用這個接口可以方便的進行通信。他們決定,只要有可能就使用以有的系統調用,對那些不能方便的容入已有的函數集的情況,就再增加新的系統調用以支持 TCP/IP 功能。這樣做的結果就出現了插口接口(Berkeley Socket),這個系統被稱為 Berkeley UNIX或 BSD UNIX。(TCP/IP 首次出現在 BSD 4.1 版本 release 4.1 of Berkeley SoftwareDistribution)。由許多計算機廠商,都采用了 Berkeley UNIX,于是許多機器上都可以使用 Socket 了。這樣,Socket 接口就被廣泛使用,到現在已經成為事實上的標準。
(2)深入了解套接字
套接字英文愿意為插座,孔的意思,但是這里卻把它翻譯為“套接字”,是在讓人不太理解。
在Linux系統編程中我們知道,如果想要把內容打印到屏幕上,或者寫入到硬盤中,就必然要借助系統調用接口,或者稱其為“陷入內核”
那么現在到了網絡了,我們要借助網絡實現不同主機的進程相互通信,根據TCP/IP分層模型,可以看到我們絕大部分能做的操作都在應用層,傳輸層開始以下均屬于操作系統。
當網卡收到數據后,不斷向上分用,最后通過應用層拿到自己的數據,其中傳輸層屬于操作系統,這也就意味著想要處理數據就必須要明白TCP/IP的協議操作和相關復雜的系統調用接口,這很顯然使很繁瑣的。
同時前文說過,IP地址+端口號可以標識全網唯一的一個進程,所在在標識好進程后,我們熟知的socket就是把TCP/IP層復雜的操作抽象為了幾個簡單的接口以供應用層調用,以此來實現進程通信。
因此socket是介于應用層和傳輸層之間的一個抽象層,或者稱他為一種通信機制。套接字以上的進程是受應用程序控制的,其以下的傳輸層協議則是受操作系統控制。因此,只要應用程序使用TCP/IP協議進行通信,它就必須要通過套接字與操作系統進行交互。所以對于開發者來說,他只需要關心這層抽象層,不需要關系傳輸層復雜的操作,當然它所能操作的權限或者范圍就沒有TCP/IP直接操作的范圍大了。如socket不可以選擇某些傳輸層的參數(比如最大緩存空間和最大報文長度等等)
所以服務器就像一個大插排,包含很多插座,客戶端就是像一個插頭,每一個進程代表一條電線,客戶端將電線的插頭插到服務器插排上對應的插座上,就可以開始通信了。
套接字是應用程序為了獲得網絡通信服務而與操作系統進行交互時使用的一種機制: 當應用程序需要使用網絡進行通信時,必須首先發出socket系統調用,請求操作系統為其創建一個套接字。此調用的實際效果是請求操作系統把網絡通信中所需的一些系統資源(比如CPU時間,網絡帶寬等),分配給該程序。操作系統用套接字描述符(實則是一個小的整數)來表示這些資源的總和,然后該套接字描述符會返回給該進程,此后應用程序所有的網絡操作(比如收發數據)都要使用這個套接字描述符(就像用open打開文件獲得的一個文件描述符,然后write,read都要使用到這個描述符)。在處理系統調用的時候,通過套接字描述符,操作系統就可以識別出應該使用哪些資源來完成應用程序所請求的服務。通信結束后,會調用close系統調用讓操作系統回收與該套接字相關的所有資源。
(3)套接字的三種類型
套接字有三種類型:流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM)及原始套接字。
A:流式套接字(SOCK_STREAM)
流式的套接字可以提供可靠的、面向連接的通訊流——TCP套接字編程
B:數據包套接字(SOCK_DGRAM)
數據報套接字定義了一種無連接的服務,數據通過相互獨立的報文進行傳輸,是無序的,并且不保證可靠,無差錯——UDP套接字編程
所謂的不可靠就是指
- 如果你發送了一個數據報,它可能不會到達。
- 它可能會以不同的順序到達。
- 如果它到達了,它包含的數據中可能存在錯誤。
C:原始套接字
原始套接字主要用于一些協議的開發,可以進行比較底層的操作。它功能強大,但是沒有上面介紹的兩種套接字使用方便,一般的程序也涉及不到原始套接字。
總結
以上是生活随笔為你收集整理的2-2:套接字(Socket)编程之深入了解套接字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 中科学计数法转成正常值
- 下一篇: Android开发 listitem中采