可以再去回顧一下我之前做的筆記:TCP、HTTP、Socket :https://www.cnblogs.com/xtxt1127/p/12341530.html
今天做項目不知道把原來的http協議改為tcp協議有什么區別,會不會http效率更高一點哇,
於是我百度了一下 “tcp和http哪個傳輸效率高” 這個問題,發現這個問題真是個問題問題,鬧笑話了。。
1.兩個不同層面的協議無法比較。
HTTP是應用層的協議,TCP是傳輸層協議,IP是網絡層協議,本質上沒有可比性。
2.何況HTTP協議是基於TCP連接的。
這個比較就好像要比較飛機上的人的速度快還是飛機的速度快一樣。人在飛機上,受飛機速度影響,HTTP就好比人,TCP就好比飛機。
人在飛機上跑,那人就比飛機快。哈哈,說笑的
3.還有人說,
局網tcp/ip 快,廣網http 快。(不知道正確與否)
通俗的說,
TCP /IP協議就是搬運工,保證搬動的東西不被損壞
保證連接的可靠性,我不管發出任何東西給你,都要有這一套協議來保證不丟包
比如說TCP協議就是這樣,無論上層讓他傳啥數據,他都通過與IP協議的操作,把這些東西分段,然后輸送,同時保證在這個過程中,數據不會丟,如果丟了一塊,他還得想辦法重新傳一次。
http協議是做業務的,用來決定要不要搬運,以及如何搬運,從哪去搬運
http里面規定了我們訪問網頁的時候如何進行緩存,以及請求什么格式。等等,主要是為了讓人們訪問網頁的時候更快,更安全,而規定了很多參數。
那HTTP和TCP分別代表了什么呢?
HTTP的責任是去定義數據,在兩台計算機相互傳遞信息時,HTTP規定了每段數據以什么形式表達才是能夠被另外一台計算機理解。
而TCP所要規定的是數據應該怎么傳輸才能穩定且高效的傳遞與計算機之間。
HTTP的核心概念
除了HTTP存在於應用層之外,該協議還有5個特點。
1. HTTP的標准建立在將兩台計算機視為不同的角色:客戶端和服務器。客戶端會向服務器傳送不同的請求(request),而服務器會對應每個請求給出回應(response)。
2. HTTP屬於無狀態協議(Stateless)。這表示每一個請求之間是沒有相關性的。在該協議的規則中服務器是不會記錄任何客戶端操作,每一次請求都是獨立的。(記錄用戶瀏覽行為會通過其他技術實現)
3. 客戶端的請求被定義在幾個動詞意義范圍內。最長用到的是GET和POST,其他動詞還包括DELETE, HEAD等等。
4. 服務器的回應被定義在幾個狀態碼之間:5開頭表示服務器錯誤,4開頭表示客戶端錯誤,3開頭表示需要做進一步處理,2開頭表示成功,1開頭表示在請求被接受處理的同時提供的額外信息。
5. 不管是客戶端的請求信息還是服務器的回應,雙方都擁有一塊頭部信息(Header)。頭部信息是自定義,其用途在於傳遞額外信息(瀏覽器信息、請求的內容類型、相應的語言)。
TCP的核心概念
在HTTP的規范內,兩台計算機的交互被視為request和response的傳遞。而在實際的TCP操作中,信息傳遞會比單純的傳遞request和response要復雜。通過TCP建立的通訊往往需要計算機之間多次的交換信息才能完成一次request或response。
TCP的傳輸數據的核心是在於將數據分為若干段並將每段數據按順序標記。標記后的順序可以以不同的順序被另一方接收並集成回完整的數據。計算機對每一段數據的成功接收都會做出相應,確保所有數據的完整性。
TCP在傳遞數據時依賴於實現定義好的幾個標記(Flags)去向另一方表態傳達數據和連接的狀態:
* F : FIN - 結束; 結束會話
* S : SYN - 同步; 表示開始會話請求
* R : RST - 復位;中斷一個連接
* P : PUSH - 推送; 數據包立即發送
* A : ACK - 應答
* U : URG - 緊急
* E : ECE - 顯式擁塞提醒回應
* W : CWR - 擁塞窗口減少
也是基於這些標志TCP可以實現三次(three ways handshake)和四次握手 (four ways tear down)。三次握手是初步建立連接的機制,而四次握手則是斷開鏈接。兩者之間大致操作是一樣的,A發出建立鏈接(SYN)或者斷開鏈接(FIN)的請求,B認可(ACK)其請求然后發出同樣的請求給A並等待A的認可。在雙方認可后,鏈接正式成立或者斷開。
這里有兩個問題:
1. 為什么A發出請求並且得到認可后B還有重復同樣的動作?
在建立連接的過程中SYN標記代表的是一個隨機序列號,因為當文件被切斷的時候並不是從0或者1開始標記每段的順序,所以雙方都需要通過傳遞SYN來告知文件片段的第一個序列是多少號。
2. 為什么同樣的機制,建立鏈接和斷開鏈接需要握手的次數不同?
三次和四次握手的區別在於,在建立連接時,B的ACK和SYN會一起發送回A,而在斷開鏈接時因為B發送ACK之后還要做其他處理后才能返回FIN,,因此將兩步拆開。
————————————————
摘自:https://blog.csdn.net/weixin_40784198/article/details/81434530
