網(wǎng)站搭建語(yǔ)言網(wǎng)絡(luò)營(yíng)銷成功案例介紹
socket、tcp、udp、http 的認(rèn)識(shí)及區(qū)別
socket、tcp、udp、http 的認(rèn)識(shí)及區(qū)別?
一、先來一個(gè)講TCP、UDP和HTTP關(guān)系的
1、TCP/IP是個(gè)協(xié)議組,可分為三個(gè)層次:網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。
在網(wǎng)絡(luò)層有IP協(xié)議、ICMP協(xié)議、ARP協(xié)議、RARP協(xié)議和BOOTP協(xié)議。 在傳輸層中有TCP協(xié)議與UDP協(xié)議。
在應(yīng)用層有FTP、HTTP、TELNET、SMTP、DNS等協(xié)議。
因此,HTTP本身就是一個(gè)協(xié)議,是從Web服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。
2、HTTP協(xié)議是建立在請(qǐng)求/響應(yīng)模型上的。
首先由客戶建立一條與服務(wù)器的TCP鏈接,并發(fā)送一個(gè)請(qǐng)求到服務(wù)器,
請(qǐng)求中包含請(qǐng)求方法、URI、協(xié)議版本以及相關(guān)的MIME樣式的消息。
服務(wù)器響應(yīng)一個(gè)狀態(tài)行,包含消息的協(xié)議版本、一個(gè)成功和失敗碼以及相關(guān)的MIME式樣的消息。
HTTP/1.0為每一次HTTP的請(qǐng)求/響應(yīng)建立一條新的TCP鏈接,
因此一個(gè)包含HTML內(nèi)容和圖片的頁(yè)面將需要建立多次的短期的TCP鏈接。
一次TCP鏈接的建立將需要3次握手。
另外,為了獲得適當(dāng)?shù)膫鬏斔俣?#xff0c;則需要TCP花費(fèi)額外的回路鏈接時(shí)間(RTT)。
每一次鏈接的建立需要這種經(jīng)常性的開銷,而其并不帶有實(shí)際有用的數(shù)據(jù),只是保證鏈接的可靠性,因此HTTP/1.1提出了可持續(xù)鏈接的實(shí)現(xiàn)方法。
HTTP/1.1將只建立一次TCP的鏈接而重復(fù)地使用它傳輸一系列的請(qǐng)求/響應(yīng)消息,因此減少了鏈接建立的次數(shù)和經(jīng)常性的鏈接開銷。
3、結(jié)論:
雖然HTTP本身是一個(gè)協(xié)議,但其最終還是基于TCP的。不過,目前,有人正在研究基于TCP+UDP混合的HTTP協(xié)議。
Socket是什么呢?Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計(jì)模式中,
Socket其實(shí)就是一個(gè)門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,
對(duì)用戶來說,一組簡(jiǎn)單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
?
?
TCP、UDP、HTTP、SOCKET之間的區(qū)別
?
TCP和UDP:傳輸層協(xié)議;
HTTP:應(yīng)用層協(xié)議;
SOCKET:TCP/IP網(wǎng)絡(luò)的API。
TCP/IP代表傳輸控制協(xié)議/網(wǎng)際協(xié)議,指的是一系列協(xié)議。
TCP和UDP使用IP協(xié)議從一個(gè)網(wǎng)絡(luò)傳送數(shù)據(jù)包到另一個(gè)網(wǎng)絡(luò)。把IP想像成一種高速公路,它允許其它協(xié)議在上面行駛并找到到其它電腦的出口。
TCP和UDP是高速公路上的“卡車”,它們攜帶的貨物就是像HTTP,文件傳輸協(xié)議FTP這樣的協(xié)議等。
TCP和UDP是FTP、HTTP和SMTP之類使用的傳輸層協(xié)議。
雖然TCP和UDP都是用來傳輸其他協(xié)議的,它們卻有一個(gè)顯著的不同:TCP提供有保證的數(shù)據(jù)傳輸,而UDP不提供。
這意味著TCP有一個(gè)特殊的機(jī)制來確保數(shù)據(jù)安全的不出錯(cuò)的從一個(gè)端點(diǎn)傳到另一個(gè)端點(diǎn),而UDP不提供任何這樣的保證。
HTTP(超文本傳輸協(xié)議)是利用TCP在兩臺(tái)電腦(通常是Web服務(wù)器和客戶端)之間傳輸信息的協(xié)議。
客戶端使用Web瀏覽器發(fā)起HTTP請(qǐng)求給Web服務(wù)器,Web服務(wù)器發(fā)送被請(qǐng)求的信息給客戶端。
記住,需要IP協(xié)議來連接網(wǎng)絡(luò);TCP是一種允許我們安全傳輸數(shù)據(jù)的機(jī)制,使用TCP協(xié)議來傳輸數(shù)據(jù)的HTTP是Web服務(wù)器和客戶端使用的特殊協(xié)議。
Socket 接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,用以開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。
?
?
TCP、UDP 協(xié)議的區(qū)別
UDP 在傳送數(shù)據(jù)之前不需要先建立連接,遠(yuǎn)地主機(jī)在收到 UDP 報(bào)文后,不需要給出任何確認(rèn)。雖然 UDP 不提供可靠交付,但在某些情況下 UDP 確是一種最有效的工作方式(一般用于即時(shí)通信),比如: QQ 語(yǔ)音、 QQ 視頻 、直播等等
TCP 提供面向連接的服務(wù)。在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。 TCP 不提供廣播或多播服務(wù)。由于 ?TCP ? 要提供可靠的,面向連接的運(yùn)輸服務(wù)(TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前,會(huì)有三次握手來建立連接,而且在數(shù)據(jù)傳遞時(shí),有確認(rèn)、窗口、重傳、擁塞控制機(jī)制,在數(shù)據(jù)傳完后,還會(huì)斷開連接用來節(jié)約系統(tǒng)資
源),這一難以避免增加了許多開銷,如確認(rèn),流量控制,計(jì)時(shí)器以及連接管理等。這不僅使協(xié)議數(shù)據(jù)單元的首部增 ? 大很多,還要占用許多處理機(jī)資源。TCP 一般用于文件傳輸、發(fā)送和接收郵件、遠(yuǎn)程登錄等場(chǎng)景。
?在瀏覽器中輸入url地址 ->> 顯示主頁(yè)的過程
百度好像最喜歡問這個(gè)問題。
打開一個(gè)網(wǎng)頁(yè),整個(gè)過程會(huì)使用哪些協(xié)議
圖片來源:《圖解HTTP》
總體來說分為以下幾個(gè)過程:
1.DNS解析
2.TCP連接
3.發(fā)送HTTP請(qǐng)求
4.服務(wù)器處理請(qǐng)求并返回HTTP報(bào)文
5.瀏覽器解析渲染頁(yè)面
6.連接結(jié)束
各種協(xié)議與HTTP協(xié)議之間的關(guān)系?
一般面試官會(huì)通過這樣的問題來考察你對(duì)計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)體系的理解。
圖片來源:《圖解HTTP》
?HTTP長(zhǎng)連接、短連接
在HTTP/1.0中默認(rèn)使用短連接。也就是說,客戶端和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,任務(wù)結(jié)束就中 ? ? ?斷連接。當(dāng)客戶端瀏覽器訪問的某個(gè)HTML或其他類型的Web頁(yè)中包含有其他的Web資源(如JavaScript文件、圖像文件、CSS文件等),每遇到這樣一個(gè)Web資源,瀏覽器就會(huì)重新建立一個(gè)HTTP會(huì)話。
而從HTTP/1.1起,默認(rèn)使用長(zhǎng)連接,用以保持連接特性。使用長(zhǎng)連接的HTTP協(xié)議,會(huì)在響應(yīng)頭加入這行代碼:
Connection:keep-alive
在使用長(zhǎng)連接的情況下,當(dāng)一個(gè)網(wǎng)頁(yè)打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,客 ? ? 戶端再次訪問這個(gè)服務(wù)器時(shí),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接。Keep-Alive不會(huì)永久保持連接,它有一個(gè)保持時(shí)間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間。實(shí)現(xiàn)長(zhǎng)連接需要客戶端和服務(wù)端都支持長(zhǎng)連接。
HTTP協(xié)議的長(zhǎng)連接和短連接,實(shí)質(zhì)上是TCP協(xié)議的長(zhǎng)連接和短連接。
TCP 三次握手和四次揮手(面試???
為了準(zhǔn)確無誤地把數(shù)據(jù)送達(dá)目標(biāo)處,TCP協(xié)議采用了三次握手策略。 漫畫圖解:
圖片來源:《圖解HTTP》
?簡(jiǎn)單示意圖:
客戶端–發(fā)送帶有 SYN 標(biāo)志的數(shù)據(jù)包–一次握手–服務(wù)端
服務(wù)端–發(fā)送帶有 SYN/ACK 標(biāo)志的數(shù)據(jù)包–二次握手–客戶端
客戶端–發(fā)送帶有帶有 ACK 標(biāo)志的數(shù)據(jù)包–三次握手–服務(wù)端
為什么要三次握手?
三次握手的目的是建立可靠的通信信道,說到通訊,簡(jiǎn)單來說就是數(shù)據(jù)的發(fā)送與接收,而三次握手最主要的目的就是 ? 雙方確認(rèn)自己與對(duì)方的發(fā)送與接收是正常的。
第一次握手:Client 什么都不能確認(rèn);Server 確認(rèn)了對(duì)方發(fā)送正常
第二次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送、接收正常;Server 確認(rèn)了:自己接收正常,對(duì)方發(fā)送正常
第三次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送、接收正常;Server 確認(rèn)了:自己發(fā)送、接收正常, 對(duì)方發(fā)送接收正常
所以三次握手就能確認(rèn)雙發(fā)收發(fā)功能都正常,缺一不可。
為什么要傳回 SYN
接收端傳回發(fā)送端所發(fā)送的 SYN 是為了告訴發(fā)送端,我接收到的信息確實(shí)就是你所發(fā)送的信號(hào)了。
SYN 是 TCP/IP 建立連接時(shí)使用的握手信號(hào)。在客戶機(jī)和服務(wù)器之間建立正常的 TCP 網(wǎng)絡(luò)連接時(shí),
客戶機(jī)首先發(fā)出一個(gè) SYN 消息,服務(wù)器使用 SYN-ACK 應(yīng)答表示接收到了這個(gè)消息,最后客戶機(jī)再以
ACK(Acknowledgement[漢譯:確認(rèn)字符 ,在數(shù)據(jù)通信傳輸中,接收站發(fā)給發(fā)送站的一種傳輸控制字
符。它表示確認(rèn)發(fā)來的數(shù)據(jù)已經(jīng)接受無誤。 ])消息響應(yīng)。這樣在客戶機(jī)和服務(wù)器之間才能建立起
可靠的TCP連接,數(shù)據(jù)才可以在客戶機(jī)和服務(wù)器之間傳遞。
?傳了 SYN,為啥還要傳 ACK
雙方通信無誤必須是兩者互相發(fā)送信息都無誤。傳了 ? SYN,證明發(fā)送方到接收方的通道沒有問題,但是接收方到發(fā)送方的通道還需要 ACK 信號(hào)來進(jìn)行驗(yàn)證。
斷開一個(gè) TCP 連接則需要“四次揮手”:
1.客戶端-發(fā)送一個(gè) FIN,用來關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送
2.服務(wù)器-收到這個(gè) FIN,它發(fā)回一 個(gè) ACK,確認(rèn)序號(hào)為收到的序號(hào)加1 。和 SYN 一樣,一個(gè) FIN 將占用一個(gè)序號(hào)。
3.服務(wù)器-關(guān)閉與客戶端的連接,發(fā)送一個(gè)FIN給客戶端
4.客戶端-發(fā)回 ACK 報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1
?為什么要四次揮手
任何一方都可以在數(shù)據(jù)傳送結(jié)束后發(fā)出連接釋放的通知,待對(duì)方確認(rèn)后進(jìn)入半關(guān)閉狀態(tài)。當(dāng)另一方也沒有數(shù)據(jù)再發(fā)送 ? 的時(shí)候,則發(fā)出連接釋放通知,對(duì)方確認(rèn)后就完全關(guān)閉了TCP連接。
舉個(gè)例子:A 和 B 打電話,通話即將結(jié)束后,A 說“我沒啥要說的了”,B回答“我知道了”,但是 B 可能還會(huì)有要說的話,A 不能要求 B 跟著自己的節(jié)奏結(jié)束通話,于是 B 可能又巴拉巴拉說了一通,最后 B 說“我說完了”,A 回答“知道了”,這樣通話才算結(jié)束。