Socket原理的簡單理解

2021-07-11 04:34:47 字數 3849 閱讀 6254

最近我在做乙個android小專案用到了socket,今天整理了一下資料總結我對socket的理解。

socket的使用就在我們生活中,只是不被我們關注而已,首先看看生活中哪些用到了socket:

網路中程序之間如何通訊

當我們開啟瀏覽器瀏覽網頁時,瀏覽器的程序和web伺服器通訊的

當我們用qq聊天時,qq程序和伺服器或好友所在的qq程序通訊

簡單的說就是那裡應用到網路那裡就有socket

那什麼是socket?在理解socket前,我們先來了解什麼是tcp/ip

tcp/ip

tcp/ip(transmission control protocol/internet protocol)即傳輸控制協議/網間協議,是乙個工業標準的協議集,它是為廣域網(wans)設計的。

udp(user data protocol,使用者資料報協議)是與tcp相對應的協議。它是屬於tcp/ip協議族中的一種。

從字面上看tcp/ip是tcp協議和ip協議的結合,其實tcp/ip是整個網路結構tcp/ip協議族

不同於osi模型的七個分層,tcp/ip協議參考模型把所有的tcp/ip系列協議歸類到四個抽象層中

注:有時候經常弄錯iso和osi,下面給出這兩個的全稱即中文翻譯

iso(international organization for standardization )「國際標準化組織」。

osi(open system interconnect)「開放式系統互聯」

osi模型這裡就不細講了,想要深入了解的可以在網上查詢

下面我們看看tcp/ip協議的四個抽象成

transport(傳輸層):

tcp(傳輸控制協議)

udp(使用者資料報協議)

network(網路層):

ip(網際網路協議)

icmp(網間控制報文協議)

igmp(英特網組管協議)

link(鏈路層):乙太網,令牌環網,ieee802.3等

tcp/ip協議模型的下一層是給上一層提供服務的

你從上面這兩張圖就知道了tcp/ip與udp的關係了吧。那我們的socket小夥伴在那個位置呢?不要急!看下面這張圖

摘自:

看到這裡是不是就知道socket的位置了!!!

再貼上一圖描述的是tcp/ip的資料的封裝與傳遞過程

這張圖清楚的講解了tcp/ip的資料如何封裝和傳遞方向

tcp/ip協議是乙個大方向,我們就先說到這裡。下面我們進入正題!

socket

好我們先說說socket是什麼

socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

太官方的答案?還是不懂?

好這裡給出乙個生活中的場景:你要打**給乙個朋友,先撥號,朋友聽到**鈴聲後提起**,這時你和你的朋友就建立起了連線,就可以講話了。等交流結束,結束通話**結束此次交談。

生活中的場景就解釋了這工作原理,也許tcp/ip協議族就是誕生於生活中,呵呵這也不一定。

前人已經給我們做了好多的事了,網路間的通訊也就簡單了許多,但畢竟還是有挺多工作要做的。以前聽到socket程式設計,覺得它是比較高深的程式設計知識,但是只要弄清socket程式設計的工作原理,神秘的面紗也就揭開了。

再簡單點,socket就是「開啟—讀/寫-—關閉」下面以tcp協議的socket通訊為例,先看下面這兩張圖:

圖1

圖2 摘自:

從圖中可以很清楚看出server端和client端的socket開啟->連線(通訊)->關閉的過程

首先server端根據位址型別(ipv4,ipv6)、socket型別、協議建立socket

————

然後繫結 socket和埠(埠自己定義,由於0~1023埠已經預設使用,防止埠衝突最好大於1024) 再開啟監聽

————

client端建立socket,然後根據server的ip和指定埠發起建立連線請求

————

當server接收到client連線請求被動開啟,開始接收客戶端請求,直到客戶端返回連線資訊。這時候socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連線資訊後才返回,開始接收下乙個客戶端連線請求

————

客戶端連線成功,向伺服器傳送連線狀態資訊

————

伺服器accept方法返回,連線成功

————

客戶端向socket寫入資訊

————

伺服器讀取資訊

————

客戶端關閉

————

伺服器端關閉

————

注意:

主動開啟和被動開啟

在client/server模式下,連線的建立請求是由client發起的,它執行「主動開啟」,而server執行「被動開啟」,並對client的連線請求被動響應。

在server程序的實現中,首先讓server執行「被動開啟」,告訴其tcp要準備接受client程序的連線請求。然後server程序就處於「聽(listen)」的狀態,不斷檢測是否有client程序要發起連線請求。如有,即作出響應。

說到連線結合tcp的三次握手進行分析

摘自:想對tcp三次握手四次握手更多了解的可以檢視這篇博文

握手過程

第一次握手:客戶端嘗試連線伺服器,其首部中的位元同步syn(同步序列編號synchronize sequence numbers)置為1,同時選擇乙個序號(seq=x),客戶端進入syn_send狀態等待伺服器確認

第二次握手:伺服器接收客戶端syn包並確認(ack=x+1),同時向客戶端傳送乙個syn包(syn=1),即syn+ack包,同時也為自己選擇乙個序號(seq=y),此時伺服器進入syn_recv狀態

第三次握手:第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=y+1),此包傳送完畢,其確認序號為y+1,客戶端和伺服器進入established狀態,完成三次握手

對tcp連線過程就講解這些需要深入了解的可以網上查詢資料

至於socket底層api涉及底層程式設計,像socket(),bind(),listen(),connect()等函式以及引數這裡不闡述,感興趣的童靴可以參考下面兩篇博文(程式語言是c/c++)

揭開socket程式設計的面紗

linux socket程式設計(不限linux)

Socket通訊原理簡單理解

今天就來說一下socket通訊的基本原理。要想理解socket首先得熟悉一下tcp ip協議族,tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思...

簡單理解Socket

鏈結 要想理解socket首先得熟悉一下tcp ip協議族,tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準 從字面意思來看tcp ip是tcp和ip協議的...

簡單理解Socket

tcp ip 要想理解socket首先得熟悉一下tcp ip協議族,tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思來看tcp ip是tcp和i...