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ù)蒿涎。