socket編程到底是什麼?

對socket完全沒概念,求大神系統解釋一下socket。該怎麼學,或者看些什麼書。


Socket簡介

Socket是進程通訊的一種方式,即調用這個網路庫的一些API函數實現分布在不同主機的相關進程之間的數據交換。

幾個定義:

(1)IP地址:即依照TCP/IP協議分配給本地主機的網路地址,兩個進程要通訊,任一進程首先要知道通訊對方的位置,即對方的IP。

(2)埠號:用來辨別本地通訊進程,一個本地的進程在通訊時均會佔用一個埠號,不同的進程埠號不同,因此在通訊前必須要分配一個沒有被訪問的埠號。

(3)連接:指兩個進程間的通訊鏈路。

(4)半相關:網路中用一個三元組可以在全局唯一標誌一個進程:

(協議,本地地址,本地埠號)

這樣一個三元組,叫做一個半相關,它指定連接的每半部分。

(4)全相關:一個完整的網間進程通信需要由兩個進程組成,並且只能使用同一種高層協議。也就是說,不可能通信的一端用TCP協議,而另一端用UDP協議。因此一個完整的網間通信需要一個五元組來標識:

(協議,本地地址,本地埠號,遠地地址,遠地埠號)

這樣一個五元組,叫做一個相關(association),即兩個協議相同的半相關才能組合成一個合適的相關,或完全指定組成一連接。

二、客戶/伺服器模式

在TCP/IP網路應用中,通信的兩個進程間相互作用的主要模式是客戶/伺服器(Client/Server,
C/S)模式,即客戶向伺服器發出服務請求,伺服器接收到請求後,提供相應的服務。客戶/伺服器模式的建立基於以下兩點:

(1)首先,建立網路的起因是網路中軟硬體資源、運算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機提供服務,資源較少的客戶請求服務這一非對等作用。

(2)其次,網間進程通信完全是非同步的,相互通信的進程間既不存在父子關係,又不共享內存緩衝區,因此需要一種機製為希望通信的進程間建立聯繫,為二者的數據交換提供同步,這就是基於客戶/伺服器模式的TCP/IP。

伺服器端:

其過程是首先伺服器方要先啟動,並根據請求提供相應服務:

(1)打開一通信通道並告知本地主機,它願意在某一公認地址上的某埠(如FTP的埠可能為21)接收客戶請求;

(2)等待客戶請求到達該埠;

(3)接收到客戶端的服務請求時,處理該請求並發送應答信號。接收到並發服務請求,要激活一新進程來處理這個客戶請求(如UNIX系統中用fork、exec)。新進程處理此客戶請求,並不需要對其它請求作出應答。服務完成後,關閉此新進程與客戶的通信鏈路,並終止。

(4)返回第(2)步,等待另一客戶請求。

(5)關閉伺服器

客戶端:

(1)打開一通信通道,並連接到伺服器所在主機的特定埠;

(2)向伺服器發服務請求報文,等待並接收應答;繼續提出請求......

(3)請求結束後關閉通信通道並終止。

從上面所描述過程可知:

(1)客戶與伺服器進程的作用是非對稱的,因此代碼不同。

(2)伺服器進程一般是先啟動的。只要系統運行,該服務進程一直存在,直到正常或強迫終止。


Socket編程所牽涉的東西非常寬泛,調用各種編程語言對socket的TCP(TCP可靠通信的實現方式)和UDP封裝進行網路通信,可以是監聽外部鏈接,也可以是主動發起鏈接請求,發送特定協議並進行通信,如何制定協議規範,如何進行協議的編碼和解碼,如何將協議數據轉換為二進位數據發送到網路上和從網路接收辨別且處理成功(牽涉到TCP粘包等問題),如何針對建立的鏈接進行管理等。。。。


就是兩個進程,跨計算機,他倆需要通訊的話,需要通過網路對接起來。
這就是 socket 的作用。打個比方吧,兩個進程在兩個計算機上,需要有一個進程做被動方,叫做伺服器。另一個做主動方,叫做客戶端。他們位於某個計算機上,叫做主機 host ,在網路上有自己的 ip 地址。一個計算機上可以有多個進程作為伺服器,但是 ip 每個機器只有一個,所以通過不同的 port 數字加以區分。
因此,伺服器程序需要綁定在本機的某個埠號上。客戶端需要聲明自己連接哪個地址的那個埠。兩個進程通過網路建立起通訊渠道,然後就可以通過 recv send 來收發一些信息,完成通訊。

