TCP/UDP協議是什么?深入理解TCP、UDP協議及兩者的區別
一(yi)、TCP協議(yi):
位于傳(chuan)(chuan)(chuan)輸層, 提供(gong)可(ke)(ke)(ke)靠的(de)字(zi)節(jie)(jie)(jie)流服務。所(suo)(suo)謂的(de)字(zi)節(jie)(jie)(jie)流服務(Byte Stream Service) 是(shi)(shi)指, 為了(le)(le)方便傳(chuan)(chuan)(chuan)輸, 將大(da)塊(kuai)數(shu)(shu)(shu)據(ju)(ju)分割成以報文段(duan)(segment) 為單位的(de)數(shu)(shu)(shu)據(ju)(ju)包進(jin)行管理。 而可(ke)(ke)(ke)靠的(de)傳(chuan)(chuan)(chuan)輸服務是(shi)(shi)指, 能(neng)夠(gou)把(ba)(ba)數(shu)(shu)(shu)據(ju)(ju)準確可(ke)(ke)(ke)靠地傳(chuan)(chuan)(chuan)給對(dui)方。 即TCP 協(xie)議為了(le)(le)更容易傳(chuan)(chuan)(chuan)送大(da)數(shu)(shu)(shu)據(ju)(ju)才把(ba)(ba)數(shu)(shu)(shu)據(ju)(ju)分割, 而且 TCP 協(xie)議能(neng)夠(gou)確認數(shu)(shu)(shu)據(ju)(ju)最終是(shi)(shi)否送達到(dao)對(dui)方。所(suo)(suo)以,TCP連接(jie)相當于兩根管道(一(yi)個(ge)(ge)用于服務器到(dao)客(ke)戶(hu)端,一(yi)個(ge)(ge)用于客(ke)戶(hu)端到(dao)服務器),管道里面數(shu)(shu)(shu)據(ju)(ju)傳(chuan)(chuan)(chuan)輸是(shi)(shi)通過字(zi)節(jie)(jie)(jie)碼傳(chuan)(chuan)(chuan)輸,傳(chuan)(chuan)(chuan)輸是(shi)(shi)有序的(de),每個(ge)(ge)字(zi)節(jie)(jie)(jie)都是(shi)(shi)一(yi)個(ge)(ge)一(yi)個(ge)(ge)來傳(chuan)(chuan)(chuan)輸。
(1)、三次握手(shou)(shou):握手(shou)(shou)過程(cheng)中使用了 TCP 的標志(zhi)(flag) —— SYN(synchronize) 和ACK(acknowledgement) 。
第一(yi)次握手:建立(li)連接(jie)時(shi),客戶端A發送SYN包(SYN=j)到服務器B,并進(jin)入SYN_SEND狀態,等(deng)待(dai)服務器B確認。
第二(er)次(ci)握手:服務器(qi)B收到SYN包,必須確認客戶(hu)A的(de)SYN(ACK=j+1),同時自(zi)己也發送一(yi)個SYN包(SYN=k),即SYN+ACK包,此時服務器(qi)B進入(ru)SYN_RECV狀態。
第三次(ci)握(wo)手:客戶端A收到服務器B的SYN+ACK包(bao),向服務器B發(fa)送(song)確認(ren)包(bao)ACK(ACK=k+1),此包(bao)發(fa)送(song)完(wan)畢,完(wan)成三次(ci)握(wo)手。
若在握手過程中(zhong)某個階段莫(mo)名中(zhong)斷(duan), TCP 協議會再次以相同的(de)順序發送相同的(de)數據(ju)包。
(2)、四次揮手:由于TCP連接(jie)是(shi)全雙工的(de)(de),因(yin)此每(mei)個方向都必須單獨(du)進行(xing)關(guan)閉。這個原則(ze)是(shi)當一(yi)(yi)(yi)方完成它的(de)(de)數(shu)(shu)據發(fa)送任務后就能(neng)發(fa)送一(yi)(yi)(yi)個FIN來終止這個方向的(de)(de)連接(jie)。收到一(yi)(yi)(yi)個 FIN只意味(wei)著這一(yi)(yi)(yi)方向上沒有數(shu)(shu)據流動(dong),一(yi)(yi)(yi)個TCP連接(jie)在收到一(yi)(yi)(yi)個FIN后仍能(neng)發(fa)送數(shu)(shu)據。先進行(xing)關(guan)閉的(de)(de)一(yi)(yi)(yi)方將執(zhi)行(xing)主動(dong)關(guan)閉,而另一(yi)(yi)(yi)方被動(dong)關(guan)閉。
客(ke)戶端A發送一個(ge)FIN,用來關閉客(ke)戶A到服務器B的(de)數(shu)據傳送。
服務器B收到這個FIN,它發回一個ACK,確認序(xu)號為(wei)收到的序(xu)號加1。
服務器B關閉(bi)與(yu)客(ke)戶端(duan)A的連接,發送(song)一個(ge)FIN給客(ke)戶端(duan)A。
客戶(hu)端A發回ACK報(bao)文(wen)確認,并將確認序(xu)號設置(zhi)為收到序(xu)號加1。
三次握手(shou)和(he)四次揮手(shou):在TCP連接中(zhong)(zhong),服務(wu)器端的(de)SYN和(he)ACK向客戶(hu)端發送是(shi)一次性發送的(de),而在斷開(kai)連接的(de)過(guo)程中(zhong)(zhong), B端向A
端(duan)發(fa)送(song)(song)的(de)(de)(de)ACK和FIN是分兩次(ci)發(fa)送(song)(song)的(de)(de)(de)。因為在B端(duan)接收到A端(duan)的(de)(de)(de)FIN后(hou), B端(duan)可能還有數據(ju)要傳(chuan)輸(shu),所以先發(fa)送(song)(song)ACK,等B端(duan)處理完自己的(de)(de)(de)事(shi)情后(hou)就可以發(fa)送(song)(song)FIN斷開連接了(le)。
(3)、深(shen)入理解TCP連接:
由于TCP是全雙工(gong)的(de),因此在每一(yi)(yi)(yi)個(ge)(ge)方向都必須單獨關閉(bi)。這原則是當一(yi)(yi)(yi)方完成它的(de)數(shu)據發送(song)任(ren)務后(hou)就能發送(song)一(yi)(yi)(yi)個(ge)(ge)FIN來終(zhong)止這個(ge)(ge)方向的(de)連接。收(shou)到一(yi)(yi)(yi)個(ge)(ge)FIN只意味著這個(ge)(ge)方向上沒有數(shu)據流動(dong),一(yi)(yi)(yi)個(ge)(ge)TCP連接在接收(shou)到一(yi)(yi)(yi)個(ge)(ge)FIN后(hou)仍能發送(song)數(shu)據。 首先(xian)進(jin)行關
閉(bi)(bi)的一方(fang)將執行主動關閉(bi)(bi),而另一方(fang)執行被動關閉(bi)(bi)。
TCP協議(yi)的連(lian)(lian)接是全雙工連(lian)(lian)接,一個TCP連(lian)(lian)接存(cun)在雙向(xiang)的讀(du)寫(xie)通(tong)道(dao)。簡單來說,是“先關(guan)讀(du),再(zai)關(guan)寫(xie)” ,總(zong)共需(xu)要4個階(jie)段。以客戶(hu)機(ji)發起關(guan)閉連(lian)(lian)接為例:1.服務器讀(du)通(tong)道(dao)關(guan)閉;2.客戶(hu)端(duan)(duan)寫(xie)通(tong)道(dao)關(guan)閉;3.客戶(hu)端(duan)(duan)讀(du)通(tong)道(dao)關(guan)閉;4.服務器寫(xie)通(tong)道(dao)關(guan)閉。
關(guan)閉(bi)行為是在(zai)發起(qi)方(fang)數(shu)(shu)據(ju)(ju)發送(song)完畢之后,給對(dui)(dui)方(fang)發出一個FIN(finish)數(shu)(shu)據(ju)(ju)段,直(zhi)到接(jie)收到對(dui)(dui)方(fang)發送(song)的FIN,且對(dui)(dui)方(fang)收到了(le)接(jie)收確(que)認(ren)(ren)的ACK之后,雙方(fang)的數(shu)(shu)據(ju)(ju)通(tong)信完全結束,過程中每次都需要返(fan)回(hui)確(que)認(ren)(ren)數(shu)(shu)據(ju)(ju)段ACK。
(4)、TCP使用滑動窗(chuang)口機制(zhi)來進行流(liu)量控制(zhi)。
建立(li)連(lian)接時,各端分配一個(ge)緩(huan)沖(chong)(chong)(chong)區(qu)用(yong)來存儲接收的(de)數據(ju),并將緩(huan)沖(chong)(chong)(chong)區(qu)的(de)尺寸(cun)發送給另一端。接收方發送的(de)確認消息中包含了(le)自己剩余(yu)的(de)緩(huan)沖(chong)(chong)(chong)區(qu)尺寸(cun)。剩余(yu)緩(huan)沖(chong)(chong)(chong)區(qu)空(kong)間的(de)數量叫做(zuo)窗(chuang)口。其實就是建立(li)連(lian)接的(de)雙虎互相(xiang)知(zhi)道彼(bi)此(ci)剩余(yu)的(de)緩(huan)沖(chong)(chong)(chong)區(qu)大小。
(5)、擁塞(sai)控制
擁塞(sai)控制(zhi):防止過多的(de)數據注入到(dao)網路(lu)(lu)中,這(zhe)樣可以使網絡中的(de)路(lu)(lu)由器(qi)或鏈(lian)路(lu)(lu)不至于(yu)阻塞(sai)。擁塞(sai)控制(zhi)是(shi)一個全局性的(de)過程,和流(liu)(liu)量控制(zhi)不同,流(liu)(liu)量控制(zhi)是(shi)點對點的(de)控制(zhi)。
1、慢開始(shi)(shi):發(fa)送方(fang)維持一個(ge)叫(jiao)做擁塞(sai)(sai)窗(chuang)口(kou)(kou)cwnd(congestion window)的(de)狀態變量。擁塞(sai)(sai)窗(chuang)口(kou)(kou)的(de)大小(xiao)(xiao)取決于網(wang)絡的(de)擁塞(sai)(sai)程度,并且動(dong)態的(de)變化。發(fa)送方(fang)讓自己(ji)的(de)發(fa)送窗(chuang)口(kou)(kou)等(deng)于擁塞(sai)(sai)窗(chuang)口(kou)(kou),另外考(kao)慮到(dao)接(jie)收(shou)方(fang)的(de)接(jie)收(shou)能力,發(fa)送窗(chuang)口(kou)(kou)可(ke)能小(xiao)(xiao)于擁塞(sai)(sai)窗(chuang)口(kou)(kou)。思路就(jiu)是:不要(yao)一開始(shi)(shi)就(jiu)發(fa)送大量的(de)數(shu)據,先試探(tan)一下(xia)網(wang)絡的(de)擁塞(sai)(sai)程度,也(ye)就(jiu)是說(shuo)由小(xiao)(xiao)到(dao)大增加擁塞(sai)(sai)窗(chuang)口(kou)(kou)的(de)大小(xiao)(xiao)。
為了(le)防(fang)止cwnd增(zeng)長過(guo)大(da)引(yin)起(qi)網絡擁塞,還需要設置一個(ge)慢開始門限ssthresh狀態變量。 ssthresh的方法如下:
當(dang)cwnd < ssthresh時(shi),開始使用慢開始算法;當(dang)cwnd > ssthresh, 改用擁(yong)塞避免(mian)算法;當(dang)cwnd = ssthresh時(shi),慢開始與擁(yong)塞算法任意。
2.擁(yong)塞避免:
擁(yong)(yong)塞(sai)(sai)(sai)避免算法讓(rang)擁(yong)(yong)塞(sai)(sai)(sai)窗(chuang)(chuang)(chuang)(chuang)口緩慢增長,即每經過一(yi)個(ge)往返時間RTT就(jiu)把發(fa)送(song)方的(de)擁(yong)(yong)塞(sai)(sai)(sai)窗(chuang)(chuang)(chuang)(chuang)口cwnd加(jia)1,而不是(shi)加(jia)倍(bei),這樣擁(yong)(yong)塞(sai)(sai)(sai)窗(chuang)(chuang)(chuang)(chuang)口按照線(xian)性規律緩慢增長。無(wu)論是(shi)在慢開始(shi)階(jie)段還(huan)是(shi)在擁(yong)(yong)塞(sai)(sai)(sai)避免階(jie)段,只要發(fa)送(song)方判斷(duan)網絡出現擁(yong)(yong)塞(sai)(sai)(sai)(其根據就(jiu)是(shi)沒有收到(dao)確認,雖然(ran)沒有收到(dao)確認可能(neng)是(shi)其他原(yuan)因的(de)分組丟失(shi),但是(shi)因為?法判定,所以都當作擁(yong)(yong)塞(sai)(sai)(sai)處理(li)),就(jiu)把慢開始(shi)門限設(she)置為出現擁(yong)(yong)塞(sai)(sai)(sai)時的(de)發(fa)送(song)窗(chuang)(chuang)(chuang)(chuang)口的(de)一(yi)半,然(ran)后把擁(yong)(yong)塞(sai)(sai)(sai)窗(chuang)(chuang)(chuang)(chuang)口設(she)置為1,執行(xing)慢開始(shi)算法:
此外,還有快(kuai)速重傳和(he)快(kuai)速恢復,停止-等(deng)待協議,回退(tui)N幀(zhen)協議,選擇重傳協議等(deng)。
二、UDP協議:
無(wu)連接協議,也稱透明協議,也位于(yu)傳(chuan)輸層。
兩者區別:
1) TCP提供(gong)面向連(lian)接(jie)的傳輸,通信前要(yao)先建立連(lian)接(jie)(三次握手機制(zhi)); UDP提供(gong)無連(lian)接(jie)的傳輸,通信前不需要(yao)建立連(lian)接(jie)。
2) TCP提供可靠的(de)傳(chuan)輸(有序,無差錯(cuo),不丟失(shi),不重復(fu)); UDP提供不可靠的(de)傳(chuan)輸。
3) TCP面向字(zi)節流的傳輸(shu),因(yin)此它能將信(xin)息分(fen)割成組,并在接收端將其重組; UDP是面向數據報的傳輸(shu),沒有(you)分(fen)組開銷。
4) TCP提供擁塞控(kong)(kong)制和流量(liang)(liang)控(kong)(kong)制機(ji)制; UDP不提供擁塞控(kong)(kong)制和流量(liang)(liang)控(kong)(kong)制機(ji)制。
三、長連接(jie)和短(duan)連接(jie)
HTTP的長(chang)(chang)連接(jie)和短(duan)連接(jie)本質上是(shi)TCP長(chang)(chang)連接(jie)和短(duan)連接(jie)。HTTP屬于應用(yong)層(ceng)協(xie)議(yi),在傳輸層(ceng)使用(yong)TCP協(xie)議(yi),在網(wang)絡(luo)(luo)層(ceng)使用(yong)IP協(xie)議(yi)。 IP協(xie)議(yi)主要解決(jue)網(wang)絡(luo)(luo)路由(you)和尋址問(wen)題,TCP協(xie)議(yi)主要解決(jue)如何(he)在IP層(ceng)之(zhi)上可(ke)靠地(di)傳遞數據包(bao),使得網(wang)絡(luo)(luo)上接(jie)收端收到發(fa)送端所發(fa)出的所有包(bao),并且順序與(yu)發(fa)送順序一致。TCP協(xie)議(yi)是(shi)可(ke)靠的、面向連接(jie)的。
在HTTP/1.0中默認使用短連(lian)接。也就是說,客(ke)(ke)戶(hu)端(duan)和服務器每進行一次HTTP操作,就建立(li)(li)一次連(lian)接,任務結束就中斷連(lian)接。當客(ke)(ke)戶(hu)端(duan)瀏(liu)覽器訪問的(de)某個HTML或其(qi)他類型的(de)Web頁中包含有其(qi)他的(de)Web資源(yuan)(如JavaScript文(wen)件、圖(tu)像文(wen)件、CSS文(wen)件等),每遇到這樣一個Web資源(yuan),瀏(liu)覽器就會重新建立(li)(li)一個HTTP會話。
而從HTTP/1.1起,默(mo)認使(shi)用(yong)(yong)長連接(jie),用(yong)(yong)以保持連接(jie)特性。使(shi)用(yong)(yong)長連接(jie)的HTTP協議(yi),會在響應頭加入(ru)這行(xing)代碼:
Connection:keep-alive
在使(shi)用(yong)長連(lian)(lian)(lian)(lian)接的情況(kuang)下,當一(yi)個(ge)(ge)(ge)網(wang)頁打開完(wan)成后,客(ke)戶(hu)端和服(fu)務(wu)器之(zhi)間(jian)用(yong)于傳輸HTTP數據的TCP連(lian)(lian)(lian)(lian)接不會關(guan)閉,客(ke)戶(hu)端再次訪問這(zhe)個(ge)(ge)(ge)服(fu)務(wu)器時(shi),會繼續(xu)使(shi)用(yong)這(zhe)一(yi)條已經建(jian)立(li)的連(lian)(lian)(lian)(lian)接。Keep-Alive不會永(yong)久保持(chi)(chi)連(lian)(lian)(lian)(lian)接,它有一(yi)個(ge)(ge)(ge)保持(chi)(chi)時(shi)間(jian),可以在不同的服(fu)務(wu)器軟件(如Apache)中設(she)定這(zhe)個(ge)(ge)(ge)時(shi)間(jian)。實現長連(lian)(lian)(lian)(lian)接需要客(ke)戶(hu)端和服(fu)務(wu)端都支持(chi)(chi)長連(lian)(lian)(lian)(lian)接。
HTTP協(xie)議的長連接(jie)(jie)和(he)短連接(jie)(jie),實質(zhi)上(shang)是TCP協(xie)議的長連接(jie)(jie)和(he)短連接(jie)(jie)。