一、前言
? ? ? ? ?以下是我自己的學(xué)習(xí)加理解,分享給大家,同時也算是自己做的筆記吧,俗話說好記性不如爛筆頭,希望來的你能有所幫助,有什么理解不到位的地方,還請大神些多多指教。
二、網(wǎng)絡(luò)模型
? ?OSI 七層模型:我們一般使用的網(wǎng)絡(luò)數(shù)據(jù)傳輸由下而上共有七層,分別為物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層。

TCP/IP模型:TCP/IP 模型分為四層,由下而上分別為網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層。

三、概念
? ?短連接:
? ?連接 -> 傳輸數(shù)據(jù)->關(guān)閉連接。就建立一次,但任務(wù)結(jié)束就中斷連接。?
? 長連接:
? ? 連接 -> 傳輸數(shù)據(jù) -> 保持連接 -> 傳輸數(shù)據(jù)。。。-> 關(guān)閉連接。是指連接后不管是否使用都保持連接,但安全性較差。
? 長連接、短連接用法:
? ? ? ? ?長連接多用于操作頻繁,點對點的通訊,而且連接數(shù)不能太多的情況下。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理 速度會降低很多,所以每個操作完后都不斷開,次處理時直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。例如:數(shù)據(jù)庫的連接用長連接, 如果用短連接頻繁的通信會造成Socket錯誤,而且頻繁的Socket創(chuàng)建也是對資源的浪費。
? ? ? ? 而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因為長連接對于服務(wù)端來說會耗費一定的資源,而像WEB網(wǎng)站這么頻繁的成千上萬甚至上億客戶端的連接用短連接 會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。所以并發(fā)量大,但每個用戶無需頻繁操作情況下 需用短連好。
總之,長連接和短連接的選擇要視情況而定。
HTTP
http連接:
http協(xié)議即超文本傳送協(xié)議,是web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用協(xié)議之一,http協(xié)議是建立在tcp協(xié)議之上的一種應(yīng)用。
? ? ? ? ? http連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng),在請求結(jié)束后,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”。
? ? ? ?1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。
? ? ? ? 2)在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進(jìn)行,不需要等待一個請求結(jié)束后再發(fā)送下一個請求。
? ? ? ?由于http在每次請求結(jié)束后都會主動釋放連接,因此http連接是“短連接”。要保持客戶端程序的在線狀態(tài),需要不斷地向服務(wù)器發(fā)起連接請求。通常的 做法是即時不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務(wù)器發(fā)送一次“保持連接”的請求,服務(wù)器在收到該請求后對客戶端進(jìn)行回復(fù),表明知道客 戶端“在線”。若服務(wù)器長時間無法收到客戶端的請求,則認(rèn)為客戶端“下線”,若客戶端長時間無法收到服務(wù)器的回復(fù),則認(rèn)為網(wǎng)絡(luò)已經(jīng)斷開。
Socket
? ? ? ?套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。
? ? ? ? 應(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ī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應(yīng)用層可以和傳輸層通過Socket接口,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。

建立socket連接
? ? ? ? ? ? 建立 Socket 連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket,另一個運行于服務(wù)器端,稱為ServerSocket。
? ? ? ? ? ? 套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)。
? ? ? ? ? ? ?服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(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ù)接收其他客戶端套接字的連接請求。
Socket連接與TCP連接
? ? ? ? ? ? ? ? 創(chuàng)建Socket連接時,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當(dāng)使用TCP協(xié)議進(jìn)行連接時,該Socket連接就是一個TCP連接。
Socket連接與HTTP連接
? ? ? ? ? ? ? ? ?由于通常情況下 Socket 連接就是TCP連接,因此 Socket 連接一旦建立,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開。但在實際網(wǎng)絡(luò)應(yīng)用中,客戶端到服務(wù)器之間的通信往往需要穿越多個中間節(jié)點,例如路由器、網(wǎng)關(guān)、防火墻等,大部分防火墻默認(rèn)會關(guān)閉長時間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連,因此需要通過輪詢告訴網(wǎng)絡(luò),該連接處于活躍狀態(tài)。
? ? ? ? ? ? ? ? ?而HTTP連接使用的是“請求—響應(yīng)”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務(wù)器發(fā)出請求后,服務(wù)器端才能回復(fù)數(shù)據(jù)。
? ? ? ? ? ? ? ? ?很多情況下,需要服務(wù)器端主動向客戶端推送數(shù)據(jù),保持客戶端與服務(wù)器數(shù)據(jù)的實時與同步。此時若雙方建立的是Socket連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給 客戶端;若雙方建立的是HTTP連接,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端,因此,客戶端定時向服務(wù)器端發(fā)送連接請求,不僅可以保持在線,同時也是在“詢問”服務(wù)器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端。
TCP與UDP的區(qū)別
? ? ? ? ? TCP:面向連接、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)、用于傳輸大量數(shù)據(jù)(流模式)、速度慢,建立連接需要開銷較多(時間,系統(tǒng)資源)。
? ? ? ? ? UDP:面向非連接、傳輸不可靠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)、速度快。
TCP三次握手:指建立一個TCP連接時,需要客戶端和服務(wù)器總共發(fā)送3個包。
? ? ? ? ? 第一次握手:客戶端發(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。

QQ、微信為什么是UDP而不是TCP:
? ? ? ? ? ?像騰訊QQ之類的大規(guī)模即時通訊軟件,經(jīng)常性的是幾千萬用戶同時在線 如果都采用長連接的方式。豈不是要服務(wù)器的硬件防火墻監(jiān)控數(shù)千萬個連接了,就算分布式服務(wù)端能承受這么多用戶 網(wǎng)關(guān)也受不了,而且有理由相信服務(wù)器也受不了 。所以對于大規(guī)模即時通訊,尤其是用戶數(shù)量眾多 肯定不能用TCP常連接的方式,這種方式只適合于小規(guī)模的即時通訊,如局域網(wǎng),公司內(nèi)部的即時通訊等 對于大規(guī)模的,用戶數(shù)量眾多的C/S軟件 應(yīng)當(dāng)采用UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸,網(wǎng)關(guān)就不停收發(fā)數(shù)據(jù)包就可以了。?
? ? ? ? ? ?使用TCP協(xié)議和客戶端進(jìn)行短命連接,用了就關(guān) 比如客戶登陸請求好友列表,我們就和他建立TCP連接發(fā)給他好友列表,然后關(guān)掉連接 當(dāng)用戶要給另外一個客戶發(fā)信心我們再建立連接,數(shù)據(jù)傳完我們又關(guān)掉連接 這種方式,無疑服務(wù)器可以承載更多的用戶登陸。但是缺點也是非常明顯的 一般情況下我們接收的數(shù)據(jù)都不大,每次發(fā)一點點消息都要建立連接 TCP本來就比較消耗網(wǎng)絡(luò)資源,這樣毫無規(guī)律的斷斷連連 連連斷斷,加上本來這種方式就有較高的延遲 也不適合大規(guī)模的即時通訊
? ? ? ? ? ?事實上,在Internet上傳輸?shù)腢DP包從A發(fā)送給B 它完整地到達(dá)幾率一般情況下還是相當(dāng)之高的。我們開發(fā)一個多用戶的即時通訊軟件 采用UDP傳輸消息的時候,報文被劃分成包 一個UDP包究竟是多大?經(jīng)過我的了解一個UDP用戶包最大大小是64KB 根據(jù)網(wǎng)絡(luò)狀況,實際在傳輸包的時候可能把包劃成若干個分片 一個分片的最大大小是1640B 可以保存好幾百個漢字。UDP協(xié)議提供數(shù)據(jù)報機(jī)制傳輸信息 如果報文比較長,比如一個文件,一個圖片 要被劃分成若干個數(shù)據(jù)包,由于對于一般的文字消息和其它指令都是比較小的 它們會被放在一個包里面,由于UDP是無連接的 不可靠的,如果發(fā)生丟包,不會重傳 所以不能保證數(shù)據(jù)包能完整并準(zhǔn)確地到達(dá)目的地,但是對于我們的即時通訊軟件來說 一般的聊天信息比較小,比如我們給一個好友發(fā)送一條聊天信息“今天我很高興”,會不會服務(wù)器轉(zhuǎn)發(fā)的時候只收到“今天我很高”,再傳給好友的時候變成了“今天”,答案是不會發(fā)生這種情況的 UDP雖然描述是不可靠,不過依然在數(shù)據(jù)包中包含了頭信息描述了包的大小等信息,在包進(jìn)行轉(zhuǎn)發(fā)的過程中 如果數(shù)據(jù)不完整,是會被網(wǎng)絡(luò)設(shè)備發(fā)現(xiàn)的,比如中途一個轉(zhuǎn)發(fā)這個包的路由器發(fā)現(xiàn)了一個不完整的UDP包會直接丟棄,如果是TCP 當(dāng)有包被丟棄了會進(jìn)行重傳,對于UDP 包在傳輸過程中由于數(shù)據(jù)的缺失被丟棄不會進(jìn)行重傳 我們頂多就是一條信息發(fā)送失敗了,而這種概率一般情況下是非常低的 。
開發(fā)時到底選擇TCP還是UDP:
? ? ? ? 如果是由客戶端間歇性的發(fā)起無狀態(tài)的查詢,并且偶爾發(fā)生延遲是可以容忍,那么使用HTTP/HTTPS吧。
? ? ? ? 如果客戶端和服務(wù)器都可以獨立發(fā)包,但是偶爾發(fā)生延遲可以容忍(比如:在線的紙牌游戲,許多MMO類的游戲),那么使用TCP長連接吧。
? ? ? ? 如果客戶端和服務(wù)器都可以獨立發(fā)包,而且無法忍受延遲(比如:大多數(shù)的多人動作類游戲,一些MMO類游戲),那么使用UDP吧。
基本TCP客戶—服務(wù)器程序設(shè)計基本框架

基本UDP客戶—服務(wù)器程序設(shè)計基本框架流程圖

總結(jié)
? ? 其中知識還有很多,我只是寫出了我暫時的理解,班門弄斧,見笑。雙擊666,老鐵沒毛病,哈哈哈。