TCP 和 HTTP 的區(qū)別尊蚁,記牢嘍

前言

先來介紹下這哥倆吧滤否,他們可不是對等的協(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)過“四次握手”。

TCP 三次握手示意圖

【注意】中斷連接端可以是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)閉了哮塞!
TCP 四次揮手示意圖

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)閉連接的過程稱為“一次連接”。

  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)斷開梗搅。
談到 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:包括

  1. 請求的方法是POST/GET,請求的URL阁苞,http協(xié)議版本
  2. 請求的數(shù)據(jù)困檩,和編碼方式
  3. 是否有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:包括

  1. cookies或者sessions
  2. 狀態(tài)碼
  3. 內(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ù)傳給客戶端撮慨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脆粥,隨后出現(xiàn)的幾起案子砌溺,更是在濱河造成了極大的恐慌,老刑警劉巖变隔,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件规伐,死亡現(xiàn)場離奇詭異,居然都是意外死亡匣缘,警方通過查閱死者的電腦和手機(jī)猖闪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肌厨,“玉大人培慌,你說我怎么就攤上這事「贪郑” “怎么了吵护?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我馅而,道長祥诽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任瓮恭,我火速辦了婚禮雄坪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屯蹦。我一直安慰自己诸衔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布颇玷。 她就那樣靜靜地躺著,像睡著了一般就缆。 火紅的嫁衣襯著肌膚如雪帖渠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天竭宰,我揣著相機(jī)與錄音空郊,去河邊找鬼。 笑死切揭,一個胖子當(dāng)著我的面吹牛狞甚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播廓旬,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼哼审,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孕豹?” 一聲冷哼從身側(cè)響起涩盾,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎励背,沒想到半個月后春霍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡叶眉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年址儒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衅疙。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡莲趣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炼蛤,到底是詐尸還是另有隱情妖爷,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站絮识,受9級特大地震影響绿聘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜次舌,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一熄攘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彼念,春花似錦挪圾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吩案,卻和暖如春棚赔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徘郭。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工靠益, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人残揉。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓胧后,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抱环。 傳聞我的和親對象是個殘疾皇子壳快,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容