国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Socket 核心原理分享

作者:ITDragon龍
出處:http://www.cnblogs.com/itdragon/


Socket 的個人故事。希望通過這篇文章讓你弄懂什么是 Socket,明白 TCP 和 UDP 協(xié)議的通訊,明白長連接和短連接的優(yōu)缺點,明白 BIO、NIO、AIO的區(qū)別。

Socket

大家好,我是 Socket。很多人都知道我,但是都不清楚我。給你看一下我和大佬的合影。

我很榮幸能與 TCP/IP 五層模型中的各位大佬站在一起,但我并不屬于他們中的任何一層。我的存在只是為了讓應(yīng)用層的使用者能更簡單地將數(shù)據(jù)丟給傳輸層。他們不需要關(guān)系 TCP/IP 協(xié)議族的復(fù)雜內(nèi)容。有什么問題直接找我,我來幫你搞定。簡單來說,你們可以把我理解成是應(yīng)用層與TCP/IP協(xié)議族通信的抽象層、函數(shù)庫。

物理層:規(guī)范傳輸介質(zhì)的規(guī)格特性(接口大小、形狀、引線數(shù)量、電壓范圍等),讓比特流能在各種傳輸媒體之間傳輸。

鏈路層:提供介質(zhì)訪問和鏈路管理,主要將源計算機(jī)網(wǎng)絡(luò)層來的數(shù)據(jù)可靠的傳輸?shù)较噜徆?jié)點的目標(biāo)計算機(jī)的網(wǎng)絡(luò)層。

網(wǎng)絡(luò)層:提供了主機(jī)到主機(jī)的通信服務(wù)和各種形式的進(jìn)程到進(jìn)程的通信。實現(xiàn)兩個端系統(tǒng)之間的數(shù)據(jù)透明傳送,使傳輸層不需要了解網(wǎng)絡(luò)中的數(shù)據(jù)傳輸和交換技術(shù)。

傳輸層:主要負(fù)責(zé)向兩個主機(jī)中進(jìn)程之間的通信提供服務(wù)。

應(yīng)用層:為應(yīng)用程序提供服務(wù)。

TCP 和 UDP

前面介紹過,我是應(yīng)用層和傳輸層之間的抽象層。他們之間的通訊都是通過我來完成,可以把我理解成網(wǎng)絡(luò)通信的基本操作單元。有時候通訊多了,可真把我給壞了。比如很多時候應(yīng)用層會有多個程序往傳輸層進(jìn)行通信。這時候會有多個 TCP (UDP)連接,或者多個應(yīng)用進(jìn)程用同一個 TCP (UDP)連接。為了避免各個連接通訊混亂的問題,我可費了不少心思。

我有三寶:協(xié)議、IP地址、端口。每個 Socket 都會帶上這三寶,確保自己能到達(dá)正確的目標(biāo)主機(jī)上。

協(xié)議:一種約定和規(guī)范。只有通訊雙方使用同一種協(xié)議才能互相通訊。

地址:目標(biāo)主機(jī)的地址。不管是客戶端還是服務(wù)端,都需要一個IP地址。

端口:用于區(qū)分網(wǎng)絡(luò)程序的唯一標(biāo)識。目標(biāo)主機(jī)上會有很多的網(wǎng)絡(luò)應(yīng)用,他們各占一個端口,互不沖突。

TCP

TCP 傳輸控制協(xié)議(Transmission Control Protocol)是一種面向連接、可靠、基于字節(jié)流的傳輸層通信協(xié)議。在建立連接時需要進(jìn)行三次握手,確保在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境下能進(jìn)行可靠的傳輸。在斷開連接時需要進(jìn)行四次揮手,確保雙方通訊的數(shù)據(jù)完整。

三次握手

第一次握手:從客服端發(fā)往服務(wù)端,發(fā) syn 包,看能否連上服務(wù)器。需要等待服務(wù)器確認(rèn)。

第二次握手:從服務(wù)端發(fā)往客戶端,發(fā) ack 包,通知客戶端你能連上我。同時發(fā)送 syn 包,看能否連上客戶端。需要等待客戶端確認(rèn)。

第三次握手:從客服端發(fā)往服務(wù)端,發(fā) ack 包,通知服務(wù)端你能連上我。

四次揮手

第一次揮手:從客戶端發(fā)往服務(wù)端,發(fā) fin 包,告知服務(wù)端要斷開連接。

第二次揮手:從服務(wù)端發(fā)往客戶端,發(fā) ack 包,通知客戶端你的請求我收到了,但是我還沒有準(zhǔn)備好,等通知。

第三次揮手:從服務(wù)端發(fā)往客戶端,發(fā) fin 包,告知客戶端我已經(jīng)要斷開連接了。

第四次握手:從客戶端發(fā)往服務(wù)端,發(fā) ack 包,通知服務(wù)端你的請求我收到了,如果你不回我消息,我也斷開連接了。

TCP Socket 通訊流程圖如下。

