簡而言之:
UDP:
UDP是一種面向無連接的用戶數(shù)據(jù)報服務(wù)(user data protocol)赶站,不需要和服務(wù)器也能交互,只需要知道ip和監(jiān)聽端口纺念,不需要鏈接沒有目的的socket贝椿,只是將數(shù)據(jù)報投遞出去,不管接收方是否成功接收到陷谱,因此是一種不可靠的傳輸烙博,可能會造成數(shù)據(jù)丟包,但由于這些特征烟逊,傳輸效率要優(yōu)于TCP渣窜。例如QQ傳輸
TCP:
TCP是一種面向連接的傳輸控制協(xié)議(transform contorl protocol),必須要和服務(wù)器交互,具有高安全性宪躯,可靠性乔宿,需要和服務(wù)器進行三次握手,能根據(jù)具體網(wǎng)絡(luò)擁堵情況進行延時访雪。例如MSN傳輸
TCP/IP實際上是一組協(xié)議详瑞,它包括上百個各種功能的協(xié)議,如:遠程登錄臣缀、文件傳輸和電子郵件等坝橡,而TCP協(xié)議和IP協(xié)議是保證數(shù)據(jù)完整傳輸?shù)膬蓚€基本的重要協(xié)議。通常說TCP/IP是Internet協(xié)議族精置,而不單單是TCP和IP计寇。
Socket:
socket就像是TCP與UDP的外接API。有兩種連接操作方式脂倦,面向連接的(TCP)和面向無連接的(UDP)饲常。使用UDP無需要指定一個socket目的地,而是用TCP必須要指定一個socket目的地狼讨,需要進行預(yù)鏈接贝淤,否則連接不到。
優(yōu)點:
1.傳輸數(shù)據(jù)為字節(jié)級政供,傳輸數(shù)據(jù)可自定義播聪,數(shù)據(jù)量小朽基。相應(yīng)的移動端開發(fā),手機費用低
2.傳輸數(shù)據(jù)時間短离陶,性能高
3.適合C/S之間信息實時交互
4.可以加密稼虎,數(shù)據(jù)安全性高
缺點:
1.需要對傳輸?shù)臄?shù)據(jù)進行解析,轉(zhuǎn)化為應(yīng)用級的數(shù)據(jù)
2.對開發(fā)人員的開發(fā)水平要求高
3.相對于Http協(xié)議傳輸招刨,增加了開發(fā)量
適用場景:
網(wǎng)絡(luò)游戲霎俩,銀行交互,支付沉眶。
HTTP:HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol )打却,是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機聯(lián)網(wǎng)常用的協(xié)議之一谎倔,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用柳击、所以支持HTTP就一定支持TCP傳輸。常見的請求方式有g(shù)et和post片习,web服務(wù)捌肴。
HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng),在請求結(jié)束后藕咏,會主動釋放連接状知。從建立連接到關(guān)閉連接的過程稱為“一次連接”。
優(yōu)點:
1.基于應(yīng)用級的接口使用方便
2.要求的開發(fā)水平不高孽查,容錯性強
缺點:
1.傳輸速度慢试幽,數(shù)據(jù)包大。
2.如實現(xiàn)實時交互卦碾,服務(wù)器性能壓力大
3.數(shù)據(jù)傳輸安全性差
適用場景:
公司OA服務(wù),互聯(lián)網(wǎng)服務(wù)
具體點來講:(以下大部分基于百度百科)
網(wǎng)絡(luò)起宽、由下往上分為
物理層洲胖、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層坯沪、傳輸層绿映、會話層、表示層和應(yīng)用層腐晾。
通過初步的了解叉弦,知道IP協(xié)議對應(yīng)于網(wǎng)絡(luò)層,TCP協(xié)議對應(yīng)于傳輸層藻糖,而 HTTP協(xié)議對應(yīng)于應(yīng)用層淹冰,
三者從本質(zhì)上來說沒有可比性
socket則是對TCP/UDP協(xié)議的封裝和應(yīng)用(程序員層面上)。
也可以說巨柒,TPC/UDP協(xié)議是傳輸層協(xié)議樱拴,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸柠衍,
而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)晶乔。
關(guān)于TCP/IP和HTTP協(xié)議的關(guān)系珍坊,網(wǎng)絡(luò)有一段比較容易理解的介紹:
“我們在傳輸數(shù)據(jù)時,可以只使用(傳輸層)TCP/IP協(xié)議正罢,但是那樣的話阵漏,如果沒有應(yīng)用層,便無法識別數(shù)據(jù)內(nèi)容翻具。
如果想要使傳輸?shù)臄?shù)據(jù)有意義履怯,則必須使用到應(yīng)用層協(xié)議。
應(yīng)用層協(xié)議有很多呛占,比如HTTP虑乖、FTP、TELNET等晾虑,也可以自己定義應(yīng)用層協(xié)議疹味。
CSDN上有個比較形象的描述:
HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機帜篇,提供了網(wǎng)絡(luò)通信的能力糙捺。
實際上,傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的笙隙,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的洪灯,而Socket本身不算是協(xié)議,就像上面所說竟痰,它只是提供了一個針對TCP或者UDP編程的接口签钩。
WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息坏快,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上铅檩。”
實際上莽鸿,Socket跟TCP/IP協(xié)議沒有必然的聯(lián)系昧旨。
Socket編程接口在設(shè)計的時候,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議祥得。
所以說兔沃,Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對TCP/IP協(xié)議的抽象级及,
從而形成了我們知道的一些最基本的函數(shù)接口乒疏,比如create、listen饮焦、connect缰雇、accept入偷、send、read和write等等械哟。
網(wǎng)絡(luò)有一段關(guān)于socket和TCP/IP協(xié)議關(guān)系的說法比較容易理解:
“TCP/IP與UDP只是一個協(xié)議棧疏之,就像操作系統(tǒng)的運行機制一樣,必須要具體實現(xiàn)暇咆,同時還要提供對外的操作接口锋爪。
這個就像操作系統(tǒng)會提供標(biāo)準(zhǔn)的編程接口,比如win32編程接口一樣爸业,
TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口其骄,這就是Socket編程接口〕犊酰”
關(guān)于TCP/IP協(xié)議的相關(guān)只是拯爽,用博大精深來講我想也不為過,單單查一下網(wǎng)上關(guān)于此類只是的資料和書籍文獻的數(shù)量就知道钧忽,
這個我打算會買一些經(jīng)典的書籍(比如《TCP/IP詳解:卷一毯炮、卷二、卷三》)進行學(xué)習(xí)耸黑,今天就先總結(jié)一些基于基于TCP/IP協(xié)議的應(yīng)用和編程接口的知識桃煎,也就是剛才說了很多的HTTP和Socket。
下面是一些經(jīng)常在筆試或者面試中碰到的重要的概念大刊,特在此做摘抄和總結(jié)为迈。
一、什么是TCP連接的三次握手
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器缺菌,并進入SYN_SEND狀態(tài)葫辐,等待服務(wù)器確認;
第二次握手:服務(wù)器收到syn包,必須確認客戶的SYN(ack=j+1)伴郁,同時自己也發(fā)送一個SYN包(syn=k)耿战,即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包蛾绎,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢鸦列,客戶端和服務(wù)器進入ESTABLISHED狀態(tài)租冠,完成三次握手。
握手過程中傳送的包里不包含數(shù)據(jù)薯嗤,三次握手完畢后顽爹,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。
理想狀態(tài)下骆姐,TCP連接一旦建立镜粤,在通信雙方中的任何一方主動關(guān)閉連接之前捏题,TCP 連接都將被一直保持下去。
斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開TCP連接的請求肉渴,斷開過程需要經(jīng)過“四次握手”(過程就不細寫了公荧,就是服務(wù)器和客戶端交互,最終確定斷開)
二同规、TCP和UDP的區(qū)別
1循狰、TCP是面向鏈接的,雖然說網(wǎng)絡(luò)的不安全不穩(wěn)定特性決定了多少次握手都不能保證連接的可靠性券勺,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;
而UDP不是面向連接的绪钥,UDP傳送數(shù)據(jù)前并不與對方建立連接,對接收到的數(shù)據(jù)也不發(fā)送確認信號关炼,發(fā)送端不知道數(shù)據(jù)是否會正確接收程腹,當(dāng)然也不用重發(fā),所以說UDP是無連接的儒拂、不可靠的一種數(shù)據(jù)傳輸協(xié)議寸潦。
2、也正由于1所說的特點侣灶,使得UDP的開銷更小數(shù)據(jù)傳輸速率更高甸祭,因為不必進行收發(fā)數(shù)據(jù)的確認,所以UDP的實時性更好褥影。
知道了TCP和UDP的區(qū)別池户,就不難理解為何采用TCP傳輸協(xié)議的MSN比采用UDP的QQ傳輸文件慢了,但并不能說QQ的通信是不安全的凡怎,
因為程序員可以手動對UDP的數(shù)據(jù)收發(fā)進行驗證校焦,比如發(fā)送方對每個數(shù)據(jù)包進行編號然后由接收方進行驗證啊什么的,
即使是這樣统倒,UDP因為在底層協(xié)議的封裝上沒有采用類似TCP的“三次握手”而實現(xiàn)了TCP所無法達到的傳輸效率寨典。
三、利用Socket建立網(wǎng)絡(luò)連接的步驟
1房匆、服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字耸成,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)浴鸿,等待客戶端的連接請求井氢。
2、客戶端請求:指客戶端的套接字提出連接請求岳链,要連接的目標(biāo)是服務(wù)器端的套接字花竞。
為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字掸哑,指出服務(wù)器端套接字的地址和端口號约急,然后就向服務(wù)器端套接字提出連接請求零远。
3、連接確認:當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時厌蔽,就響應(yīng)客戶端套接字的請求牵辣,建立一個新的線程,把服務(wù)器端
套接字的描述發(fā)給客戶端躺枕,一旦客戶端確認了此描述服猪,雙方就正式建立連接。
而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)拐云,繼續(xù)接收其他客戶端套接字的連接請求罢猪。
建立Socket連接至少需要一對套接字,其中一個運行于客戶端叉瘩,稱為ClientSocket 膳帕,另一個運行于服務(wù)器端,稱為ServerSocket 薇缅。
套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽危彩,客戶端請求,連接確認泳桦。
關(guān)于socket汤徽,筆者并沒有太深入復(fù)雜的使用經(jīng)歷。由于原生socket語法并不是非常友好灸撰,所以使用了ASyncSocket三方庫谒府,它內(nèi)部封裝了TCP/UDP兩種模式文件,使用時根據(jù)需要選擇導(dǎo)入方式即可浮毯。本質(zhì)上來講完疫,是基于建立一個單例Socket管理器,進行連接债蓝,傳輸壳鹤,斷開等一系列操作,非常方便饰迹。
至于XMPP芳誓,XMPP是應(yīng)用層協(xié)議,底層依舊是建立在Socket通信之上啊鸭。
對于ASyncSocket/XMPP的使用方法锹淌。簡言之都是通過單例管理器控制連接狀態(tài)以及傳輸動作,將來有時間再寫吧莉掂。
四葛圃、HTTP鏈接的特點
HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol )千扔,是Web聯(lián)網(wǎng)的基礎(chǔ)憎妙,也是手機聯(lián)網(wǎng)常用的協(xié)議之一库正,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。
HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng)厘唾,在請求結(jié)束后褥符,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”抚垃。
簡單的說喷楣,TCP就是單純建立連接,不涉及任何我們需要請求的實際數(shù)據(jù)鹤树,簡單的傳輸铣焊。
http是用來收發(fā)數(shù)據(jù),即實際應(yīng)用上來的罕伯。
第一:從傳輸層曲伊,先說下TCP連接,我們要和服務(wù)端連接TCP連接追他,需要通過三次連接坟募,包括:請求,確認邑狸,建立連接懈糯。即傳說中的“三次握手協(xié)議”。
簡單就是:請求单雾,確認赚哗,連接。
第二:從實際上的數(shù)據(jù)應(yīng)用來說http:
在前面客戶端和應(yīng)用服務(wù)器建立TCP連接之后铁坎,就需要用http協(xié)議來傳送數(shù)據(jù)了蜂奸,HTTP協(xié)議簡單來說,還是請求硬萍,確認扩所,連接。
總體就是C發(fā)送一個HTTP請求給S朴乖,S收到了這個http請求祖屏,然后返回給Chttp響應(yīng),然后C的中間件或者說瀏覽器把這些數(shù)據(jù)渲染成為了網(wǎng)頁买羞,展示在用戶面前袁勺。
http請求步驟:
第一步:發(fā)送一個http請求給S,這個請求包括請求頭和請求內(nèi)容:
request header(請求頭)包括:
1.請求的方法是POST/GET,請求的URL畜普,http協(xié)議版本
2.請求的數(shù)據(jù)期丰,和編碼方式3是否有cookie和cooies,是否緩存等。
post和get請求方式的區(qū)別:
get把請求內(nèi)容放在URL后面钝荡,但是URL長度有限制街立。而post是以表單的形勢,適合要輸入密碼之類的埠通,因為不在URL中顯示赎离,所以比較安全。
request body(請求體):即請求的內(nèi)容.
第二步:S收到了http請求端辱,然后根據(jù)請求頭梁剔,返回http響應(yīng)。
response header:包括了1.cookies或者sessions2.狀態(tài)碼3.內(nèi)容大小等
response body:即響應(yīng)的內(nèi)容舞蔽,包括荣病,JS什么的。
第三步:C收到了以后渗柿,就由瀏覽器完成一系列的渲染众雷,包括執(zhí)行JS腳本等。