<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          TCP與UDP的區(qū)別(上)

          共 4851字,需瀏覽 10分鐘

           ·

          2022-06-19 16:50

          記得點(diǎn)擊 "歡少的成長(zhǎng)之路", 設(shè)為星標(biāo)?

          后臺(tái)點(diǎn)擊【聯(lián)系我】,申請(qǐng)加入優(yōu)質(zhì)技術(shù)學(xué)習(xí)社群

          大家好,我是Leo。

          之前聊了 體系結(jié)構(gòu),消息流程,TCP粘包 。今天接著粘包繼續(xù)看看TCP與UDP的區(qū)別有哪些。

          TCP與UDP區(qū)別

          1. TCP面向連接(如打電話要先撥號(hào)建立連接)。UDP是無(wú)連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接 三次握手,四次揮手
          2. TCP提供可靠的服務(wù)。也就是說(shuō),通過(guò)TCP連接傳送的數(shù)據(jù),無(wú)差錯(cuò),不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,也不保證可靠交付; 序列號(hào)與確認(rèn)應(yīng)答機(jī)制
          3. TCP面向字節(jié)流,實(shí)際上是TCP把數(shù)據(jù)看成一連串無(wú)結(jié)構(gòu)的字節(jié)流;UDP是面向報(bào)文的;
          4. UDP沒(méi)有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使源主機(jī)的發(fā)送速率降低(對(duì)實(shí)時(shí)應(yīng)用很有用,如IP電話,實(shí)時(shí)視頻會(huì)議等); 擁塞機(jī)制
          5. 每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多,多對(duì)一和多對(duì)多的交互通信;
          6. TCP首部開(kāi)銷20字節(jié);UDP的首部開(kāi)銷小,只有8個(gè)字節(jié); 報(bào)文結(jié)構(gòu)
          7. TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道。

          三次握手與四次分手

          三次握手

          第一次握手:客戶端將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=J,并將該數(shù)據(jù)包發(fā)送給服務(wù)端,客戶端進(jìn)入SYN_SENT狀態(tài),等待服務(wù)端確認(rèn)。

          第二次握手:服務(wù)端收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道客戶端請(qǐng)求建立連接,服務(wù)端將標(biāo)志位SYN和ACK都置為1,ack=J+1,隨機(jī)產(chǎn)生一個(gè)值seq=K,并將該數(shù)據(jù)包發(fā)送給客戶端以確認(rèn)連接請(qǐng)求,服務(wù)端進(jìn)入SYN_RCVD狀態(tài)。

          第三次握手:客戶端收到確認(rèn)后,檢查ack是否為J+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給服務(wù)端,服務(wù)端檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端和服務(wù)端進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后客戶端與服務(wù)端之間可以開(kāi)始傳輸數(shù)據(jù)了。

          SYN_SENT:代表TCP連接的發(fā)起方第一次發(fā)給接受方的時(shí)候設(shè)置成的狀態(tài)。

          SYN_RECV:服務(wù)端被動(dòng)打開(kāi)后,接收到了客戶端的SYN并且發(fā)送了ACK時(shí)的狀態(tài)。再進(jìn)一步接收到客戶端的ACK就進(jìn)入ESTABLISHED狀態(tài)。

          ESTABLISHED:代表已經(jīng)建立了連接

          四次分手

          在斷開(kāi)連接之前客戶端和服務(wù)器都處于ESTABLISHED狀態(tài),雙方都可以主動(dòng)斷開(kāi)連接,以客戶端主動(dòng)斷開(kāi)連接為優(yōu)。

          第一次揮手:客戶端打算斷開(kāi)連接,向服務(wù)器發(fā)送FIN報(bào)文(FIN標(biāo)記位被設(shè)置為1,1表示為FIN,0表示不是),F(xiàn)IN報(bào)文中會(huì)指定一個(gè)序列號(hào),之后客戶端進(jìn)入FIN_WAIT_1狀態(tài)。

          也就是客戶端發(fā)出連接釋放報(bào)文段(FIN報(bào)文),指定序列號(hào)seq = u,主動(dòng)關(guān)閉TCP連接,等待服務(wù)器的確認(rèn)。

          第二次揮手:服務(wù)器收到連接釋放報(bào)文段(FIN報(bào)文)后,就向客戶端發(fā)送ACK應(yīng)答報(bào)文,以客戶端的FIN報(bào)文的序列號(hào) seq+1 作為ACK應(yīng)答報(bào)文段的確認(rèn)序列號(hào)ack = seq+1 = u + 1。

          接著服務(wù)器進(jìn)入CLOSE_WAIT(等待關(guān)閉)狀態(tài),此時(shí)的TCP處于半關(guān)閉狀態(tài)(下面會(huì)說(shuō)什么是半關(guān)閉狀態(tài)),客戶端到服務(wù)器的連接釋放。客戶端收到來(lái)自服務(wù)器的ACK應(yīng)答報(bào)文段后,進(jìn)入FIN_WAIT_2狀態(tài)。

          第三次握手:服務(wù)器也打算斷開(kāi)連接,向客戶端發(fā)送連接釋放(FIN)報(bào)文段,之后服務(wù)器進(jìn)入LASK_ACK(最后確認(rèn))狀態(tài),等待客戶端的確認(rèn)。

          服務(wù)器的連接釋放(FIN)報(bào)文段的FIN=1,ACK=1,序列號(hào)seq=m,確認(rèn)序列號(hào)ack=u+1。

          第四次握手:客戶端收到來(lái)自服務(wù)器的連接釋放(FIN)報(bào)文段后,會(huì)向服務(wù)器發(fā)送一個(gè)ACK應(yīng)答報(bào)文段,以連接釋放(FIN)報(bào)文段的確認(rèn)序號(hào) ack 作為ACK應(yīng)答報(bào)文段的序列號(hào) seq,以連接釋放(FIN)報(bào)文段的序列號(hào) seq+1作為確認(rèn)序號(hào)ack。

          之后客戶端進(jìn)入TIME_WAIT(時(shí)間等待)狀態(tài),服務(wù)器收到ACK應(yīng)答報(bào)文段后,服務(wù)器就進(jìn)入CLOSE(關(guān)閉)狀態(tài),到此服務(wù)器的連接已經(jīng)完成關(guān)閉。

          客戶端處于TIME_WAIT狀態(tài)時(shí),此時(shí)的TCP還未釋放掉,需要等待2MSL后,客戶端才進(jìn)入CLOSE狀態(tài)。

          MSL: 報(bào)文最大生成時(shí)間,它是任何報(bào)文在網(wǎng)絡(luò)上存在的最長(zhǎng)時(shí)間,超過(guò)這個(gè)時(shí)間的報(bào)文將被丟棄。2MSL=60秒

          TIME_WAIT:通過(guò)這個(gè)狀態(tài)我從網(wǎng)上查了一些,只有主動(dòng)關(guān)閉連接的,才會(huì)有TIME_WAIT狀態(tài)。所以畫圖的時(shí)候畫在了左面

          為什么分手需要四次

          這是由于TCP的 半關(guān)閉(half-close) 造成的。半關(guān)閉是指:TCP提供了連接的一方在結(jié)束它的發(fā)送后還能接受來(lái)自另一端數(shù)據(jù)的能力。通俗來(lái)說(shuō),就是不能發(fā)送數(shù)據(jù),但是還可以接受數(shù)據(jù)。

          TCP不允許連接處于半打開(kāi)狀態(tài)時(shí),就單向傳輸數(shù)據(jù),因此完成三次握手后才可以傳輸數(shù)據(jù)(第三握手可以攜帶數(shù)據(jù))。

          當(dāng)連接處于半關(guān)閉狀態(tài)時(shí),TCP是允許單向傳輸數(shù)據(jù)的,也就是說(shuō)服務(wù)器此時(shí)仍然可以向客戶端發(fā)送數(shù)據(jù),等服務(wù)器不再發(fā)送數(shù)據(jù)時(shí),才會(huì)發(fā)送FIN報(bào)文段,同意現(xiàn)在關(guān)閉連接。

          這一特性是由于 TCP雙向通道互相獨(dú)立所導(dǎo)致 的,也使得關(guān)閉連接必須經(jīng)過(guò)四次握手。

          等待2MSL的意義

          這一塊就是介紹一下客戶端為什么要等待2MSL之后才進(jìn)入CLOSE狀態(tài)。

          1. 保證客戶端最后發(fā)送的ACK能夠到達(dá)服務(wù)器,幫助其正常關(guān)閉。
          2. 防止已失效的連接請(qǐng)求報(bào)文段出現(xiàn)在本連接中

          2MSL的時(shí)間是從 客戶端接收到 FIN 后發(fā)送 ACK 開(kāi)始計(jì)時(shí)的。如果在 TIME-WAIT 時(shí)間內(nèi),因?yàn)榭蛻舳说?ACK 沒(méi) 有傳輸?shù)椒?wù)端,客戶端?接收到了服務(wù)端重發(fā)的 FIN 報(bào)?,那么 2MSL 時(shí)間將重新計(jì)時(shí)。

          三次握手的報(bào)文流程

          1. 第一個(gè)SYN報(bào)文:在三次握手時(shí),客戶端會(huì)隨機(jī)生成序號(hào),將序號(hào)放入TCP的首部的 序列號(hào)區(qū)域。同時(shí)把SYN標(biāo)志位置于1,接著把第?個(gè) SYN 報(bào)?發(fā)送給服務(wù)端,表示向服務(wù)端發(fā)起連接,之后客戶端處于 SYN-SENT 狀態(tài)
          2. 第二個(gè)SYN+ACK報(bào)文:服務(wù)端收到報(bào)文后隨機(jī)生成序號(hào),將序號(hào)繼續(xù)放入 序列號(hào)區(qū)域,并把客戶端的序列號(hào)+1放入 確認(rèn)號(hào)區(qū)域。SYN和ACK都置為1。最后把該報(bào)?發(fā)給客戶端,之后服務(wù)端處于 SYN-RCVD狀態(tài)。
          3. 第三次ACK報(bào)文:客戶端收到服務(wù)端的報(bào)文后,還要向服務(wù)端回應(yīng)最后?個(gè)應(yīng)答報(bào)?,?先該應(yīng)答報(bào)? TCP ?部 ACK 標(biāo)志位置為1 ,其次服務(wù)端的序號(hào)+1放入確認(rèn)號(hào)區(qū)域,最后把報(bào)?發(fā)送給服務(wù)端。

          第三次握手的ACK報(bào)文可以攜帶客戶到服務(wù)器的數(shù)據(jù),之后客戶端處于 ESTABLISHED 狀態(tài)。服務(wù)器收到客戶端的應(yīng)答報(bào)?后,也進(jìn)? ESTABLISHED 狀態(tài)。

          序列號(hào)與確認(rèn)應(yīng)答機(jī)制

          TCP通過(guò)序列號(hào)與確認(rèn)應(yīng)答機(jī)制實(shí)現(xiàn)可靠的數(shù)據(jù)傳輸。當(dāng)發(fā)送端將數(shù)據(jù)發(fā)出之后會(huì)等待接收端的確認(rèn)應(yīng)答。如果有確認(rèn)應(yīng)答,說(shuō)明數(shù)據(jù)已經(jīng)成功到達(dá)。如果沒(méi)有確認(rèn)應(yīng)答,很有可能就丟包了。

          數(shù)據(jù)包丟失

          在一定時(shí)間內(nèi),還沒(méi)有收到確認(rèn)應(yīng)答包,就會(huì)進(jìn)行重發(fā)。所以即使丟包,仍然能夠保證數(shù)據(jù)可靠傳輸。

          特定時(shí)間的間隔就是 主機(jī)A向主機(jī)B兩次數(shù)據(jù)請(qǐng)求的間隔。

          確認(rèn)包丟失

          確認(rèn)應(yīng)答機(jī)制是雙向的,所以主機(jī)A請(qǐng)求主機(jī)B可能出問(wèn)題,主機(jī)B回傳主機(jī)A也有可能出現(xiàn)丟包的情況,下面我們就用圖解釋一下。

          超時(shí)如何確定

          超時(shí)主要由RTO 確認(rèn)的,RTO代表往返時(shí)間,由下圖解釋。

          • 當(dāng)超時(shí)時(shí)間較大時(shí),下一次重發(fā)就會(huì)變慢,效率低,性能差。
          • 當(dāng)超時(shí)時(shí)間較小時(shí),下一次重發(fā)就會(huì)過(guò)快,以至于并沒(méi)有丟包就重發(fā)了,這樣就導(dǎo)致了更多的超時(shí),更多的超時(shí)又導(dǎo)致了更多的重發(fā)。

          解決方案:可以通過(guò)TCP建立連接時(shí)間的延時(shí)時(shí)間與參考。通過(guò)RTT+DelayACK+抖動(dòng)時(shí)間的算法來(lái)計(jì)算,而不再需要取一個(gè)估計(jì)的最小值

          半連接隊(duì)列和全連接隊(duì)列

          介紹

          半連接隊(duì)列是SYN隊(duì)列,代表服務(wù)端接收到客戶端的請(qǐng)求后。

          全連接隊(duì)列是SYN+ACK(accept)隊(duì)列,代表建立連接后。.

          在客戶端發(fā)起第一次連接時(shí),服務(wù)端會(huì)將其加入到syn隊(duì)列中,并且響應(yīng)客戶端syn+ack報(bào)文,等到客戶端發(fā)送ack應(yīng)答報(bào)文時(shí),服務(wù)端將該連接從半連接隊(duì)列中取出,并新建一個(gè)新的連接,加入到accept隊(duì)列當(dāng)中。等待進(jìn)程調(diào)用accept請(qǐng)求時(shí),將該連接取出來(lái)

          不管是半連接隊(duì)列還是全連接隊(duì)列,都有最大長(zhǎng)度限制,超過(guò)限制時(shí),內(nèi)核會(huì)直接丟棄,或返回 RST 包。

          SYN攻擊

          這里也就是我們經(jīng)常聽(tīng)說(shuō)的SYN攻擊,如果一直對(duì)服務(wù)端發(fā)送syn包,但是不回ack回應(yīng)包,這樣就會(huì)使得服務(wù)端有大量請(qǐng)求處于syn_recv狀態(tài),這就是所謂的syn洪泛,syn攻擊,DDos攻擊

          解決方案

          1. 增大半連接隊(duì)列
          2. 開(kāi)啟tcp_syncookies功能
          3. 減少ack+syn報(bào)文的重傳次數(shù)

          2.開(kāi)啟tcp_syncookies:可以在不使用syn半連接隊(duì)列的情況下建立連接syncookies在接收到客戶端的syn報(bào)文時(shí),計(jì)算出一個(gè)值,放到syn+ack報(bào)文中發(fā)出。當(dāng)客戶端返回ack報(bào)文時(shí),取出該值驗(yàn)證,成功則建立連接

          3.因?yàn)槲覀冊(cè)谑盏絪yn攻擊時(shí),服務(wù)端會(huì)重傳syn+ack報(bào)文到最大次數(shù),才會(huì)斷開(kāi)連接。針對(duì)syn攻擊的場(chǎng)景,我們可以減少ack+syn報(bào)文的重傳次數(shù),使處于syn_recv狀態(tài)的它們更快斷開(kāi)連接 修改重傳次數(shù):/proc/sys/net/ipv4/tcp_synack_retries

          全連接隊(duì)列溢出

          當(dāng)服務(wù)端的全連接隊(duì)列過(guò)小時(shí),容易發(fā)生全連接隊(duì)列溢出。發(fā)生全連接隊(duì)列溢出,后續(xù)的請(qǐng)求就會(huì)別丟棄。

          Linux有個(gè)參數(shù)可以指定TCP全連接隊(duì)列滿了,會(huì)使用什么策略來(lái)回應(yīng)客戶端。

          丟棄連接只是linux的默認(rèn)行為,我們還可以向客戶端發(fā)送RST報(bào)文終止連接,告訴客戶端連接失敗

          解決方案

          tcp_abort_on_overflow共有兩個(gè)值分別是0和1

          • 0:如果全連接隊(duì)列滿了,那么服務(wù)端丟棄ack報(bào)文
          • 1:如果全連接隊(duì)列滿了,那么服務(wù)端會(huì)想客戶端發(fā)送RST報(bào)文,終止這個(gè)握手連接

          通常情況下設(shè)置為0更好,可以提高效率

          • 如果設(shè)置為0的話,此時(shí)服務(wù)端全連接隊(duì)列滿了,客戶端發(fā)送過(guò)來(lái)的ack報(bào)文,服務(wù)端丟棄。而此時(shí)客戶端還會(huì)繼續(xù)重傳,如果此時(shí)服務(wù)端的全連接隊(duì)列有空閑,那么就會(huì)接受重傳的ack包,這樣就能直接建立連接了。
          • 而設(shè)置為1的話,還需要重新連接

          當(dāng)全連接隊(duì)列溢出后,我們需要增大全連接隊(duì)列的長(zhǎng)度,以提高請(qǐng)求容量。

          TCP 全連接隊(duì)列的最大值取決于 somaxconn 和 backlog 之間的最小值,也就是 min(somaxconn, backlog),所以我們需要提高這兩個(gè)參數(shù)的大小才能拿增大全連接隊(duì)列

          報(bào)文結(jié)構(gòu)

          TCP報(bào)文結(jié)構(gòu)

          URG:緊急指針(urgent pointer)有效。

          ACK:確認(rèn)序號(hào)有效。

          PSH:接收方應(yīng)該盡快將這個(gè)報(bào)文交給應(yīng)用層。

          RST:重置連接。

          SYN:發(fā)起一個(gè)新連接。

          FIN:釋放一個(gè)連接。

          16位窗口大小: 接收緩沖區(qū)剩余的空間大小

          16位校驗(yàn)和: 發(fā)送端填充, CRC校驗(yàn). 接收端校驗(yàn)不通過(guò), 則認(rèn)為數(shù)據(jù)有問(wèn)題. 此處的檢驗(yàn)和不光包含TCP 首部, 也包含TCP數(shù)據(jù)部分.

          16位緊急指針: 標(biāo)識(shí)哪部分?jǐn)?shù)據(jù)是緊急數(shù)據(jù);

          UDP報(bào)文結(jié)構(gòu)

          16位UDP長(zhǎng)度,表示整個(gè)數(shù)據(jù)報(bào)(UDP首部+UDP數(shù)據(jù))的最大長(zhǎng)度;

          如果校驗(yàn)出錯(cuò),就會(huì)直接丟棄。

          UDP數(shù)據(jù)報(bào)最大長(zhǎng)度64K(包含UDP首部),如果數(shù)據(jù)長(zhǎng)度超過(guò)64K就需要在應(yīng)用層手動(dòng)分包,UDP無(wú)法保證包序,需要在應(yīng)用層進(jìn)行編號(hào)。

          結(jié)尾

          這一篇從TCP與UDP的區(qū)別,逐一展開(kāi)每一塊技術(shù)。

          • 三次握手
          • 四次分手
          • 握手報(bào)文流程
          • 客戶端等待2MSL的意義
          • 通過(guò)序列號(hào)與確認(rèn)應(yīng)答機(jī)制實(shí)現(xiàn)可靠傳輸
          • 半連接隊(duì)列與全連接隊(duì)列

          下一篇將繼續(xù)TCP與UDP的區(qū)別,展開(kāi)聊一下窗口控制,重發(fā)控制,流量控制,擁塞控制。


          瀏覽 110
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄片视频免费播放 | 国语屄亚洲| 不卡无码免费视频 | 日本无套内射 | 国产高清免费 |