首先,服務(wù)端和客戶端都需要調(diào)用 socket 函數(shù)。用來生成一個用于通信的套接字文件描述符 sockfd。

隨后,服務(wù)端需要調(diào)用 bind 函數(shù)。開始將服務(wù)器 IP 和 PORT 綁定到第一步創(chuàng)建的 sockfd 上。

然后,服務(wù)器便可以調(diào)用 listen 函數(shù)。此時的套接字狀態(tài)從 CLOSE 轉(zhuǎn)變?yōu)?LISTEN,成為一個對外提供 TCP 連接的窗口。監(jiān)聽著客戶端的連接請求。

一旦,服務(wù)端監(jiān)聽到客戶端的連接請求后,服務(wù)端便開始調(diào)用 accept 函數(shù)。接收請求了一些包括客戶端傳來的 IP 和 PORT。若接收成功,還會再創(chuàng)建一個新的 sockfd 與客戶端進(jìn)行 IO 操作。

最后,在通訊結(jié)束后調(diào)用 close 函數(shù)。與客戶端進(jìn)行四次揮手后關(guān)閉,釋放資源。

連接,客戶端發(fā)起連接時需要調(diào)用 connect 函數(shù)。將帶上自身的 IP、隨機(jī)的 PORT 和 sockfd 向目標(biāo)服務(wù)器開始三次握手建立連接。

UDP

UDP 用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol)是無連接的,面向消息的,提供高效率服務(wù)。UDP 不需要連接,少了三次握手和四次揮手的操作,從而對資源的占用率更少、處理的網(wǎng)絡(luò)請求和響應(yīng)效率更快。但他不能保障在極端的情況下載通訊不會丟失。

UDP 在綁定目標(biāo)主機(jī)地址后,便可以通過 Sendto 和 Recvfrom 發(fā)送和接受數(shù)據(jù)。

長連接和短連接

長連接:通訊雙方在有數(shù)據(jù)交互時建立一個 TCP 連接,并一直保持連接狀態(tài)。

短連接:通訊雙方在有數(shù)據(jù)交互時就建立一個 TCP 連接,數(shù)據(jù)交互完成后斷開連接。

長連接不需要頻發(fā)建立連接,適用于頻繁請求的客戶。減少了短連接頻繁創(chuàng)建連接帶來的資源開銷。但是長連接如果過多也會服務(wù)器帶來很大的壓力。長連接的應(yīng)用場景相比短連接要少點。使用建議定時發(fā)送心跳包,以維持連接的狀態(tài)。且長連接的數(shù)量不宜過多。

短連接對于服務(wù)器而言比較簡單,每個連接都是有用的,不需要像長連接一樣需要額外維護(hù)。

BIO NIO AIO

BIO 全稱Block-IO 是一種阻塞同步的通信模式。我們常說的Stock IO 一般指的是BIO。是一個比較傳統(tǒng)的通信方式,模式簡單,使用方便。但并發(fā)處理能力低,通信耗時,依賴網(wǎng)速。

NIO 全稱New IO,也叫Non-Block IO 是一種非阻塞同步的通信模式。

AIO 也叫NIO2.0 是一種非阻塞異步的通信模式。在NIO的基礎(chǔ)上引入了新的異步通道的概念,并提供了異步文件通道和異步套接字通道的實現(xiàn)。

BIO 設(shè)計原理:

服務(wù)器通過一個Acceptor線程負(fù)責(zé)監(jiān)聽客戶端請求和為每個客戶端創(chuàng)建一個新的線程進(jìn)行鏈路處理。典型的一請求一應(yīng)答模式。若客戶端數(shù)量增多,頻繁地創(chuàng)建和銷毀線程會給服務(wù)器打開很大的壓力。后改良為用線程池的方式代替新增線程,被稱為異步IO。

服務(wù)器提供IP地址和監(jiān)聽的端口,客戶端通過TCP的三次握手與服務(wù)器連接,連接成功后,雙放才能通過套接字(Stock)通信。

NIO 設(shè)計原理:

NIO 相對于BIO來說一大進(jìn)步??蛻舳撕头?wù)器之間通過Channel通信。NIO可以在Channel進(jìn)行讀寫操作。這些Channel都會被注冊在Selector多路復(fù)用器上。Selector通過一個線程不停的輪詢這些Channel。找出已經(jīng)準(zhǔn)備就緒的Channel執(zhí)行IO操作。

NIO 通過一個線程輪詢,實現(xiàn)千萬個客戶端的請求,這就是非阻塞NIO的特點。

AIO 設(shè)計原理:

AIO 并沒有采用NIO的多路復(fù)用器,而是使用異步通道的概念。其read,write方法的返回類型都是Future對象。而Future模型是異步的,其核心思想是:去主函數(shù)等待時間。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java 詳解BIO與NIO、AIO的區(qū)別
如果有人再問你 Java IO,就把這篇文章砸他頭上
HTTP 和 Socket 的區(qū)別
http,websocket和socket詳解
網(wǎng)絡(luò)編程常見問題總結(jié)
Java socket詳解(轉(zhuǎn))
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服