我所認識的Socket

我所認識的Socket

Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層(百度百科的解釋:網(wǎng)絡(luò)上兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket)

1)支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的操作單元,是對TCP/IP協(xié)議的封裝,它本身不是一個協(xié)議,而是一個調(diào)用接口(API)

2)Socket位于應(yīng)用層和傳輸層之間,可用指定傳輸層所使用的協(xié)議,TCP(Transimission Control Protocol)或UDP(User Datagram Protocol)

3)Socket一旦建立起連接,通信的雙方可以互相發(fā)送數(shù)據(jù)(推送),直到斷開連接

4)由于網(wǎng)絡(luò)通信要經(jīng)過多個中間節(jié)點,如路由器、網(wǎng)關(guān)、防火墻等,大部分防火墻會默認關(guān)閉長時間處于非活躍狀態(tài)的連接而導(dǎo)致Socket連接中斷,雖然Socket是長連接

5)定時發(fā)送數(shù)據(jù)包(又名心跳包)以避免長時間不活躍而被關(guān)閉的Socket連接

6)利用三元組(ip地址、協(xié)議、端口號)就可以標識網(wǎng)絡(luò)的進程

7)如果一個程序創(chuàng)建了Socket,并讓其監(jiān)聽80端口(創(chuàng)建時會為其分配一個端口),其實是向TCP/IP協(xié)議棧聲明了其對80端口的占用,之后,所有目標是80端口的TCP數(shù)據(jù)包都會轉(zhuǎn)發(fā)給該應(yīng)用程序

結(jié)構(gòu)圖

Socket的通信連接過程

1)服務(wù)端先初始化Socket,然后與端口綁定(bind),對端口進行監(jiān)聽(listen),調(diào)用accept方法阻塞,等待客戶端的連接。

2)客戶端初始化Socket,然后連接服務(wù)(connect),如果連接成功(三次握手成功),這時客戶端就和服務(wù)端建立了連接

3)客戶端發(fā)送數(shù)據(jù)請求,服務(wù)端接收請求并處理請求,然后把數(shù)據(jù)響應(yīng)給客戶端,客戶端讀取數(shù)據(jù),最后關(guān)閉連接,一次交互結(jié)束

通信連接過程

Socket數(shù)據(jù)傳輸過程

1)當連接成功時,客戶端和服務(wù)端都會擁有一個Scoket實例,每個實例都有一個InputStream和OutputStream,正是通過這兩個對象類交換數(shù)據(jù)

2)網(wǎng)絡(luò)I/O操作都是字節(jié)流傳輸?shù)?,當Socket對象創(chuàng)建時,操作系統(tǒng)會為InputStream和OutputStream分別分配一定大小的緩沖區(qū),數(shù)據(jù)的寫入和寫出都是通過緩沖區(qū)完成的

3)寫入端將數(shù)據(jù)寫到OutputStream對應(yīng)的SendQ隊列中,當隊列填滿時,數(shù)據(jù)將被發(fā)送到另一端的InputStream的RecvQ隊列中

4)如果此時RecvQ隊列已經(jīng)滿了,那么OutputStream的write方法將會阻塞直到RecvQ隊列有足夠的空間容納SendQ發(fā)送的數(shù)據(jù)

5)該注意的是,緩沖區(qū)的大小以及寫入端的速度和讀取速度非常影響這個連接的數(shù)據(jù)傳輸效率,有可能發(fā)送阻塞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容