Android網(wǎng)絡(luò)接口 Socket 套接字通信

http茎活,socket昙沦,tcp/ip 網(wǎng)絡(luò)傳輸與通訊

TCP的全稱為傳輸控制協(xié)議。這種協(xié)議可以提供面向連接的载荔、可靠的盾饮、點(diǎn)到點(diǎn)的通信。

UDP全稱為用戶數(shù)據(jù)報(bào)協(xié)議懒熙,它可以提供非連接的不可靠的點(diǎn)到多點(diǎn)的通信丘损。

使用TCP還是UDP,那要看你的程序注重哪一個(gè)方面工扎,可靠(tcp)還是快速(udp)徘钥。

1.TCP是面向鏈接的,TCP的三次握手在最低限度上保證了連接的可靠性肢娘;而UDP不是面向連接的呈础,UDP傳送數(shù)據(jù)前并不與對方建立連接,對接收到的數(shù)據(jù)也不發(fā)送確認(rèn)信號橱健,發(fā)送端不知道數(shù)據(jù)是否會正確接收而钞,當(dāng)然也不用重發(fā),所以說UDP是無連接的拘荡、不可靠的一種數(shù)據(jù)傳輸協(xié)議臼节。

2.也正由于1所說的特點(diǎn),使得UDP的開銷更小數(shù)據(jù)傳輸速率更高,因?yàn)椴槐剡M(jìn)行收發(fā)數(shù)據(jù)的確認(rèn)官疲,所以UDP的實(shí)時(shí)性更好袱结。


TCP/IP建立連接的過程 TCP連接需要經(jīng)過 三次握手

第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器途凫,并進(jìn)入SYN_SEND狀態(tài)垢夹,等待服務(wù)器確認(rèn);

第二次握手:服務(wù)器收到syn包维费,必須確認(rèn)客戶的SYN(ack=j+1)果元,同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包犀盟,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)而晒;

第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)阅畴,此包發(fā)送完畢倡怎,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手贱枣。

所謂的三次握手就是要有三次連接信息的發(fā)送/接收過程监署。握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后纽哥,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)

三次握手實(shí)質(zhì)上就相當(dāng)于是下列的對話:

-客戶機(jī):服務(wù)器钠乏,我想要和你建立連接,你同意嗎春塌?(SYN=1)

-服務(wù)器:客戶機(jī)晓避,我同意和你建立連接(ACK=1);我也想和你建立連接只壳,你同意嗎俏拱?(SYN=1)

-客戶機(jī):服務(wù)器,我同意和你建立連接吕世。(ACK=1)

四次揮手實(shí)質(zhì)上就相當(dāng)于是下列的對話:

-客戶機(jī):服務(wù)器彰触,我想和你斷開連接,你同意嗎命辖?(FIN=1)

-服務(wù)器:我同意(ACK=1)(在此期間况毅,服務(wù)器可能還會向客戶機(jī)發(fā)送數(shù)據(jù),但是客戶機(jī)卻不能再向服務(wù)器發(fā)送數(shù)據(jù))

-服務(wù)器:客戶機(jī)尔艇,我想要和你斷開連接尔许,你同意嗎?(FIN=1)

-客戶機(jī):我同意终娃。(ACK=1)


HTTP連接

HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol )味廊,是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用余佛。

HTTP連接最顯著的特點(diǎn)是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng)柠新,在請求結(jié)束后,會主動釋放連接辉巡。從建立連接到關(guān)閉連接的過程稱為“一次連接”


SOCKET原理

套接字(SOCKET)概念

socket是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元郊楣。它包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址钥组,本地進(jìn)程的協(xié)議端口程梦,遠(yuǎn)地主機(jī)的IP地址放椰,遠(yuǎn)地進(jìn)程的協(xié)議端口。

應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí),TCP會遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題如蚜。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過同一個(gè) TCP協(xié)議端口傳輸數(shù)據(jù)影暴。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接型宙,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應(yīng)用層可以和傳輸層通過Socket接口魂拦,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信芯勘,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)腺逛。

socket的出現(xiàn)只是可以更方便的使用TCP/IP協(xié)議棧而已,其對TCP/IP進(jìn)行了抽象


建立SOCKET連接

建立Socket連接至少需要一對套接字抛杨,其中一個(gè)運(yùn)行于客戶端荐类,稱為ClientSocket 掉冶,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket 恢共。

套接字之間的連接過程分為三個(gè)步驟:服務(wù)器監(jiān)聽讨韭,客戶端請求癣蟋,連接確認(rèn)疯搅。


1.)服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字幔欧,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)觉义,等待客戶端的連接請求晒骇。

