面試官:HTTP、TCP和UDP之間的區(qū)別,你真的清楚嗎?
程序員的成長(zhǎng)之路互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
關(guān)注
閱讀本文大概需要 10?分鐘。
來(lái)自: blog.csdn.net/qq_42410176/article/ details/117368245
在解釋HTTP、TCP和UDP之前的區(qū)別之前,先為大家介紹一下三者的含義。TCP:傳輸控制協(xié)議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793 [1] 定義。TCP旨在適應(yīng)支持多網(wǎng)絡(luò)應(yīng)用的分層協(xié)議層次結(jié)構(gòu)。連接到不同但互連的計(jì)算機(jī)通信網(wǎng)絡(luò)的主計(jì)算機(jī)中的成對(duì)進(jìn)程之間依靠TCP提供可靠的通信服務(wù)。TCP假設(shè)它可以從較低級(jí)別的協(xié)議獲得簡(jiǎn)單的,可能不可靠的數(shù)據(jù)報(bào)服務(wù)。原則上,TCP應(yīng)該能夠在從硬線連接到分組交換或電路交換網(wǎng)絡(luò)的各種通信系統(tǒng)之上操作。UDP:Internet 協(xié)議集支持一個(gè)無(wú)連接的傳輸協(xié)議,該協(xié)議稱為用戶數(shù)據(jù)報(bào)協(xié)議(UDP,User Datagram Protocol)。UDP 為應(yīng)用程序提供了一種無(wú)需建立連接就可以發(fā)送封裝的 IP 數(shù)據(jù)包的方法。RFC 768 [1] 描述了 UDP。Internet 的傳輸層有兩個(gè)主要協(xié)議,互為補(bǔ)充。無(wú)連接的是 UDP,它除了給應(yīng)用程序發(fā)送數(shù)據(jù)包功能并允許它們?cè)谒璧膶哟紊霞軜?gòu)自己的協(xié)議之外,幾乎沒有做什么特別的事情。面向連接的是 TCP,該協(xié)議幾乎做了所有的事情。HTTPS:超文本傳輸協(xié)議(Hypertext Transfer Protocol,HTTP)是一個(gè)簡(jiǎn)單的請(qǐng)求-響應(yīng)協(xié)議,它通常運(yùn)行在TCP之上。它指定了客戶端可能發(fā)送給服務(wù)器什么樣的消息以及得到什么樣的響應(yīng)。請(qǐng)求和響應(yīng)消息的頭以ASCII形式給出;而消息內(nèi)容則具有一個(gè)類似MIME的格式。這個(gè)簡(jiǎn)單模型是早期Web成功的有功之臣,因?yàn)樗归_發(fā)和部署非常地直截了當(dāng)。看到這里如果你還不是很理解三者的意思,你可以簡(jiǎn)單的記住:TCP是一種傳輸可靠連接的協(xié)議;UDP是一種傳輸不可靠的連接;HTTP是基于TCP的一種超文本連接;下面我會(huì)詳細(xì)的給大家介紹。TCP連接
為了能實(shí)現(xiàn)計(jì)算機(jī)在因特網(wǎng)之間的數(shù)據(jù)傳輸,就需要使用TCP/IP的概念.TCP/IP不是一種協(xié)議,而是一個(gè)協(xié)議族的統(tǒng)稱,其中包括IP協(xié)議、IMCP協(xié)議、TCP協(xié)議,以及我們常見的http、ftp協(xié)議等。計(jì)算機(jī)定義了協(xié)議,就像兩個(gè)不同國(guó)籍的人之間約定使用國(guó)際通用語(yǔ)言交流一樣,雙方都能準(zhǔn)確的理解對(duì)方所表達(dá)的意思。上面也介紹了TCP是一種可靠的數(shù)據(jù)傳輸連接,那么究竟可靠在哪里呢?首先我們看一下TCP與其他協(xié)議的網(wǎng)絡(luò)結(jié)構(gòu)圖。
-
應(yīng)用層:應(yīng)用程序間溝通層,如簡(jiǎn)單電子郵件傳輸(SMPT)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問協(xié)議(Telnet)等。
-
傳輸層:在此層中,他提供了節(jié)點(diǎn)間的數(shù)據(jù)傳輸,應(yīng)用程序之間的通信服務(wù),主要功能是數(shù)據(jù)格式化、數(shù)據(jù)確認(rèn)和丟失重傳等。如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。
-
互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。
-
網(wǎng)絡(luò)接口層(主機(jī)-網(wǎng)絡(luò)層):接收IP數(shù)據(jù)報(bào)并進(jìn)行傳輸,從網(wǎng)絡(luò)上接收物理幀,抽取IP數(shù)據(jù)報(bào)轉(zhuǎn)交給下一層,對(duì)實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來(lái)傳送數(shù)據(jù)。
TCP三次握手
TCP在傳輸層中由一個(gè)確認(rèn)和重傳操作,可以保證我們傳輸文件的完成性。TCP傳輸文件在連接之前需要建立連接,這個(gè)連接就是三次握手,計(jì)算機(jī)通過三次握手建立一個(gè)持久性、穩(wěn)定的連接。就像是兩個(gè)人之間打電話,當(dāng)電話打通時(shí),兩個(gè)人就建立起一條持久性的連接,別人是沒辦法去干擾通話的。
第一次握手:客戶主動(dòng)(activate open)去connect服務(wù)器,并且發(fā)送SYN假設(shè)序列號(hào)為J,服務(wù)器是被動(dòng)打開(passive open)。第二次握手:服務(wù)器在收到SYN后,它會(huì)發(fā)送一個(gè)SYN以及一個(gè)ACK(應(yīng)答)給客戶,ACK的序列號(hào)是J+1,表示是給SYN J的應(yīng)答,新發(fā)送的SYN K 序列號(hào)是K。第三次握手:客戶在收到新SYN K,ACK J+1,也回應(yīng)了ACK K+1以表示收到了,然后兩邊就可以開始數(shù)據(jù)發(fā)送和接收了。看到上面的描述,如果你沒有學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)是很難搞懂上面的專業(yè)術(shù)語(yǔ)的,下面我來(lái)詳細(xì)的說明一下TCP報(bào)文結(jié)構(gòu)。TCP報(bào)文結(jié)構(gòu):