所以 socket 就是指代承載這種通訊的系統資源的標識。


Socket就是TCP/IP協議的編程模型,通過一系列API來訪問操作系統的網路協議棧,從而建立TCP連接,發送或接收數據。


首先,為什麼要有socket?
socket的存在是為了簡化基於cs模式的網路進程間通訊。cs模式下的進程間通信比較複雜,要解決以下兩個問題:
1.每台主機既可以當客戶端,也可以當伺服器,也可以又當客戶端又當伺服器。
2.伺服器可以為多個客戶端服務,客戶機也可以訪問多個伺服器。
總的來說就是一台機器上能運行多個進程,有客戶端進程也有服務端進程。

這個問題是由傳輸協議棧來解決的,socket基於tcp/ip協議棧,它用ip地址加埠號標識一個進程,服務端被動等待客戶端的呼叫,然後建立連接,通信。

socket是什麼?
從編程語言的角度,socket是一個無符號整型變數,用來標識一個通信進程。兩個進程通信,總要知道這幾個信息:雙方的ip地址和埠號,通信所採用的協議棧。socket就是和這些東西綁定的,實現socket可以使用unix提供的介面,也可以使用wIndows提供的winSock。

socket適用場合?
socket是位於傳輸層的網路編程了,一般用於需要自己定義應用層的協議的應用程序,如果已經有了成熟的應用層協議,比如http等,可以使用jsp.php.asp或者是.net框架開發。

socket優缺點?
個人認為缺點是需要記很多函數,過程較複雜需記憶。

socket如何使用?
大概流程是:
客戶端:需要先建立套接字,然後申請連接伺服器,需要知道服務端的ip和埠號,而不需要指定客戶端的(客戶端會由os分配),連接上伺服器後開始讀寫信息,最後關閉套接字。
服務端:建立監聽套接字,綁定地址和埠號,然後開始監聽,等待客戶機連接,生成一個響應套接字,負責處理這個連接請求,然後讀寫信息,關閉響應套接字,關閉監聽套接字。


socket就是網路連接的端點。

就像一根網線,一頭連到路由器,一頭連到電腦。這兩端就是socket。

socket編程就是利用一些函數開發網路應用。

這些函數都與socket介面有關。
socket介面可以在各種系統上使用,比如linux,windows,mac。

從開發的角度看,socket類似文件。

這與開發文件讀寫程序時你打開的文件類似,只不過這是一個socket文件。

socket的結構
socket的結構很簡單,只有三個元素,協議,埠號,IP地址。

socket程序的樣子?
在C語言中,socket函數能夠返回一個socket描述符,把它想像成文件描述符。

接下來如果是客戶端,使用connect連接socket地址,連接成功,socket描述符就可以讀寫了。

伺服器端.
bind函數將socket地址和socket描述符綁定。
listen函數講socket描述符轉化成「監聽描述符」,供伺服器監聽客戶端的請求用。
accept函數等待客戶端的請求,返回「已連接描述符」,後續可以用來與客戶端通信(使用底層io函數)。

以上是使用c語言進行socket編程的幾個主要函數。

想了解詳細信息,可以參看c語言或unix網路編程的資料。


socket是郵局的郵桶,你的信必須放在信封里才能寄出去。郵局並不關心你的信,他只關心從哪裡來到哪裡去。


曾經有個人和我說socket = ip address + port number。想了半天,好像沒感覺有什麼錯誤。


就是網路進程間通信。

同機進程間通信可以用進程號標識,網路進程間通信用(ip地址,協議,埠)標識。

學習,看《UNP》啊!


socket是起源於Unix下的一組編程介面,因為被廣泛使用,所以windows、linux都支持socket編程。
常見的編程語言,C、C++、C#、JAVA等等都提供了socket的編程函數(庫)。
socket主要用於編寫網路上傳輸數據的程序、如聊天軟體、下載軟體、瀏覽器......主要使用TCP/IP協議來傳輸數據。
socket提供了一組函數,如建立連接、收發數據等等,這些函數在不同平台和語言下都是類似的。


socket中文意思之一是插座
網路編程就是通過協議,在讓數據從一台設備發到另外一台設備,但是協議本身比較繁雜,開發效率不高,那怎麼辦呢?
做一個適配層吧,就像插座一樣,不需要管理面複雜的電路,需要什麼功能,就插在什麼位置,這就是socket,在TCP/IP網路架構中屬於傳輸層和應用層之間的一個虛擬層,又稱插口層。

