計(jì)算機(jī)網(wǎng)絡(luò)小結(jié)·傳輸層

TCP

本文總結(jié)了傳輸層的傳輸特點(diǎn)與部分基礎(chǔ)問題解答

特點(diǎn)

  • 全雙工
  • 面向連接
  • 可靠數(shù)據(jù)傳輸
  • 擁塞控制

Question

面向連接?

TCP不像HTTP(無連接協(xié)議)是面向連接的(connection-oriented),這也便意味著TCP的有著一個(gè)連接建立的過程,兩個(gè)進(jìn)程通信前必須先進(jìn)行三次握手的過程,簡略來說就是他們必須互相發(fā)送某些預(yù)備報(bào)文段,以建立確保數(shù)據(jù)傳輸?shù)膮?shù),在連接結(jié)束時(shí),還要經(jīng)歷四次揮手的過程來確保連接的結(jié)束,以此來釋放本次連接的資源。

  • tcp連接不是一條像在電路交換網(wǎng)絡(luò)種的端到端TDM或FDM的電路,相反,該“連接”是一條邏輯上的連接。

三次握手

第一次握手:起初兩端都處于CLOSED關(guān)閉狀態(tài),Client將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=client_isn,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN-SENT狀態(tài),等待Server確認(rèn);

第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1得知Client請求建立連接,Server將標(biāo)志位SYN和ACK都置為1,ack=client_isn+1,隨機(jī)產(chǎn)生一個(gè)值seq=server_isn,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求,Server進(jìn)入SYN-RCVD狀態(tài),此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量;

第三次握手:Client收到確認(rèn)后,檢查ack是否為client_isn+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=server_isn+1,并且此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ack是否為server_isn+1,ACK是否為1,如果正確則連接建立成功,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后Client和Server就可以開始傳輸數(shù)據(jù)。

image.png
  • 為什么是三次握手不是兩次握手?

這個(gè)問題的本質(zhì)是, 信道不可靠, 但是通信雙發(fā)需要就某個(gè)問題達(dá)成一致. 而要解決這個(gè)問題, 無論你在消息中包含什么信息, 三次通信是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是為了滿足"在不可靠信道上可靠地傳輸信息"這一需求所導(dǎo)致的。

具體解釋就是:
如果只有兩次握手,缺失了第三次應(yīng)答,那么服務(wù)器將無從得知客戶端是否接收到自己的同步信號,如果第二次連接丟失,S端則無從知曉。

換一種角度來看,幾次連接的功能有:

  1. C 通知建立連接(SYN=1),告知序列號(seq)
  2. S 通知建立連接(SYN=1),告知序列號(seq),應(yīng)答+并回復(fù)我收到了第一次連接(ack,即下一次通訊期望的資源號)
  3. 關(guān)閉SYN建立連接,告知序列號(seq),應(yīng)答+并回復(fù)我收到了第二次連接(ack,即下一次通訊期望的資源號)

第三次連接表達(dá)的信息有三點(diǎn),如果去除則會(huì)導(dǎo)致本次通訊不可靠了。

四次揮手

第一次揮手:客戶端發(fā)送FIN(FIN=1)報(bào)文,表示連接終止
第二次揮手:服務(wù)器響應(yīng),發(fā)送ACK,表示請求以接受

但此時(shí),服務(wù)器可能仍有發(fā)送任務(wù)在進(jìn)行,一段時(shí)間后才會(huì)執(zhí)行第三次揮手。

第三次揮手:服務(wù)端發(fā)送FIN(FIN=1)報(bào)文,表示連接終止
第四次揮手:客戶端響應(yīng),發(fā)送ACK,表示請求以接受

image.png

如何可靠?

TCP(傳輸層)下層(網(wǎng)絡(luò)層)是不可靠的,那么如何在不可靠的基礎(chǔ)上建立可靠的數(shù)據(jù)傳輸服務(wù)?
TCP有一套差錯(cuò)恢復(fù)機(jī)制,

發(fā)送方的發(fā)送窗口為1,接收方的接受窗口為N,