TCP報(bào)文格式詳解:
- 端口號(hào):用來(lái)標(biāo)識(shí)同一臺(tái)計(jì)算機(jī)的不同的應(yīng)用進(jìn)程。
- 源端口:源端口和IP地址的作用是標(biāo)識(shí)報(bào)文的返回地址。
- 目的端口:端口指明接收方計(jì)算機(jī)上的應(yīng)用程序接口。
- 序號(hào):是TCP可靠傳輸?shù)年P(guān)鍵部分。序號(hào)是本報(bào)文段發(fā)送的數(shù)據(jù)組的第一個(gè)字節(jié)的序號(hào)。在TCP傳送的流中,每一個(gè)字節(jié)一個(gè)序號(hào)。如果一個(gè)報(bào)文段的序號(hào)為300,此報(bào)文段數(shù)據(jù)部分共有100字節(jié),則下一個(gè)報(bào)文段的序號(hào)為400.所以序號(hào)確保看TCP傳輸?shù)挠行蛐浴?/li>
- 確認(rèn)號(hào):確認(rèn)號(hào),即ACK,指明洗一個(gè)期待都收到的字節(jié)序號(hào),表明該序號(hào)之前的所有數(shù)據(jù)已經(jīng)確認(rèn)無(wú)誤的收到。確認(rèn)號(hào)只有當(dāng)ACK標(biāo)志為1時(shí)才有效。比如建立連接時(shí),SNY報(bào)文的ACK標(biāo)志位為0。
-
數(shù)據(jù)偏移/首部長(zhǎng)度:4bits。有序首部可能含有可選內(nèi)容,因此TCP報(bào)頭的長(zhǎng)度是不確定的,報(bào)頭不包含任何選字段則長(zhǎng)度為20字節(jié),4位首部長(zhǎng)度字段所標(biāo)識(shí)的最大值為1111,轉(zhuǎn)化為10進(jìn)制為15,
15*32/8=60,所以報(bào)頭最大長(zhǎng)度為60字節(jié)。首部長(zhǎng)度也叫數(shù)據(jù)偏移,是因?yàn)槭撞块L(zhǎng)度實(shí)際上指示了數(shù)據(jù)區(qū)在報(bào)文段中的起始偏移值。 - 保留:為將來(lái)定義新的用途保留,現(xiàn)在一般置0.
- 控制位:URG ACK PSH RST SYN FIN共6個(gè),每一個(gè)標(biāo)志位標(biāo)識(shí)一個(gè)控制功能。
- URG:緊急指針標(biāo)志,為1時(shí)標(biāo)識(shí)緊急指針有效,為0時(shí)則忽略緊急指針。
- ACK:確認(rèn)序號(hào)標(biāo)志,為1時(shí)標(biāo)識(shí)確認(rèn)號(hào)有效,為0時(shí)表示報(bào)文中不含確認(rèn)信息,忽略確認(rèn)號(hào)字段。
- PSH:push標(biāo)志,為1表示是帶有push標(biāo)志的數(shù)據(jù),指示接收放在接收到該報(bào)文段以后,應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用程序,而不是在緩沖區(qū)排隊(duì)。
- RST?:重置連接標(biāo)志,用于重置由于主機(jī)崩潰或其他原因而出現(xiàn)錯(cuò)誤的連接。或者用于拒絕非法的報(bào)文段和拒絕連接請(qǐng)求。
- SYN:同步序號(hào),用于建立連接過程,在連接請(qǐng)求中,SYN=1和ACK=0表示該數(shù)據(jù)段沒有使用捎帶的確認(rèn)域,而連接應(yīng)答捎帶一個(gè)確認(rèn),即SYN=1和ACK=1.
- FIN:finish標(biāo)志,用于釋放連接,為1時(shí)表示發(fā)送方已經(jīng)沒有數(shù)據(jù)發(fā)送了,即關(guān)閉奔放數(shù)據(jù)流。
- 窗口:滑動(dòng)窗口大小,用來(lái)告知發(fā)送端接收端的緩存大小,為此控制發(fā)送端發(fā)送數(shù)據(jù)的速率,從而達(dá)到流量控制。
- 校驗(yàn)和:奇偶校驗(yàn),此校驗(yàn)和是對(duì)整個(gè)的TCP報(bào)文段,包括TCP頭部和TCP數(shù)據(jù),以16位字段進(jìn)行計(jì)算所得,由發(fā)送端計(jì)算和存儲(chǔ),并由接收段驚醒校驗(yàn)。
- 緊急指針:只有當(dāng)URG標(biāo)志置1時(shí)謹(jǐn)記指針才有效。緊急指針是一個(gè)正的偏移量,和順序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。TCP的緊急方式時(shí)發(fā)送端像另一端發(fā)送緊急數(shù)據(jù)的一種方式。
- 選項(xiàng)和填充:最常見的可選字段是最長(zhǎng)報(bào)文大小,又稱為MSS(Maximum Segment Size),每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(為建立連接而設(shè)置SYN標(biāo)志為1的那個(gè)段)中指明這個(gè)選項(xiàng),它表示本端所能接受的最大報(bào)文段的長(zhǎng)度。選項(xiàng)長(zhǎng)度不一定是32位的整數(shù)倍,所以要加填充位,即在這個(gè)字段中加入額外的0,以保證TCP頭是32的整數(shù)倍。
- 數(shù)據(jù)部分:TCP報(bào)文段中的數(shù)據(jù)部分是可選的。在一個(gè)連接建立和一個(gè)連接終止時(shí),雙方交換的報(bào)文段僅有TCP首部,如果一方?jīng)]有數(shù)據(jù)要發(fā)送,也使用沒有任何數(shù)據(jù)的首部來(lái)確認(rèn)收到的數(shù)據(jù)。在處理超時(shí)的許多情況中,也會(huì)發(fā)送不帶任何數(shù)據(jù)的報(bào)文段。
TCP四次揮手
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這個(gè)原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。第一次揮手:客戶端A發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送(報(bào)文段4)。第二次揮手:服務(wù)器B收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)。和 SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。第三次揮手:服務(wù)器B關(guān)閉與客戶端A的連接,發(fā)送一個(gè)FIN給客戶端A(報(bào)文段6)。第四次揮手:客戶端A發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)TCP采用四次揮手關(guān)閉連接,為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢? 這是因?yàn)榉?wù)端的LISTEN狀態(tài)下的SOCKET當(dāng)收到SYN報(bào)文的建連請(qǐng)求后,它可以把ACK和SYN(ACK起應(yīng)答作用,而SYN起同步作用)放在一個(gè)報(bào)文里來(lái)發(fā)送。但關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文通知時(shí),它僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對(duì)方了,所以你可以未必會(huì)馬上會(huì)關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對(duì)方之后,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示你同意可以關(guān)閉連接了,所以它這里的ACK報(bào)文和FIN報(bào)文多數(shù)情況下都是分開發(fā)送的。UDP
UDP協(xié)議與TCP協(xié)議一樣用于處理數(shù)據(jù)包,在OSI模型中,兩者都位于傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對(duì)數(shù)據(jù)包進(jìn)行排序的缺點(diǎn),也就是說,當(dāng)報(bào)文發(fā)送之后,是無(wú)法得知其是否安全完整到達(dá)的。UDP用來(lái)支持那些需要在計(jì)算機(jī)之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。UDP協(xié)議從問世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但即使在今天UDP仍然不失為一項(xiàng)非常實(shí)用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。UDP報(bào)文