2.)客戶端請求:指客戶端的套接字提出連接請求洪囤,要連接的目標(biāo)是服務(wù)器端的套接字屠缭。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字款咖,指出服務(wù)器端套接字的地址和端口號铐殃,然后就向服務(wù)器端套接字提出連接請求。

3.)連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時(shí)坏逢,就響應(yīng)客戶端套接字的請求是整,建立一個(gè)新的線程民假,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述事秀,雙方就正式建立連接野舶。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)平道,繼續(xù)接收其他客戶端套接字的連接請求巢掺。


SOCKET連接與TCP/IP連接

創(chuàng)建Socket連接時(shí),可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP)轧苫,當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí)含懊,該Socket連接就是一個(gè)TCP連接衅胀。

SOCKET連接與HTTP連接

由于通常情況下Socket連接就是TCP連接滚躯,因此Socket連接一旦建立,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容宙帝,直到雙方連接斷開募闲。但在實(shí)際網(wǎng)絡(luò)應(yīng)用中浩螺,客戶端到服務(wù)器之間的通信往往需要穿越多個(gè)中間節(jié)點(diǎn)要出,例如路由器厨幻、網(wǎng)關(guān)、防火墻等饭宾,大部分防火墻默認(rèn)會關(guān)閉長時(shí)間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連格了,因此需要通過輪詢告訴網(wǎng)絡(luò)弹惦,該連接處于活躍狀態(tài)悄但。

而HTTP連接使用的是“請求—響應(yīng)”的方式,不僅在請求時(shí)需要先建立連接助泽,而且需要客戶端向服務(wù)器發(fā)出請求后嗡贺,服務(wù)器端才能回復(fù)數(shù)據(jù)诫睬。

很多情況下摄凡,需要服務(wù)器端主動向客戶端推送數(shù)據(jù),保持客戶端與服務(wù)器數(shù)據(jù)的實(shí)時(shí)與同步炸宵。

若雙方建立的是Socket連接土全,服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶端裹匙;

若雙方建立的是HTTP連接概页,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端惰匙。

因此项鬼,客戶端定時(shí)向服務(wù)器端發(fā)送連接請求绘盟,不僅可以保持在線龄毡,同時(shí)也是在“詢問”服務(wù)器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端锡垄。

傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的沦零,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的,而Socket本身不算是協(xié)議货岭,就像上面所說蠢终,它只是提供了一個(gè)針對TCP或者UDP編程的接口。

TCP/IP的工作原理:TCP/IP協(xié)議采用4層結(jié)構(gòu)茴她,分別是應(yīng)用層、傳輸層程奠、網(wǎng)絡(luò)層和鏈路層

物理介質(zhì):常見的有光纖丈牢、雙絞線,以及無線電波瞄沙,網(wǎng)絡(luò)通訊信的橋梁

網(wǎng)絡(luò)通信就是把有特定意義的數(shù)據(jù)通過物理介質(zhì)傳送給對方己沛,單純的發(fā)送0和1是沒有意義的垮卓,因此就需要對0和1進(jìn)行分組,并且要標(biāo)識好每一組電信號的信息特征,然后按照分組的順序依次發(fā)送庙曙。

鏈路層:以太網(wǎng)協(xié)議:電信號數(shù)據(jù)包傳遞即為一幀包括MAC地址砂蔽,類型;數(shù)據(jù);數(shù)據(jù)幀校驗(yàn)序列。有了MAC地址以后,以太網(wǎng)采用廣播形式,把數(shù)據(jù)包發(fā)給該子網(wǎng)內(nèi)所有主機(jī)辫秧,子網(wǎng)內(nèi)每臺主機(jī)在接收到這個(gè)包以后,讀取首部里的目標(biāo)MAC地址和自己的MAC地址匹配柿究,相同處理,不同丟棄。

網(wǎng)絡(luò)層:IP協(xié)議 :MAC地址只與廠商有關(guān)苗膝,與所處的網(wǎng)絡(luò)無關(guān)问窃,所以無法通過MAC地址來判斷兩臺主機(jī)是否屬于同一個(gè)子網(wǎng)覆积。因此尉姨,網(wǎng)絡(luò)層引入了IP協(xié)議覆致,制定了一套新地址做區(qū)分声旺。也就是所謂的IP地址澈缺,為了判斷IP地址中的網(wǎng)絡(luò)地址项滑,IP協(xié)議還引入了子網(wǎng)掩碼宋渔,通過子網(wǎng)掩碼對兩個(gè)IP地址進(jìn)行AND運(yùn)算后就能夠判斷雙方是否在同一個(gè)子網(wǎng)了氧急。

網(wǎng)絡(luò)層的主要工作是定義網(wǎng)絡(luò)地址钾恢,區(qū)分網(wǎng)段疹瘦,子網(wǎng)內(nèi)MAC尋址,對于不同子網(wǎng)的數(shù)據(jù)包進(jìn)行路由。

