http 是應(yīng)用層協(xié)議右蹦,主要解決如何包裝數(shù)據(jù)舍败。
TCP/UDP是傳輸層協(xié)議涌攻,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸贞远。
Socket:是在應(yīng)用層和傳輸層之間的一個抽象層铝穷,它把TCP/IP層復(fù)雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信鹦马。
它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示忙干,包含進(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ù)通信時乾蓬,TCP會遇到同時為多個應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題惠啄。多個TCP連接或多個應(yīng)用程序進(jìn)程可能需要通過同一個 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ù)姥闭。
套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求越走,連接確認(rèn)棚品。
? ? ? ? ? ? ?服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài)廊敌,實(shí)時監(jiān)控網(wǎng)絡(luò)狀態(tài)铜跑,等待客戶端的連接請求。
? ? ? ? ? ? ?客戶端請求:指客戶端的套接字提出連接請求骡澈,要連接的目標(biāo)是服務(wù)器端的套接字锅纺。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字肋殴,指出服務(wù)器端套接字的地址和端口號囤锉,然后就向服務(wù)器端套接字提出連接請求。
? ? ? ? ? ? ?連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時护锤,就響應(yīng)客戶端套接字的請求官地,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端烙懦,一旦客戶端確認(rèn)了此描述驱入,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)氯析,繼續(xù)接收其他客戶端套接字的連接請求亏较。
?TCP:面向連接、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)掩缓、用于傳輸大量數(shù)據(jù)(流模式)宴杀、速度慢,建立連接需要開銷較多(時間拾因,系統(tǒng)資源)。
UDP:面向非連接、傳輸不可靠绢记、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)扁达、速度快。
開發(fā)時到底選擇TCP還是UDP? ? ? ? ?
?如果是由客戶端間歇性的發(fā)起無狀態(tài)的查詢蠢熄,并且偶爾發(fā)生延遲是可以容忍跪解,那么使用HTTP/HTTPS吧。 ? ? ? ?
?如果客戶端和服務(wù)器都可以獨(dú)立發(fā)包签孔,但是偶爾發(fā)生延遲可以容忍(比如:在線的紙牌游戲叉讥,許多MMO類的游戲),那么使用TCP長連接吧饥追。 ? ? ??
?如果客戶端和服務(wù)器都可以獨(dú)立發(fā)包图仓,而且無法忍受延遲(比如:大多數(shù)的多人動作類游戲,一些MMO類游戲)但绕,那么使用UDP吧救崔。
TCP三次握手建立連接
(關(guān)鍵字SYN(建立聯(lián)機(jī) Synchronize Sequence Numbers確認(rèn)鏈接序號) 、 ACK(確認(rèn) acknowledgement character 確認(rèn)字符))
? 第一次握手:客戶端發(fā)送一個TCP的SYN標(biāo)志位置1的包指明客戶打算連接的服務(wù)器的端口捏顺,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里六孵。
?第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時幅骄,將確認(rèn)序號(Acknowledgement Number)設(shè)置為客戶的序列號加1以劫窒,即X+1。
?第三次握手:客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0拆座,ACK標(biāo)志位為1主巍。并且把服務(wù)器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫序列號的+1懂拾。
TCP四次揮手?jǐn)嚅_連接
1煤禽、在整個通信的過程中,誰先發(fā)起請求岖赋,誰就是客戶端檬果。
當(dāng)客戶端的數(shù)據(jù)傳輸?shù)轿膊繒r,客戶端向服務(wù)器發(fā)送帶有FIN標(biāo)志的數(shù)據(jù)包唐断,使其明白自己準(zhǔn)備斷開通信了选脊。
2、因?yàn)門CP的通信是使用全雙工通信的WebSocket脸甘,所以在斷開連接的時候也應(yīng)該是雙向的恳啥;當(dāng)服務(wù)器收到帶有FIN標(biāo)志的數(shù)據(jù)包時,其必不會直接發(fā)送FIN標(biāo)志斷開通信的請求丹诀,而是先發(fā)送一個帶有ACK標(biāo)志的應(yīng)答信息钝的,使客戶端明白服務(wù)器還有數(shù)據(jù)要進(jìn)行發(fā)送翁垂。
3、當(dāng) 服務(wù)器的數(shù)據(jù)發(fā)送完成后硝桩,向客戶端發(fā)送帶有FIN標(biāo)志的數(shù)據(jù)包沿猜,通知客戶端斷開連接。
4碗脊、當(dāng)客戶端收到FIN后啼肩,擔(dān)心網(wǎng)絡(luò)上某些不可控制的因素導(dǎo)致服務(wù)器不知道他要斷開連接,會發(fā)送ACK進(jìn)行確認(rèn)衙伶,同時把自己設(shè)置成TIME_WAIT狀態(tài)并啟動定時器祈坠,**在TCP的定時器到達(dá)后客戶端并沒有接收到請求,會重新發(fā)送矢劲;當(dāng)服務(wù)器收到請求后就斷開連接赦拘;當(dāng)客戶端等待2MLS(兩倍報文最大生存時間)后,沒有收到請求重傳的請求后卧须,客戶端這邊就斷開連接另绩,**整個TCP通信就結(jié)束了。
三次握手為什么不能改成兩次握手花嘶?
解:三次握手中的每一次都是必須的笋籽。如果是兩次握手,在第二次結(jié)束后椭员,服務(wù)器并不能保證客戶端已經(jīng)收到了第二次的請求车海,如此一來的話,服務(wù)器會一直保存著這個通信過程隘击,因?yàn)門CP通信都是要占用端口的侍芝,造成了一定的資源浪費(fèi)。所以埋同,就一定要讓客戶端來發(fā)送ACK的確認(rèn)請求州叠。
為什么不是4次?
因?yàn)?次之后就能保證客服端能收到服務(wù)器端的消息凶赁,服務(wù)器端能收到客服端的消息咧栗,4次造成時間和資源的浪費(fèi)。
如果兩次虱肄,那么B無法確定B的信息A是否能收到致板,所以如果B先說話,可能后面的A都收不到咏窿,會出現(xiàn)問題 斟或。如果四次,那么就造成了浪費(fèi)集嵌,因?yàn)樵谌谓Y(jié)束之后萝挤,就已經(jīng)可以保證A可以給B發(fā)信息御毅,A可以收到B的信息; B可以給A發(fā)信息平斩,B可以收到A的信息亚享。
關(guān)閉的時候?yàn)槭裁磿撬拇螕]手?
解:四次揮手不能像三次握手一樣绘面,三次握手可以將ACK+SYN 一起發(fā)送,ACK用于確認(rèn)信息侈沪,SYN卻是用來建立聯(lián)機(jī)的揭璃;四次揮手中ACK是不能和FIN一起發(fā)送,ACK只是告訴客戶端確認(rèn)我收到了亭罪,等我將數(shù)據(jù)發(fā)送完畢之后會向其發(fā)送FIN的標(biāo)志瘦馍,所以四次揮手是不能夠改變的。
http鏈接和socket鏈接的區(qū)別?
短連接:
? ?連接 -> 傳輸數(shù)據(jù)->關(guān)閉連接应役。就建立一次情组,但任務(wù)結(jié)束就中斷連接。?
?長連接:
? ? 連接 -> 傳輸數(shù)據(jù) -> 保持連接 -> 傳輸數(shù)據(jù)箩祥。院崇。。-> 關(guān)閉連接袍祖。是指連接后不管是否使用都保持連接底瓣,但安全性較差。
Http連接:http連接就是所謂的短連接蕉陋,即客戶端向服務(wù)器端發(fā)送一次請求捐凭,服務(wù)器端響應(yīng)后連接即會斷掉;?socket連接:socket連接就是所謂的長連接凳鬓,理論上客戶端和服務(wù)器端一旦建立起連接將不會主動斷掉茁肠;但是由于各種環(huán)境因素可能會是連接斷開,比如說:服務(wù)器端或客戶端主機(jī)down了缩举,網(wǎng)絡(luò)故障垦梆,或者兩者之間長時間沒有數(shù)據(jù)傳輸,網(wǎng)絡(luò)防火墻可能會斷開該連接以釋放網(wǎng)絡(luò)資源蚁孔。所以當(dāng)一個socket連接中沒有數(shù)據(jù)的傳輸奶赔,那么為了維持連接需要發(fā)送心跳消息~~具體心跳消息格式是開發(fā)者自己定義的.