人人干人人模-人人干人人看-人人干人人搞-人人干人人干人人干-人人干人人干-人人干人人插

您現在的位置:首頁 > 服務支持 > 資訊動態資訊動態

什么是三次握手與四次揮手 一篇文章講清楚TCP協議與UDP協議

     關于TCP協議和UDP協議大家應該都有所耳聞,我們常用的網絡通訊。比如瀏覽網頁、軟件聊天、以及你看到的這篇文章,都是通過這兩種協議來進行數據傳輸的。到底他們是如何工作的?這兩種協議的區別又是什么呢?請隨小編一起耐心看完這篇文章,你一定會有所收獲。


    TCP和UCP協議都工作在傳輸層,他們的目標都是在程序之間傳輸數據。數據可以是文本文件、視頻、圖片。對于TCP和UCP協議來說,都是一堆二進制數,并沒有多大的區別。那TCP與UCP之間的區別是什么?很多伙伴會說,最大的區別就是一個基于連接,一個基于非連接。具體又是什么意思呢?我們來舉一個簡單的例子。

1.jpg

 

    如果把人與人的通信比喻為進程與進程的通信,我們基本有兩個方式,第一種方式是寫信,第二種方式是打電話,如果不考慮速度因素,這兩種方式最大的區別是什么?

    就是信寄出去之后對方是否能收到,以及收到信的內容是否完整。先后寄兩封信過去是否按照順序接收,都變成了未知數。甚至你填寫的收信地址和收件人是否存在,你都無法確認。

    而打電話則不同,從撥打電話到對方接通互相通話,再到結束通話后掛斷,能得到及時的反饋,并且能確認對方準確的接收到。打電話是基于連接的也就是TCP,而寫信就是基于非連接的就是UDP。(如下圖)

2.jpg

 

    TCP是如何保證以上過程的,有三個關鍵的步驟。分別為三次握手、傳輸確認、四次揮手。

    三次握手是建立連接的過程,當客戶端向服務端發起連接時,會無發一包連接請求數據,過去詢問一下,能否與你建立連接。這包數據我們稱為SYN。如果對端同意連接,則回復一包SYN+ACK包。客戶端收到之后回復一包ACK包,連接建立。因為這個過程中互相發送了三包數據,所以稱之為三次握手。

3.jpg

    為什么要三次握手而不是兩次握手呢?

    服務端回復完SYN+ACK之后就建立連接,這是為了防止因為已失效的請求報文,突然又傳到服務器引起錯誤。這是什么意思呢?假設采用兩次握手建立連接,客戶端向服務端發送了一個SYN包來請求建立連接,因為某些未知的原因并沒有到達服務器,在中間某些網絡節點產生了滯留。為了建立連接客戶端會重發SYN包,這次的數據包正常送達。服務端回復SYN+ACK之后建立起了連接,但是第一包數據阻塞的網絡節點突然恢復,第一包SNY包又送達到服務端。這時服務端會誤認為是客戶端又發起了新的連接。從而在兩次握手之后,進入等待數據狀態。服務端認為是兩個連接,而客戶端認為是一個連接,造成了狀態不一致。如果是三次握手的情況下,服務端收不到最后的ACK自然不會認為連接建立成功,所以三次握手本質上來說就是為了解決網絡信道不可靠的問題。

 

 

    為了能夠在不可靠的信道上建立起可靠的連接,經過三次握手后,客戶端和服務端都進入了數據傳輸狀態。上面講到TCP協議需要在不可靠的信道上,保證可靠的連接。

    現在就有幾個問題需要面對,一包數據有可能會被拆成多包發送,如何處理丟包問題?這些數據包到達的先后順序不同,如何處理亂序問題?


    針對這些要求,TCP協議為每一個連接建立了一個發送緩沖區,從建立連接后的第一個字節的序列號為0,后面每個字節的序列號就會增加1。發送數據時,從發送緩沖區取一部分數據組成發送報文,在其TCP協議頭中會附帶序列號和長度。接受端在收到數據后,需要回復確認報文,確認報文中的ACK等于接收序列號加長度。也就是下一包數據需要發送的開始序列號,這樣一問一答的發送方式能夠使發送端確認發送的數據已經被對方收到。發送端也可以一次發送連續的多包數據,接收到只需要回復一次ACK就可以了。這樣發送端可以把待發送的數據分割成一系列的碎片發送到對端,對端根據序列號和長度在接收后得出完整的數據。假設其中丟失了某些數據包。在接收端可以要求發送端重傳。比如丟失了100-199這100個字節,接收端向發送端發送ACK=100的報文,發送端收到后重傳這一包數據。接收端進行補齊。以上過程不區分客戶端和服務端。TCP連接是全雙工的。對于兩端來說均采用上述機制。

