我們?cè)诤退苏勗?huà)時(shí),需要遵循一定的規(guī)則,比如確保對(duì)方能聽(tīng)懂我的語(yǔ)言。如果跟一個(gè)不懂中文的外國(guó)人說(shuō)中文,是不可能很好地進(jìn)行交流的。

計(jì)算機(jī)之間的通信也是如此,必須遵循一定的規(guī)則才能順利“交流”。

TCP與UDP是什么

在TCP/IP協(xié)議棧(互聯(lián)網(wǎng)協(xié)議系列)中,TCP(Transmission Control Protocol ,傳輸控制協(xié)議)與UDP(User Datagram Protocol ,用戶(hù)數(shù)據(jù)報(bào)協(xié)議)是傳輸層中的兩種協(xié)議,我們平時(shí)刷視頻、打游戲、看新聞等都要通過(guò)這兩種協(xié)議進(jìn)行數(shù)據(jù)傳輸。


(相關(guān)資料圖)

那么這兩種協(xié)議有什么區(qū)別呢?

看完上面的表格,是不是還是有點(diǎn)懵,下面小編用一個(gè)比喻來(lái)告訴你二者究竟有什么不同。

我們把兩個(gè)應(yīng)用之間的通信當(dāng)作是兩個(gè)人在通信,在不考慮時(shí)間因素的前提下,我們把TCP看成是打電話(huà),把UDP看成是寫(xiě)信。

兩個(gè)人打電話(huà)時(shí),需要提前撥通對(duì)方的電話(huà),這就是需要建立連接;通話(huà)過(guò)程中,雙方能及時(shí)確認(rèn)消息,如果聽(tīng)不清楚可以要求對(duì)方重新說(shuō)一次,這就是安全可靠。

寫(xiě)信只需要根據(jù)地址把信發(fā)出去,這就是不需要建立連接;發(fā)出去的信也不知道對(duì)方能否收到,這就是不可靠。

TCP為了保證傳輸文件的完整性,會(huì)根據(jù)接收方的接收速率控制發(fā)送方的發(fā)送速率,即實(shí)行流量控制,所以TCP的傳輸速度低于UDP。

這兩種協(xié)議不存在哪個(gè)好哪個(gè)差,都有著各自適合的應(yīng)用場(chǎng)景。

比如傳輸文件時(shí)對(duì)速度沒(méi)有要求,但是必須保證文件完整送達(dá),沒(méi)有數(shù)據(jù)丟失,這時(shí)就應(yīng)該采用TCP協(xié)議,而我們?cè)谝曨l聊天時(shí),時(shí)效性要求高而準(zhǔn)確性要求略低,這時(shí)就采用UDP協(xié)議。

TCP是面向連接的協(xié)議,正如打電話(huà)時(shí)需要提前撥通電話(huà),結(jié)束通話(huà)后需要掛斷電話(huà),那么TCP是如何建立連接與斷開(kāi)連接的呢?

計(jì)算機(jī)之間的通信也是如此,必須遵循一定的規(guī)則才能順利“交流”。

TCP的三次握手

在傳輸數(shù)據(jù)前,兩臺(tái)主機(jī)需要通過(guò)三次會(huì)話(huà)建立連接,這個(gè)過(guò)程我們稱(chēng)為三次握手。

第一次握手:客戶(hù)端向服務(wù)端請(qǐng)求建立連接,

SYN=1(建立連接),seq=x(序列號(hào)),

客戶(hù)端進(jìn)入SYN_SENT狀態(tài)。

第二次握手:服務(wù)端向客戶(hù)端返回確認(rèn)并請(qǐng)求建立連接,

SYN=1(建立連接),ACK=1 (已收到),ack=x+1(確認(rèn)號(hào)為收到的序列號(hào)加一),seq=y(序列號(hào)),

服務(wù)端進(jìn)入SYN_RCVD狀態(tài)。

第三次握手:客戶(hù)端向服務(wù)端發(fā)送確認(rèn)報(bào)文,

ACK=1 (已收到),ack=y+1(確認(rèn)號(hào)為收到的序列號(hào)加一),seq=x+1(序列號(hào)),

三次握手完成以后,2個(gè)主機(jī)之間,就可以傳輸數(shù)據(jù)啦~

TCP的四次揮手

當(dāng)數(shù)據(jù)傳輸完成后,兩臺(tái)主機(jī)需要通過(guò)四次會(huì)話(huà)斷開(kāi)連接,這個(gè)過(guò)程我們稱(chēng)為四次揮手。

