前言
先來介紹下這哥倆吧滤否,他們可不是對等的協(xié)議(P: protocol)哦
- TCP:(Transmission Control Protocol) 傳輸控制協(xié)議驹饺。應(yīng)該知道了吧钳枕,這是 OSI 七層架構(gòu)中傳輸層上的協(xié)議,比較著名的是 TCP 建立連接的三次握手赏壹,以及斷開連接的四次揮手鱼炒,后文將做介紹。設(shè)備能夠使用聯(lián)網(wǎng)功能是因為設(shè)備底層實現(xiàn)了TCP/IP協(xié)議蝌借,可以使設(shè)備通過無線網(wǎng)絡(luò)建立TCP連接昔瞧。TCP協(xié)議可以對上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡(luò)之上菩佑。
- HTTP:(Hyper Text Transport Protocol) 超文本傳輸協(xié)議自晰。這個家伙呢,是應(yīng)用層協(xié)議擎鸠,是Web聯(lián)網(wǎng)的基礎(chǔ)缀磕,也是設(shè)備聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng)袜蚕,在請求結(jié)束后糟把,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”牲剃。
所以他們可不是平起平坐的哥們倆遣疯,接下來讓我們好好聊聊他們吧。
TCP
談到 TCP 協(xié)議大部分人立馬就想到了與它形影不離的哥們 UDP 凿傅,這倆家伙倒是一家子缠犀,都是傳輸層協(xié)議,TCP 安全聪舒,但是效率低辨液,UDP 廣播的模式,不安全箱残,可是速度快啊滔迈,而且經(jīng)濟(jì),所以 QQ 早期就是完全依賴 UDP 實現(xiàn)的被辑,感興趣的可以上知乎看看前因后果燎悍。
但是,在這篇博客還是探討我們 TCP 和 HTTP 的區(qū)別盼理,所以我們還是繞回來谈山。
建立起一個TCP連接需要經(jīng)過“三次握手”:
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài)宏怔,等待服務(wù)器確認(rèn)奏路;
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1)臊诊,同時自己也發(fā)送一個SYN包(syn=k)思劳,即SYN+ACK包,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài)妨猩;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)秽褒,此包發(fā)送完畢壶硅,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手销斟。
握 手過程中傳送的包里不包含數(shù)據(jù)庐椒,三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)蚂踊。理想狀態(tài)下约谈,TCP連接一旦建立,在通信雙方中的任何一方主動關(guān)閉連 接之前,TCP 連接都將被一直保持下去棱诱。斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開TCP連接的請求泼橘,斷開過程需要經(jīng)過“四次握手”。
【注意】中斷連接端可以是Client端迈勋,也可以是Server端炬灭。
假設(shè)Client端發(fā)起中斷連接請求,也就是發(fā)送FIN報文靡菇。Server端接到FIN報文后重归,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成厦凤,則不必急著關(guān)閉Socket鼻吮,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK较鼓,"告訴Client端椎木,你的請求我收到了,但是我還沒準(zhǔn)備好笨腥,請繼續(xù)你等我的消息"拓哺。這個時候Client端就進(jìn)入FIN_WAIT狀態(tài),繼續(xù)等待Server端的FIN報文脖母。當(dāng)Server端確定數(shù)據(jù)已發(fā)送完成士鸥,則向Client端發(fā)送FIN報文,"告訴Client端谆级,好了烤礁,我這邊數(shù)據(jù)發(fā)完了,準(zhǔn)備好關(guān)閉連接了"肥照。Client端收到FIN報文后脚仔,"就知道可以關(guān)閉連接了,但是他還是不相信網(wǎng)絡(luò)舆绎,怕Server端不知道要關(guān)閉鲤脏,所以發(fā)送ACK后進(jìn)入TIME_WAIT狀態(tài),如果Server端沒有收到ACK則可以重傳吕朵×源迹“,Server端收到ACK后努溃,"就知道可以斷開連接了"硫嘶。Client端等待了2MSL后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉梧税,那好沦疾,我Client端也可以關(guān)閉連接了称近。Ok,TCP連接就這樣關(guān)閉了哮塞!
HTTP
HTTP 即超文本傳送協(xié)議(Hypertext Transfer Protocol )刨秆,是Web聯(lián)網(wǎng)的基礎(chǔ),也是設(shè)備聯(lián)網(wǎng)常用的協(xié)議之一彻桃,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用坛善。
HTTP 連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng),在請求結(jié)束后邻眷,會主動釋放連接眠屎。從建立連接到關(guān)閉連接的過程稱為“一次連接”。
在 HTTP 1.0 中肆饶,客戶端的每次請求都要求建立一次單獨的連接改衩,在處理完本次請求后,就自動釋放連接驯镊。
在 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)斷開梗搅。
談到 HTTP禾唁,最容易聯(lián)想到的就是 HTTP 服務(wù)端返回給客戶端的狀態(tài)碼,這些東西可是面試的澄耷校客蟀俊,讓我們來看看。
這些狀態(tài)碼被分為五大類:
- 100-199 用于指定客戶端應(yīng)相應(yīng)的某些動作订雾。
- 200-299 用于表示請求成功。
- 300-399 用于已經(jīng)移動的文件并且常被包含在定位頭信息中指定新的地址信息矛洞。
- 400-499 用于指出客戶端的錯誤洼哎。
- 500-599 用于支持服務(wù)器錯誤烫映。
具體的狀態(tài)碼對應(yīng)信息將另開一篇博客來詳細(xì)描述。
來聊聊區(qū)別
HTTP 是要基于 TCP 連接基礎(chǔ)上的噩峦,簡單的說锭沟,TCP 就是單純建立連接,不涉及任何我們需要請求的實際數(shù)據(jù)识补,簡單的傳輸族淮。HTTP 是用來收發(fā)數(shù)據(jù),即實際應(yīng)用上來的凭涂。
在前面客戶端和應(yīng)用服務(wù)器建立 TCP 連接之后祝辣,就需要用 HTTP 協(xié)議來傳送數(shù)據(jù)了, HTTP 協(xié)議簡單來說切油,還是請求蝙斜,確認(rèn),連接澎胡。
總體就是C(下文章 C 均代表 Client孕荠,即客戶端)發(fā)送一個 HTTP 請求給S(下文章 S 均代表 Server,即服務(wù)端)攻谁,S收到了這個 HTTP 請求稚伍,然后返回給C HTTP 響應(yīng),然后C的中間件或者說瀏覽器把這些數(shù)據(jù)渲染成為了網(wǎng)頁戚宦,展示在用戶面前个曙。
第一:發(fā)送一個 HTTP 請求給S,這個請求包括請求頭和請求內(nèi)容:
request header:包括
- 請求的方法是POST/GET,請求的URL阁苞,http協(xié)議版本
- 請求的數(shù)據(jù)困檩,和編碼方式
- 是否有cookie和cooies,是否緩存等那槽。
POST 和 GET 請求方式的區(qū)別是悼沿,GET 把請求內(nèi)容放在 URL 后面,但是 URL 長度有限制骚灸,所以 GET 的請求數(shù)據(jù)最大支持到 4Kb 糟趾。而 POST 是以表單的形勢,適合要輸入密碼之類的甚牲,因為不在 URL 中顯示义郑,所以比較安全。
request body:
即請求的內(nèi)容.
第二:S收到了HTTP請求丈钙,然后根據(jù)請求頭非驮,返回HTTP響應(yīng)。
response header:包括
- cookies或者sessions
- 狀態(tài)碼
- 內(nèi)容大小等
response body:即響應(yīng)的內(nèi)容雏赦,包括
JS什么的劫笙、需要返回客戶端的數(shù)據(jù)(現(xiàn)在一般 format 成 Json 格式的字符串)
第三芙扎,C收到了以后,就由瀏覽器完成一系列的渲染填大,包括執(zhí)行JS腳本等戒洼。
總結(jié)
TCP 是底層通訊協(xié)議,定義的是數(shù)據(jù)傳輸和連接方式的規(guī)范允华。
HTTP 是應(yīng)用層協(xié)議圈浇,定義的是傳輸數(shù)據(jù)的內(nèi)容的規(guī)范。
HTTP 中的數(shù)據(jù)是利用 TCP 協(xié)議傳輸?shù)难ゼ牛灾С?HTTP 也就一定支持TCP磷蜀。
HTTP 支持的是www服務(wù) ,而TCP/IP是協(xié)議榨汤,即是Internet國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)蠕搜。TCP/IP是網(wǎng)絡(luò)中使用的基本的通信協(xié)議。
TCP/IP 實際上是一組協(xié)議收壕,它包括上百個各種功能的協(xié)議妓灌,如:遠(yuǎn)程登錄、文件傳輸和電子郵件等蜜宪,而 TCP 協(xié)議和 IP 協(xié)議是保證數(shù)據(jù)完整傳輸?shù)膬蓚€基本的重要協(xié)議虫埂。通常說 TCP/IP 是 Internet 協(xié)議族,而不單單是 TCP 和 IP 圃验。
Socket
看到最后的各位掉伏,辛苦了,既然聊到了 TCP 和 HTTP 的區(qū)別澳窑,再來聊聊另一個大家伙斧散,Socket 吧。
1. 套接字(Socket)概念
套接字(Socket)是通信的基石摊聋,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元鸡捐。它是網(wǎng)絡(luò)通信過程中端點的抽象表示,包含進(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 端口傳輸數(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ù)。
2. 建立 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ù)傳給客戶端撮慨。