一、OSI 網(wǎng)絡(luò)七層模型
第一層:應(yīng)用層,定義了用于在網(wǎng)絡(luò)中進(jìn)行通信和傳輸數(shù)據(jù)的接口;(Http協(xié)議位于該層)
第二層:表示層,定義不同系統(tǒng)中數(shù)據(jù)的傳輸格式,編碼和解碼規(guī)范等;
第三層:會(huì)話(huà)層,管理用戶(hù)的會(huì)話(huà),控制用戶(hù)間邏輯連接的建立和中斷;
第四層:傳輸層,管理著網(wǎng)絡(luò)中端到端的數(shù)據(jù)傳輸;(Tcp協(xié)議位于該層)
第五層:網(wǎng)絡(luò)層,定義網(wǎng)絡(luò)設(shè)備間如何傳輸數(shù)據(jù);(IP位于該層)
第六層:鏈路層,將上面的網(wǎng)絡(luò)層的數(shù)據(jù)包封裝成數(shù)據(jù)幀,便于物理層傳輸;
第七層:物理層,這一層主要就是傳輸這些二進(jìn)制數(shù)據(jù)。
二、TCP連接
建立起一個(gè)TCP連接需要經(jīng)過(guò)“三次握手”:
- 第一次握手:客戶(hù)端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
- 第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶(hù)的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
- 第三次握手:客戶(hù)端收到服務(wù)器的SYN ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶(hù)端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP 連接都將被一直保持下去。斷開(kāi)連接時(shí)服務(wù)器和客戶(hù)端均可以主動(dòng)發(fā)起斷開(kāi)TCP連接的請(qǐng)求。
SYN攻擊就是利用三次握手的第二次握手時(shí)進(jìn)行的,這時(shí)候服務(wù)器處于SYN_RECV狀態(tài),等待客戶(hù)端進(jìn)行確認(rèn)ACK,SYN會(huì)偽造不存在的源IP,就會(huì)有大量的鏈接處于等待或重試發(fā)送SYN+ACK包,導(dǎo)致該階段隊(duì)列持續(xù)增長(zhǎng),進(jìn)而導(dǎo)致后續(xù)正常請(qǐng)求被丟棄。
三、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)是客戶(hù)端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng),在請(qǐng)求結(jié)束后,會(huì)主動(dòng)釋放連接。從建立連接到關(guān)閉連接的過(guò)程稱(chēng)為“一次連接”。
由于HTTP在每次請(qǐng)求結(jié)束后都會(huì)主動(dòng)釋放連接,因此HTTP連接是一種“短連接”。
要保持客戶(hù)端程序的在線(xiàn)狀態(tài),需要不斷地向服務(wù)器發(fā)起連接請(qǐng)求,通常情況下即使不需要獲得任何數(shù)據(jù),客戶(hù)端也保持每隔一段固定的時(shí)間向服務(wù)器發(fā)送一次“保持連接”的請(qǐng)求,服務(wù)器在收到該請(qǐng)求后對(duì)客戶(hù)端進(jìn)行回復(fù),表明知道客戶(hù)端“在線(xiàn)”。若服務(wù)器長(zhǎng)時(shí)間無(wú)法收到客戶(hù)端的請(qǐng)求,則認(rèn)為客戶(hù)端“下線(xiàn)”,若客戶(hù)端長(zhǎng)時(shí)間無(wú)法收到服務(wù)器的回復(fù),則認(rèn)為網(wǎng)絡(luò)已經(jīng)斷開(kāi)。
四、SOCKET連接與HTTP連接
通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開(kāi)始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開(kāi)。但在實(shí)際網(wǎng)絡(luò)應(yīng)用中,客戶(hù)端到服務(wù)器之間的通信往往需要穿越多個(gè)中間節(jié)點(diǎn),例如路由器、網(wǎng)關(guān)、防火墻等,大部分防火墻默認(rèn)會(huì)關(guān)閉長(zhǎng)時(shí)間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連,因此需要通過(guò)輪詢(xún)告訴網(wǎng)絡(luò),該連接處于活躍狀態(tài)。
而HTTP連接使用的是“請(qǐng)求—響應(yīng)”的方式,不僅在請(qǐng)求時(shí)需要先建立連接,而且需要客戶(hù)端向服務(wù)器發(fā)出請(qǐng)求后,服務(wù)器端才能回復(fù)數(shù)據(jù)。
很多情況下,需要服務(wù)器端主動(dòng)向客戶(hù)端推送數(shù)據(jù),保持客戶(hù)端與服務(wù)器數(shù)據(jù)的實(shí)時(shí)與同步。此時(shí)若雙方建立的是Socket連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶(hù)端;若雙方建立的是HTTP連接,則服務(wù)器需要等到客戶(hù)端發(fā)送一次請(qǐng)求后才能將數(shù)據(jù)傳回給客戶(hù)端,因此,客戶(hù)端定時(shí)向服務(wù)器端發(fā)送連接請(qǐng)求,不僅可以保持在線(xiàn),同時(shí)也是在“詢(xún)問(wèn)”服務(wù)器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶(hù)端。
相關(guān)視頻推薦
看完《tcp/ip詳解》不能coding的,一次課開(kāi)啟設(shè)計(jì)tcp/ip協(xié)議棧
深入聊聊websocket協(xié)議,tcp分包與粘包解決方案
學(xué)習(xí)地址:C/C++Linux服務(wù)器開(kāi)發(fā)/后臺(tái)架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂
需要C/C++ Linux服務(wù)器架構(gòu)師學(xué)習(xí)資料加qun812855908獲?。ㄙY料包括C/C++,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg等),免費(fèi)分享
五、SOCKET連接與TCP/IP連接
創(chuàng)建Socket連接時(shí),可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí),該Socket連接就是一個(gè)TCP連接。
socket則是對(duì)TCP/IP協(xié)議的封裝和應(yīng)用(程序員層面上)。也可以說(shuō),TPC/IP協(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ù)時(shí),可以只使用(傳輸層)TCP/IP協(xié)議,但是那樣的話(huà),如果沒(méi)有應(yīng)用層,便無(wú)法識(shí)別數(shù)據(jù)內(nèi)容,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議,應(yīng)用層協(xié)議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應(yīng)用層協(xié)議。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上。
平時(shí)說(shuō)的最多的socket是什么呢,實(shí)際上socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過(guò)Socket,才能使用TCP/IP協(xié)議。
實(shí)際上,Socket跟TCP/IP協(xié)議沒(méi)有必然的聯(lián)系。Socket編程接口在設(shè)計(jì)的時(shí)候,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議。所以說(shuō),Socket的出現(xiàn) 只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對(duì)TCP/IP協(xié)議的抽象,從而形成了一些最基本的函數(shù)接口,比如create、 listen、connect、accept、send、read和write等等。
TCP/IP只是一個(gè)協(xié)議棧,就像操作系統(tǒng)的運(yùn)行機(jī)制一樣,必須要具體實(shí)現(xiàn),同時(shí)還要提供對(duì)外的操作接口。這個(gè)就像操作系統(tǒng)會(huì)提供標(biāo)準(zhǔn)的編程接口,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口。
實(shí)際上,傳輸層TCP是基于網(wǎng)絡(luò)層IP協(xié)議的,而應(yīng)用層HTTP協(xié)議又是基于傳輸層TCP協(xié)議的,而Socket本身不算是協(xié)議,就像上面所說(shuō),它只是提供了一個(gè)針對(duì)TCP或者UDP編程的接口。
總結(jié):
- HTTP是應(yīng)用層協(xié)議,定義的是傳輸數(shù)據(jù)的內(nèi)容以及格式的規(guī)范。
- TCP是底層通訊協(xié)議,定義的是數(shù)據(jù)傳輸和連接方式的規(guī)范。
- Socket可以支持不同的傳輸層協(xié)議(TCP/UDP),當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí),該Socket連接就是一個(gè)TCP連接,Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力
六、什么是單工、半雙工、全雙工通信?
- 單工:信息只能單向傳送;
- 半雙工:信息能雙向傳送但不能同時(shí)雙向傳送;
- 全雙工:信息能夠同時(shí)雙向傳送。
七、WebSocket與Socket的關(guān)系
Socket其實(shí)并不是一個(gè)協(xié)議,而是為了方便使用TCP/UDP而抽象出來(lái)的一層,是位于應(yīng)用層和傳輸控制層之間的一組接口。
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口,提供一套調(diào)用TCP/IP協(xié)議的API。在設(shè)計(jì)模式中,Socket其實(shí)就是一個(gè)門(mén)面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對(duì)用戶(hù)來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
當(dāng)兩臺(tái)主機(jī)通信時(shí),必須通過(guò)Socket連接,Socket則利用TCP/IP協(xié)議建立TCP連接。TCP連接則更依靠于底層的IP協(xié)議,IP協(xié)議的連接則依賴(lài)于鏈路層等更低層次。
WebSocket就像HTTP一樣,是一個(gè)典型的應(yīng)用層協(xié)議。
總結(jié):
- Socket是傳輸控制層接口,WebSocket是應(yīng)用層協(xié)議。
八、WebSocket與HTTP的關(guān)系
WebSocket是HTML5規(guī)范提出的一種協(xié)議。HTML5 Web Sockets規(guī)范定義了Web Sockets API,支持頁(yè)面使用Web Socket協(xié)議與遠(yuǎn)程主機(jī)進(jìn)行全雙工的通信。它引入了WebSocket接口并且定義了一個(gè)全雙工的通信通道,通過(guò)一個(gè)單一的套接字在Web上進(jìn)行操作。
HTML5 Web Sockets以最小的開(kāi)銷(xiāo)高效地提供了Web連接。相較于經(jīng)常需要使用推送實(shí)時(shí)數(shù)據(jù)到客戶(hù)端甚至通過(guò)維護(hù)兩個(gè)HTTP連接來(lái)模擬全雙工連接的舊的輪詢(xún)或長(zhǎng)輪詢(xún)(Comet)來(lái)說(shuō),這就極大的減少了不必要的網(wǎng)絡(luò)流量與延遲。
相同點(diǎn):
- 都是一樣基于TCP的,都是可靠性傳輸協(xié)議。
- 都是應(yīng)用層協(xié)議。
不同點(diǎn):
- WebSocket是雙向通信協(xié)議,模擬Socket協(xié)議,可以雙向發(fā)送或接受信息。HTTP是單向的。
- WebSocket是需要瀏覽器和服務(wù)器握手進(jìn)行建立連接的。而http是瀏覽器發(fā)起向服務(wù)器的連接,服務(wù)器預(yù)先并不知道這個(gè)連接。
聯(lián)系:
- WebSocket在建立握手時(shí),數(shù)據(jù)是通過(guò)HTTP傳輸?shù)?。但是建立之后,在真正傳輸時(shí)候是不需要HTTP協(xié)議的。
WebSocket連接的過(guò)程:
總結(jié):
- 在WebSocket中,只需要服務(wù)器和瀏覽器通過(guò)HTTP協(xié)議進(jìn)行一個(gè)握手的動(dòng)作,然后單獨(dú)建立一條TCP通信通道進(jìn)行數(shù)據(jù)傳送。