特點(diǎn)
UDP是一個(gè)無(wú)連接協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時(shí)就簡(jiǎn)單地去抓取來(lái)自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、計(jì)算機(jī)的能力和傳輸帶寬的限制;在接收端,UDP把每個(gè)消息段放在隊(duì)列中,應(yīng)用程序每次從隊(duì)列中讀一個(gè)消息段。由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護(hù)連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺(tái)服務(wù)機(jī)可同時(shí)向多個(gè)客戶機(jī)傳輸相同的消息。UDP信息包的標(biāo)題很短,只有8個(gè)字節(jié),相對(duì)于TCP的20個(gè)字節(jié)信息包而言UDP的額外開銷很小。TCP和UDP協(xié)議對(duì)比
UDP和TCP協(xié)議的主要區(qū)別是兩者在如何實(shí)現(xiàn)信息的可靠傳遞方面不同。TCP協(xié)議中包含了專門的傳遞保證機(jī)制,當(dāng)數(shù)據(jù)接收方收到發(fā)送方傳來(lái)的信息時(shí),會(huì)自動(dòng)向發(fā)送方發(fā)出確認(rèn)消息;發(fā)送方只有在接收到該確認(rèn)消息之后才繼續(xù)傳送其它信息,否則將一直等待直到收到確認(rèn)信息為止。與TCP不同,UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機(jī)制。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)包的丟失,協(xié)議本身并不能做出任何檢測(cè)或提示。因此,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。TCP 是面向連接的傳輸控制協(xié)議,而UDP 提供了無(wú)連接的數(shù)據(jù)報(bào)服務(wù);TCP 具有高可靠性,確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序;UDP在傳輸數(shù)據(jù)前不建立連接,不對(duì)數(shù)據(jù)報(bào)進(jìn)行檢查與修改,無(wú)須等待對(duì)方的應(yīng)答,所以會(huì)出現(xiàn)分組丟失、重復(fù)、亂序,應(yīng)用程序需要負(fù)責(zé)傳輸可靠性方面的所有工作;UDP具有較好的實(shí)時(shí)性,工作效率較 TCP 協(xié)議高;UDP 段結(jié)構(gòu)比 TCP 的段結(jié)構(gòu)簡(jiǎn)單,因此網(wǎng)絡(luò)開銷也小。TCP協(xié)議可以保證接收端毫無(wú)差錯(cuò)地接收到發(fā)送端發(fā)出的字節(jié)流,為應(yīng)用程序提供可靠的通信服務(wù)。對(duì)可靠性要求高的通信系統(tǒng)往往使用 TCP 傳輸數(shù)據(jù)HTTP協(xié)議
HTTP是基于TCP完成的,HTTP是應(yīng)用層協(xié)議,同其他應(yīng)用層協(xié)議一樣,是為了實(shí)現(xiàn)某一類具體應(yīng)用的協(xié)議,并由某一運(yùn)行在用戶空間的應(yīng)用程序來(lái)實(shí)現(xiàn)其功能。HTTP是一種協(xié)議規(guī)范,這種規(guī)范記錄在文檔上,為真正通過HTTP進(jìn)行通信的HTTP的實(shí)現(xiàn)程序。現(xiàn)在我們所常見的超文本傳輸協(xié)議是HTTPS,HTTPS是HTTP的一種升級(jí)版,HTTPS 協(xié)議是由 HTTP 加上 TLS/SSL 協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,主要通過數(shù)字證書、加密算法、非對(duì)稱密鑰等技術(shù)完成互聯(lián)網(wǎng)數(shù)據(jù)傳輸加密,實(shí)現(xiàn)互聯(lián)網(wǎng)傳輸安全保護(hù)。HTTP報(bào)文

HTTP工作原理
HTTP是基于客戶/服務(wù)器模式,且面向連接的。典型的HTTP事務(wù)處理有如下的過程:- 客戶與服務(wù)器建立連接;
- 客戶向服務(wù)器提出請(qǐng)求;
- 服務(wù)器接受請(qǐng)求,并根據(jù)請(qǐng)求返回相應(yīng)的文件作為應(yīng)答;
- 客戶與服務(wù)器關(guān)閉連接。
推薦閱讀:
性能爆表:SpringBoot利用ThreadPoolTaskExecutor批量插入百萬(wàn)級(jí)數(shù)據(jù)實(shí)測(cè)!
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)
內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)取!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?
![]()