發(fā)送方具有一個(gè)定時(shí)器,記錄當(dāng)前發(fā)送出去的數(shù)據(jù)n是否有被接收方正確的接收到(通過ACK)

假設(shè)發(fā)送方現(xiàn)在從0、1、2、3的順序開始發(fā)起數(shù)據(jù)段,

第一種情況:

接收方等待0號數(shù)據(jù),并收到了0號數(shù)據(jù),則回饋ACK1,

表示我已經(jīng)接受到了0號數(shù)據(jù),現(xiàn)在我想要1號數(shù)據(jù)。

發(fā)送方就會(huì)重啟定時(shí)器等待下一個(gè)ACK的到來

如果定時(shí)器0超時(shí)(ack1未成功回饋或者0號數(shù)據(jù)發(fā)送失?。﹦t會(huì)重傳0號數(shù)據(jù)

定時(shí)器超時(shí),重傳的情況:

定時(shí)器超時(shí),重傳的情況

第二種情況:

接收方等待0號數(shù)據(jù),但收到了1號數(shù)據(jù),則會(huì)回饋ACK0,

表示我雖然收到了1數(shù)據(jù),但我現(xiàn)在在等待0號數(shù)據(jù),請您發(fā)0號數(shù)據(jù)給我

如果后續(xù)接收方收到了0號數(shù)據(jù),則接收方會(huì)直接回饋ACK2,發(fā)送方就會(huì)重啟定時(shí)器等待下一個(gè)ACK(ACK3)的到來

直接回饋:

直接回饋的情況.png

如果接收方遲遲收不到0號數(shù)據(jù),發(fā)送方在一段時(shí)間后會(huì)因?yàn)?strong>定時(shí)器或快速重傳機(jī)制選擇消息重發(fā)

一種特殊的情況,如果接收方收到了1、2、3,發(fā)送了3個(gè)ACK1,此時(shí)發(fā)送方收到3個(gè)冗余ACK1后會(huì)直接認(rèn)為0號數(shù)據(jù)已經(jīng)丟失了,此時(shí)則會(huì)發(fā)生快速重傳

快速重傳:

快速重傳.png

擁塞控制

在某段時(shí)間,若對網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡(luò)性能就要變壞,這種情況就叫做網(wǎng)絡(luò)擁塞。

在計(jì)算機(jī)網(wǎng)絡(luò)中數(shù)位鏈路容量(即帶寬)、交換結(jié)點(diǎn)中的緩存和處理機(jī)等,都是網(wǎng)絡(luò)的資源。

若出現(xiàn)擁塞而不進(jìn)行控制,整個(gè)網(wǎng)絡(luò)的吞吐量將隨輸入負(fù)荷的增大而下降。

發(fā)送方維護(hù)一個(gè)cwnd,擁塞控制窗口,該窗口的大小直接影響發(fā)送速率,控制速率的算法分為慢啟動(dòng)、擁塞避免、快速恢復(fù)過程

慢啟動(dòng):cwnd每過一個(gè)RTT翻倍遞增,
擁塞避免:cwnd每過一個(gè)RTT逐漸遞增1
快速回復(fù):ssthrest=cwnd/2,cwnd=ssthrest,此時(shí)會(huì)直接像擁塞避免那樣逐漸遞增1。

  • 慢啟動(dòng) - > 擁塞避免狀態(tài) 是如何轉(zhuǎn)折的?
    首先,如果第一次碰到丟包事件,cwnd=1并重新開始慢啟動(dòng)過程,它還會(huì)更新ssthrest=cwnd/2,
    在之后的過程中,如果檢測到當(dāng)前cwnd>=ssthrest,則慢啟動(dòng)就會(huì)變?yōu)閾砣苊鉅顟B(tài)。
    如果再遇到丟包事件,會(huì)首先判斷是ACK III觸發(fā)還是TIMEOUT觸發(fā)
    如果是ACKIII 會(huì)進(jìn)入快速恢復(fù)階段
    如果是TIMEOUT,則和之前邏輯相同
擁塞控制算法.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容