4.mp4

 

    我們再看一下什么是四次揮手?

    處于連接狀態的客戶端和服務端,都可以發起關閉連接請求。此時需要四次揮手來進行連接關閉。

    假設客戶端主動發起連接關閉請求,他需要向服務端發起一個包FIN包,表示要關閉連接,自己進入終止等待1狀態,這是第一次揮手。服務端收到FIN包,發送一包ACK包,表示自己進入了關閉等待狀態。客戶端進入終止等待2狀態,這是第二次揮手。服務端此時還可以發送未發送的數據,而客戶端還可以接收數據,待服務端發送完數據之后,發送一包FIN包進入最后確認狀態,這是第三次揮手。客戶端收到之后回復ACK包,進入超時等待狀態,經過超時時間后關閉連接,而服務端收到ACK包后,立即關閉連接,這是第四次揮手。為什么客戶端需要等待超時時間?這是為了保證對方已收到ACK包,因為假設客戶端發送完最后一包ACK包后就釋放了連接。一旦ACK包在網絡中丟失,服務端將一直停留在最后確認狀態。如果客戶端發送最后一包ACK包后,等待一段時間,這時服務端因為沒有收到ACK包會重發FIN包,客戶端會響應這個FIN包重發ACK包并刷新超時時間。

6.jpg

 

    以上機制和三次握手一樣,也是為了保證在不可靠的網絡鏈路中,進行可靠的連接斷開、確認。

 

    了解了TCP協議,我們再看一下UDP協議。

    首先UDP協議是基于非連接的,發送數據就是簡單的把數據包封裝一下,然后從網卡發出去就可以了,數據包之間并沒有狀態上的聯系。正因為UDP這種簡單的處理方式,導致他的性能損耗非常少,對于CPU內存資源的占用也過小于TCP。但是對于網絡傳輸過程中產生的丟包UDP協議并不能保證,所以UDP在傳輸穩定性上要弱于TCP。

7.jpg

 

    來我們總結一下TCP和UDP的主要區別

    TCP傳輸數據穩定可靠,適用于對網絡通訊質量要求較高的場景,需要準確無誤地傳輸給對方。比如傳輸文件,發送郵件,瀏覽網頁等。

UDP的優點是速度快,但是可能產生丟包。所以適用于對實時性要求較高,但是對少量丟包并沒有太大要求的場景。比如,域名查詢,語音通話,視頻直播等。

8.jpg

 

    UDP還有一個非常重要的應用場景。就是隧道網絡。什么是隧道網絡?比如我們常用的VPN就是一種隧道網絡,以及在SDN中用到的VXLAN也是一種隧道網絡。

9.jpg

    好了,關于TCP和UDP的介紹就到這里,看過武漢海翎光電小編的講解是不是豁然開朗了呢?

 

主站蜘蛛池模板: 国产a一级 | 黄色a级片视频 | 国产精品成在线观看 | 欧美爱爱爱爱免费视频 | 国产成人午夜性a一级毛片 国产成人午夜性视频影院 国产成人香蕉久久久久 | 日本黄色大片网站 | 免费看黄色一级 | 日本精品久久久中文字幕 | 视频一区 日韩 | 日本黄大片在线观看视频 | 在线岛国| 亚洲毛片免费视频 | 青青青在线观看国产精品 | 亚洲国产成人影院播放 | 真正全免费视频a毛片 | 国产在线观看成人免费视频 | 免费人成在线观看网站 | 在线观看亚洲成人 | 欧美一区二区三区久久久 | 亚洲欧美日韩色 | 黄 色 片 在 线 看 | 欧美一级特黄aa大片在线观看免费 | 国产精品永久免费视频观看 | 亚洲一级生活片 | 欧美亚洲激情视频 | 三级毛片黄色 | 手机看片1024国产 | 一级做a爰片性色毛片思念网 | 黄色一级一毛片 | 91久久夜色精品国产网站 | 欧美黄www免费 | 日本一区二区三区免费高清在线 | 精品国免费一区二区三区 | 欧美日在线观看 | 亚洲伦乱| 日本一本色道免费视频 | 日韩视频在线观看一区二区 | 麻豆禁漫 | 国产精品免费精品自在线观看 | 九九精品免视看国产成人 | 欧美一级特黄aa大片视频 |