第一次揮手:客戶(hù)端向服務(wù)端請(qǐng)求斷開(kāi)連接,F(xiàn)IN=1(斷開(kāi)連接),seq=u(序列號(hào)),客戶(hù)端進(jìn)入FIN_WAIT_1狀態(tài)。第二次揮手:服務(wù)端向客戶(hù)端返回確認(rèn)報(bào)文,ACK=1 (已收到),ack=u+1(確認(rèn)號(hào)為收到的序列號(hào)加一),seq=v(序列號(hào)),服務(wù)端進(jìn)入CLOSE_WAIT狀態(tài),客戶(hù)端進(jìn)入FIN_WAIT_2狀態(tài)。第三次揮手:服務(wù)端完成數(shù)據(jù)傳輸后,向客戶(hù)端發(fā)送斷開(kāi)連接請(qǐng)求,F(xiàn)IN=1(斷開(kāi)連接),ACK=1 (已收到),ack=u+1(確認(rèn)號(hào)為收到的序列號(hào)加一),seq=w(序列號(hào)),服務(wù)端進(jìn)入LAST_ACK狀態(tài)。第四次揮手:客戶(hù)端向服務(wù)端返回確認(rèn)報(bào)文,ACK=1 (已收到),ack=w+1(確認(rèn)號(hào)為收到的序列號(hào)加一),seq=u+1(序列號(hào)),客戶(hù)端進(jìn)入TIME_WAIT狀態(tài),服務(wù)端進(jìn)入CLOSED狀態(tài)。客戶(hù)端處于TIME_WAIT狀態(tài)時(shí),TCP連接還未釋放掉,等待2個(gè)MSL(Maximum Segment Lifetime,最大段生命周期)的時(shí)長(zhǎng)后,客戶(hù)端進(jìn)入CLOSE狀態(tài)。

看到這里,相信大家還有些疑問(wèn),下面就由小編來(lái)一一解答。

為什么是三次握手,兩次握手或者四次握手不可以嗎?

如果是兩次握手,就可能出現(xiàn)下面這種情況。

客戶(hù)端發(fā)送建立連接請(qǐng)求,由于網(wǎng)絡(luò)擁塞,遲遲沒(méi)有得到回應(yīng)。客戶(hù)端再次發(fā)送連接請(qǐng)求,服務(wù)端回應(yīng),連接建立。

一段時(shí)間后,客戶(hù)端第一次發(fā)送的連接請(qǐng)求到達(dá)服務(wù)端,服務(wù)端以為客戶(hù)端重新請(qǐng)求建立連接(其實(shí)并沒(méi)有),此時(shí)服務(wù)端會(huì)返回響應(yīng)報(bào)文并一直處于待連接狀態(tài),這就造成了資源浪費(fèi),如下圖所示。

那為什么不是四次握手呢?

四次握手也能達(dá)到三次握手的效果,也就是將原本的第二次握手拆分成兩次,一次發(fā)送確認(rèn)報(bào)文,一次分開(kāi)發(fā)送請(qǐng)求建立連接報(bào)文,但這同樣造成了資源浪費(fèi),如下圖所示。所以最終確定通過(guò)三次握手建立連接。

為什么是四次揮手,三次揮手不可以嗎?

不可以。當(dāng)客戶(hù)端發(fā)送斷開(kāi)連接請(qǐng)求后停止發(fā)送數(shù)據(jù)(客戶(hù)端還能接收數(shù)據(jù)),有可能此時(shí)服務(wù)端還有數(shù)據(jù)需要發(fā)給客戶(hù)端,所以它先回一個(gè)確認(rèn)報(bào)文,等發(fā)送完所有數(shù)據(jù),再發(fā)送斷開(kāi)連接的報(bào)文,通知客戶(hù)端可以斷開(kāi)連接了。

四次揮手結(jié)束后,為什么客戶(hù)端沒(méi)有立刻關(guān)閉呢?

客戶(hù)端沒(méi)有立刻關(guān)閉,而是進(jìn)入TIME_WAIT狀態(tài),等待2個(gè)MSL的時(shí)長(zhǎng)后,客戶(hù)端才進(jìn)入CLOSE狀態(tài),這是為了確保第四次揮手的確認(rèn)消息到達(dá)服務(wù)端。

如果服務(wù)端在規(guī)定時(shí)間內(nèi)未收到最后的確認(rèn)消息,會(huì)重新進(jìn)行第三次揮手請(qǐng)求斷開(kāi)連接,客戶(hù)端重新發(fā)送確認(rèn)消息,如下圖所示。

MSL是報(bào)文的最長(zhǎng)生存時(shí)間,2個(gè)MSL是在網(wǎng)絡(luò)中來(lái)回兩個(gè)報(bào)文所需要的最長(zhǎng)時(shí)間,如果超過(guò)這個(gè)時(shí)間,客戶(hù)端沒(méi)有重新收到斷開(kāi)連接的請(qǐng)求,說(shuō)明四次揮手順利完成,可以斷開(kāi)連接了。

總結(jié)

今天的內(nèi)容就到這里了,和小編一起復(fù)習(xí)一下今天的內(nèi)容吧:

TCP和UDP是傳輸層中的兩種協(xié)議,TCP安全可靠但傳輸速度慢,UDP傳速度快但可能丟失數(shù)據(jù),這兩種協(xié)議各有優(yōu)勢(shì),適合不同的應(yīng)用場(chǎng)景。兩臺(tái)主機(jī)建立連接和斷開(kāi)連接的過(guò)程被稱(chēng)為“三次握手”和“四次揮手”。了解了為什么一定是三次握手和四次揮手。?

標(biāo)簽: 三次握手 四次揮手