1浸间、TCP/IP是個(gè)協(xié)議組太雨,可分為三個(gè)層次:網(wǎng)絡(luò)層、傳輸層和應(yīng)用層魁蒜。在網(wǎng)絡(luò)層有IP協(xié)議囊扳、ICMP協(xié)議、ARP協(xié)議兜看、RARP協(xié)議和BOOTP協(xié)議锥咸。在傳輸層中有TCP協(xié)議與UDP協(xié)議。在應(yīng)用層有FTP细移、HTTP搏予、TELNET、SMTP葫哗、DNS等協(xié)議缔刹。因此,HTTP本身就是一個(gè)協(xié)議劣针,是從Web服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議校镐。 TCP 是基于 TCP 協(xié)議實(shí)現(xiàn)的網(wǎng)絡(luò)文本協(xié)議,屬于應(yīng)用層。UDP 是和TCP 對(duì)等的捺典,屬于傳輸層鸟廓,UDP 和 TCP 有重要的區(qū)別。
?2襟己、HTTP協(xié)議是建立在請(qǐng)求/響應(yīng)模型上的引谜。
首先由客戶建立一條與服務(wù)器的TCP鏈接,并發(fā)送一個(gè)請(qǐng)求到服務(wù)器擎浴,請(qǐng)求中包含請(qǐng)求方法员咽、URI、協(xié)議版本以及相關(guān)的MIME樣式的消息贮预。
服務(wù)器響應(yīng)一個(gè)狀態(tài)行贝室,包含消息的協(xié)議版本契讲、一個(gè)成功和失敗碼以及相關(guān)的MIME式樣的消息。HTTP/1.0為每一次HTTP的請(qǐng)求/響應(yīng)建立一條新的TCP鏈接滑频,因此一個(gè)包含HTML內(nèi)容和圖片的頁(yè)面將需要建立多次的短期的TCP鏈接捡偏。一次TCP鏈接的建立將需要3次握手。另外峡迷,為了獲得適當(dāng)?shù)膫鬏斔俣纫埃瑒t需要TCP花費(fèi)額外的回路鏈接時(shí)間(RTT)。
每一次鏈接的建立需要這種經(jīng)常性的開(kāi)銷绘搞,而其并不帶有實(shí)際有用的數(shù)據(jù)彤避,只是保證鏈接的可靠性,因此HTTP/1.1提出了可持續(xù)鏈接的實(shí)現(xiàn)方法看杭。
HTTP/1.1將只建立一次TCP的鏈接而重復(fù)地使用它傳輸一系列的請(qǐng)求/響應(yīng)消息忠藤,因此減少了鏈接建立的次數(shù)和經(jīng)常性的鏈接開(kāi)銷。
這里有必要再講一下三次握手的過(guò)程:?
第一次握手:建立連接時(shí)楼雹,客戶端發(fā)送syn包(syn=j)到服務(wù)器模孩,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn)贮缅;SYN:同步序列編號(hào)(Synchronize Sequence Numbers)榨咐。?
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1)谴供,同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k)块茁,即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)桂肌;ACK:確認(rèn)字符(Acknowledgement)?
第三次握手:客戶端收到服務(wù)器的SYN+ACK包数焊,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢崎场,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài)佩耳,完成三次握手。?
?3谭跨、結(jié)論:雖然HTTP本身是一個(gè)協(xié)議干厚,但其最終還是基于TCP的。不過(guò)螃宙,目前蛮瞄,有人正在研究基于TCP+UDP混合的HTTP協(xié)議。
Socket是什么呢谆扎?? ? ??
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層挂捅,它是一組接口。
在設(shè)計(jì)模式中堂湖,Socket其實(shí)就是一個(gè)門面模式闲先,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面周瞎,對(duì)用戶來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部饵蒂,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議酱讶。
HTTP退盯、TCP、UDP泻肯、Socket(轉(zhuǎn))? TCP(Transmission Control Protocol渊迁,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說(shuō)灶挟,在正式收發(fā)數(shù)據(jù)前琉朽,必須和對(duì)方建立可靠的連接。一個(gè)TCP連接必須要經(jīng)過(guò)三次“對(duì)話”才能建立起來(lái)稚铣,其中的過(guò)程非常復(fù)雜箱叁,我們這里只做簡(jiǎn)單、形象的介紹惕医,你只要做到能夠理解這個(gè)過(guò)程即可耕漱。
我們來(lái)看看這三次對(duì)話的簡(jiǎn)單過(guò)程:主機(jī)A向主機(jī)B發(fā)出連接請(qǐng)求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù),可以嗎抬伺?”螟够,這是第一次對(duì)話;主機(jī)B向主機(jī)A發(fā)送同意連接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送峡钓,一個(gè)在接收妓笙,協(xié)調(diào)工作)的數(shù)據(jù)包:“可以,你什么時(shí)候發(fā)能岩?”寞宫,這是第二次對(duì)話;主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步:“我現(xiàn)在就發(fā)捧灰,你接著吧淆九!”,這是第三次對(duì)話毛俏。三次“對(duì)話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步炭庙,經(jīng)過(guò)三次“對(duì)話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)煌寇。 UDP(User Data Protocol焕蹄,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。
它是面向非連接的協(xié)議阀溶,它不與對(duì)方建立連接腻脏,而是直接就把數(shù)據(jù)包發(fā)送過(guò)去鸦泳!? UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境永品。比如做鹰,我們經(jīng)常使用“ping”命令來(lái)測(cè)試兩臺(tái)主機(jī)之間TCP/IP通信是否正常,其實(shí)“ping”命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送UDP數(shù)據(jù)包鼎姐,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包钾麸,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來(lái),那么網(wǎng)絡(luò)就是通的炕桨。例如饭尝,在默認(rèn)狀態(tài)下,一次“ping”操作發(fā)送4個(gè)數(shù)據(jù)包(如圖2所示)献宫。大家可以看到钥平,發(fā)送的數(shù)據(jù)包數(shù)量是4包,收到的也是4包(因?yàn)閷?duì)方主機(jī)收到后會(huì)發(fā)回一個(gè)確認(rèn)收到的數(shù)據(jù)包)姊途。
這充分說(shuō)明了UDP協(xié)議是面向非連接的協(xié)議涉瘾,沒(méi)有建立連接的過(guò)程。正因?yàn)閁DP協(xié)議沒(méi)有連接的過(guò)程吭净,所以它的通信效果高睡汹;但也正因?yàn)槿绱耍目煽啃圆蝗鏣CP協(xié)議高寂殉。QQ就使用UDP發(fā)消息囚巴,因此有時(shí)會(huì)出現(xiàn)收不到消息的情況。
?tcp協(xié)議和udp協(xié)議的差別? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? TCP ? ? ? ? ? ? ? ? ? UDP?
是否連接 ? ? ? ? 面向連接 ? ? ? ? ? ?面向非連接?
傳輸可靠性 ? ? 可靠 ? ? ? ? ? ? ? ? ? ?不可靠
?應(yīng)用場(chǎng)合 ? ? ? ?傳輸大量數(shù)據(jù) ? ? 少量數(shù)據(jù)?
速度 ? ? ? ? ? ? ? ? 慢 ? ? ? ? ? ? ? ? ? ? ? ? 快