網(wǎng)絡分層
物理層、數(shù)據(jù)鏈路層裹赴、網(wǎng)絡層喜庞、傳輸層、會話層棋返、表示層和應用層延都。
TCP協(xié)議對應于傳輸層,主要解決數(shù)據(jù)如何在網(wǎng)絡中傳輸睛竣。
HTTP協(xié)議是基于TCP協(xié)議的晰房,它對應于應用層,主要解決包裝數(shù)據(jù)和解析射沟。
socket則是對TCP/IP協(xié)議的封裝和應用殊者,是從傳輸層上抽象出來的,采用IP地址加上端口號的形式來標識验夯,并不是真正意義上的網(wǎng)絡協(xié)議猖吴。
TCP連接的三次握手
第一次握手:客戶端發(fā)送syn包(syn=j)到服務器,并進入SYN_SEND狀態(tài)挥转,等待服務器確認;
第二次握手:服務器收到syn包距误,必須確認客戶的SYN(ack=j+1)簸搞,同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包准潭,此時服務器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務器的SYN+ACK包趁俊,向服務器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢刑然,客戶端和服務器進入ESTABLISHED狀態(tài)寺擂,完成三次握手。
HTTP連接
HTTP協(xié)議是基于TCP協(xié)議的泼掠,客戶端向服務器發(fā)起http請求的時候怔软,就需要實現(xiàn)與服務器的TCP連接,三次握手择镇,當請求完數(shù)據(jù)后挡逼,會立即斷開連接。所以Http連接是一種響應式無狀態(tài)的連接腻豌。所謂的無狀態(tài)家坎,是指瀏覽器每次向服務器發(fā)起請求的時候,不是通過一個連接吝梅,而是每次都建立一個新的連接虱疏。如果是一個連接的話,服務器進程中就能保持住這個連接并且在內(nèi)存中記住一些信息狀態(tài)苏携。而每次請求結束后做瞪,連接就關閉,相關的內(nèi)容就釋放了右冻,所以記不住任何狀態(tài)装蓬,成為無狀態(tài)連接。socket
socket是從傳輸層上抽象出來的纱扭,它是一套接口矛物,所以Socket連接可以基于TCP連接,也有可能基于UDP跪但。
Socket 連接,至少需要一對套接字,分為 clientSocket峦萎,serverSocket 連接分為3個步驟:
(1) 服務器監(jiān)聽:服務器并不定位具體客戶端的套接字屡久,而是時刻處于監(jiān)聽狀態(tài);
(2) 客戶端請求:客戶端的套接字要描述它要連接的服務器的套接字爱榔,提供地址和端口號被环,然后向服務器套接字提出連接請求;
(3) 連接確認:當服務器套接字收到客戶端套接字發(fā)來的請求后详幽,就響應客戶端套接字的請求,并建立一個新的線程,把服務器端的套接字的描述發(fā)給客戶端筛欢。一旦客戶端確認了此描述浸锨,就正式建立連接。而服務器套接字繼續(xù)處于監(jiān)聽狀態(tài)版姑,繼續(xù)接收其他客戶端套接字的連接請求.
TCP/UDP的區(qū)別:
1柱搜、TCP是面向連接的,雖然說網(wǎng)絡的不安全不穩(wěn)定特性決定了多少次握手都不能保證連接的可靠性剥险,但TCP的三次握手在最低限度上保證了連接的可靠性;
UDP廣播式數(shù)據(jù)傳輸聪蘸,不是面向連接的,UDP傳送數(shù)據(jù)前并不與對方建立連接表制,對接收到的數(shù)據(jù)也不發(fā)送確認信號健爬,發(fā)送端不知道數(shù)據(jù)是否會正確接收,所以說UDP是無連接的么介、不可靠的一種數(shù)據(jù)傳輸協(xié)議娜遵。
2、使得UDP的開銷更小數(shù)據(jù)傳輸速率更高壤短,因為不必進行收發(fā)數(shù)據(jù)的確認设拟,所以UDP的實時性更好。
socket與HTTP的區(qū)別
socket
優(yōu)點:1.傳輸數(shù)據(jù)為字節(jié)級鸽扁,傳輸數(shù)據(jù)可自定義蒜绽,數(shù)據(jù)量小。
2.傳輸數(shù)據(jù)時間短桶现,性能高
4.可以加密躲雅,數(shù)據(jù)安全性高
缺點: 1.需要對傳輸?shù)臄?shù)據(jù)進行解析,轉化為應用級的數(shù)據(jù)
HTTP
優(yōu)點:1.基于應用級的接口使用方便
2.要求的開發(fā)水平不高骡和,容錯性強
缺點: 1.傳輸速度慢相赁,數(shù)據(jù)包大。
2.如實現(xiàn)實時交互慰于,服務器性能壓力大
3.數(shù)據(jù)傳輸安全性差
實際場景用例:
通過socket連接通訊钮科,socket轉發(fā)消息實現(xiàn)客戶端和服務器端的數(shù)據(jù)交互∑旁客戶端啟動的時候可以先http發(fā)送請求绵脯,拿到某些數(shù)據(jù)(ip或者端口號),再去連接socket休里,后臺的話既有socket,也有http通訊妙黍,這樣就可以不用一直發(fā)送http請求,數(shù)據(jù)可以直接走socket通訊方式可免,再有socket轉發(fā)到php后臺抓于,提交數(shù)據(jù)傳輸?shù)男省?/p>
socket粘包問題:參考https://www.cnblogs.com/QG-whz/p/5537447.html
多個獨立的數(shù)據(jù)包連在一起一次性發(fā)給了客戶端,比如1.aaaa 2. bbbb,兩條數(shù)據(jù)浇借,客戶端收到的是aaaabbbb捉撮,這時候就懵逼了逮刨。
原因:
在客戶端/服務器端都會有一個比較大的數(shù)據(jù)緩沖區(qū),來存放接收的數(shù)據(jù)修己,為了保證能夠完整的接收到數(shù)據(jù)恢总,因此緩沖區(qū)都會設置的比較大,發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去睬愤,造成粘包片仿。
解決方法:
(1). 在發(fā)送/接收消息時尤辱,將消息的長度作為消息的一部分發(fā)送出去,從而接收方可以根據(jù)傳來的長度信息光督,制定相應長度的緩沖區(qū)。
(2). 將發(fā)送的消息的首尾都加上特殊標記符结借。
注:一條數(shù)據(jù)可以包頭(加鹽處理的某些字符串)+包體長達+CMD+包體內(nèi)容
看這篇:https://item.jd.com/100004310948.html
- 增加備用網(wǎng)絡連接路線。當某些ip遭受惡意攻擊或者出現(xiàn)網(wǎng)絡波動的情況下咖熟,嘗試連接其他Ip路線。