使用socket思路非常清晰
1. 選擇需要的協議(UDP,TCP等)
2. 結合需求設置部分參數(可選,並不影響基本功能)

希望能幫到你:)


可以先看下OSI七層參考模型,同時對照著看下tcp/ip協議模型。然後了解下socket的由來,和tcp/ip協議族的關係。然後詳細學習下socket編程模型,包括伺服器端和客戶端的,模型其中用到的每個函數和參數都要弄明白是什麼意思,再結合具體的例子實驗一下。這樣對socket就有了初級的理解了,然後可以深入研究一些較高級問題了


發一個前幾天從項目里拆分的socket 伺服器(C#)
https://github.com/Hsiny/SocketServer
實現了分用戶分房間發消息。
目前在完善中,一起學習。


首先我們了解一下Socket是什麼呢?

Socket,又稱為套接字,Socket是計算機網路通信的基本的技術之一。如今大多數基於網路的軟體,如瀏覽器,即時通訊工具甚至是P2P下載都是基於Socket實現的。

Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議。

TCP和UDP通信

   關於socket編程我們有兩種通信協議可以進行選擇。一種是數據報通信,另一種就是流通信。

  數據報通信

   數據報通信協議,就是我們常說的UDP(User Data Protocol 用戶數據報協議)。UDP是一種無連接的協議,這就意味著我們每次發送數據報時,需要同時發送本機的socket描述符和接收端的socket描述符。因此,我們在每次通信時都需要發送額外的數據。

   流通信

   流通信協議,也叫做TCP(Transfer Control Protocol,傳輸控制協議)。和UDP不同,TCP是一種基於連接的協議。在使用流通信之前,我們必須在通信的一對兒socket之間建立連接。其中一個socket作為伺服器進行監聽連接請求。另一個則作為客戶端進行連接請求。一旦兩個socket建立好了連接,他們可以單向或雙向進行數據傳輸。

  讀到這裡,我們多少有這樣的疑問,我們進行socket編程使用UDP還是TCP呢。選擇基於何種協議的socket編程取決於你的具體的客戶端-伺服器端程序的應用場景。下面我們簡單分析一下TCP和UDP協議的區別,或許可以幫助你更好地選擇使用哪種。

  在UDP中,每次發送數據報時,需要附帶上本機的socket描述符和接收端的socket描述符。而由於TCP是基於連接的協議,在通信的socket對之間需要在通信之前建立連接,因此會有建立連接這一耗時存在於TCP協議的socket編程。

  在UDP中,數據報數據在大小上有64KB的限制。而TCP中也不存在這樣的限制。一旦TCP通信的socket對建立了連接,他們之間的通信就類似IO流,所有的數據會按照接受時的順序讀取。

UDP是一種不可靠的協議,發送的數據報不一定會按照其發送順序被接收端的socket接受。然後TCP是一種可靠的協議。接收端收到的包的順序和包在發送端的順序是一致的。

  簡而言之,TCP適合於諸如遠程登錄(rlogin,telnet)和文件傳輸(FTP)這類的網路服務。因為這些需要傳輸的數據的大小不確定。而UDP相比TCP更加簡單輕量一些。UDP用來實現實時性較高或者丟包不重要的一些服務。在區域網中UDP的丟包率都相對比較低。


說那麼多 我舉個例子吧

假設樓主買了個快遞 但是樓主比較著急 動不動就去網站查詢快遞到哪裡了

一直不停的去查 每天100次 但是每次還沒動靜(可能是某通)

於是就設置了一個簡訊提醒 一旦有動靜 就給你發消息

前者就是輪詢 後者就是Socket


就是一個主動和被動的形式


套接字就是通信控制信息,如IP地址、埠號、通信雙方所處的狀態等,實體就是存放通信控制信息的內存空間,操作系統的協議棧通過套接字中記錄的控制信息來工作的。


就是一個進程間通信的統一API,不管是同一台機器還是用網路連在一起,都可以。


Socket「套接字」,可以想像成是傳輸層和應用層進行通信的介質,如果說應用層是汽車外殼,socket很像發動機


推薦閱讀:

大學不主攻ACM,進工作室自學android做小項目,會有前途嗎?
如何看待CSDN強制要求用戶以主動發簡訊的方式來驗證手機號?
當碼農究竟有多累?
互聯網+被炒的那麼熱,到底有何意義?
怎麼理解Booth演算法?

TAG:程序員 | 編程 | 計算機網路 | Socket | 網路編程 |