傳輸層:鏈路層定義了主機(jī)的身份,即MAC地址铸史, 而網(wǎng)絡(luò)層定義了IP地址怯伊,明確了主機(jī)所在的網(wǎng)段,有了這兩個(gè)地址,數(shù)據(jù)包就從可以從一個(gè)主機(jī)發(fā)送到另一臺主機(jī)猩系。但實(shí)際上數(shù)據(jù)包是從一個(gè)主機(jī)的某個(gè)應(yīng)用程序發(fā)出吟秩,然后由對方主機(jī)的應(yīng)用程序接收壮池。怎么接收呢窗骑?個(gè)主機(jī)上的每個(gè)應(yīng)用程序都需要指定唯一的端口號,并且規(guī)定網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包必須加上端口信息痘拆,根據(jù)端口號可以找到對應(yīng)的應(yīng)用程序(socket擴(kuò)展)仰禽。 為了保證傳輸?shù)目煽啃裕琓CP協(xié)議建立了三次對話的確認(rèn)機(jī)制纺蛆,也就是說吐葵,在正式收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接桥氏。

總結(jié)一下温峭,傳輸層的主要工作是定義端口,標(biāo)識應(yīng)用程序身份字支,實(shí)現(xiàn)端口到端口的通信凤藏,TCP協(xié)議可以保證數(shù)據(jù)傳輸?shù)目煽啃浴?/p>

應(yīng)用層:有了以上三層協(xié)議的支持,數(shù)據(jù)已經(jīng)可以從一個(gè)主機(jī)上的應(yīng)用程序傳輸?shù)搅硪慌_主機(jī)的應(yīng)用程序了堕伪,但此時(shí)傳過來的數(shù)據(jù)是字節(jié)流揖庄,不能很好的被程序識別,操作性差欠雌。因此蹄梢,應(yīng)用層定義了各種各樣的協(xié)議來規(guī)范數(shù)據(jù)格式,常見的有http,ftp,smtp等富俄,http是一種比較常用的應(yīng)用層協(xié)議 禁炒。在請求Header中,分別定義了請求數(shù)據(jù)格式Accept 和 響應(yīng)數(shù)據(jù)格式Content-Type蛙酪,有了這個(gè)規(guī)范以后齐苛,當(dāng)對方接收到請求以后就知道該用什么格式來解析,然后對請求進(jìn)行處理就可以看到接收的數(shù)據(jù)信息桂塞。

首先我們梳理一下每層模型的職責(zé):

?鏈路層:對0和1進(jìn)行分組凹蜂,定義數(shù)據(jù)幀,確認(rèn)主機(jī)的物理地址,傳輸數(shù)據(jù)玛痊;

?網(wǎng)絡(luò)層:定義IP地址汰瘫,確認(rèn)主機(jī)所在的網(wǎng)絡(luò)位置,并通過IP進(jìn)行MAC尋址擂煞,對外網(wǎng)數(shù)據(jù)包進(jìn)行路由轉(zhuǎn)發(fā)混弥;

?傳輸層:定義端口,確認(rèn)主機(jī)上應(yīng)用程序的身份对省,并將數(shù)據(jù)包交給對應(yīng)的應(yīng)用程序蝗拿;

?應(yīng)用層:定義數(shù)據(jù)格式,并按照對應(yīng)的格式解讀數(shù)據(jù)蒿涎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哀托,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劳秋,更是在濱河造成了極大的恐慌仓手,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玻淑,死亡現(xiàn)場離奇詭異嗽冒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)补履,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門添坊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人干像,你說我怎么就攤上這事帅腌。” “怎么了麻汰?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵速客,是天一觀的道長。 經(jīng)常有香客問我五鲫,道長溺职,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任位喂,我火速辦了婚禮浪耘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塑崖。我一直安慰自己七冲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布规婆。 她就那樣靜靜地躺著澜躺,像睡著了一般蝉稳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掘鄙,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天耘戚,我揣著相機(jī)與錄音,去河邊找鬼操漠。 笑死收津,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浊伙。 我是一名探鬼主播撞秋,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嚣鄙!你這毒婦竟也來了部服?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拗慨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后奉芦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赵抢,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年声功,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烦却。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡先巴,死狀恐怖其爵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伸蚯,我是刑警寧澤摩渺,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站剂邮,受9級特大地震影響摇幻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挥萌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一绰姻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧引瀑,春花似錦狂芋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翼虫。三九已至,卻和暖如春黍特,著一層夾襖步出監(jiān)牢的瞬間蛙讥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工灭衷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留次慢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓翔曲,卻偏偏與公主長得像迫像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子瞳遍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容