面试题:谈谈你对TCP的认识
一 TCP
1. 簡(jiǎn)介
首先,TCP是一個(gè)傳輸層協(xié)議,提供進(jìn)程到進(jìn)程之間的可靠性數(shù)據(jù)傳輸服務(wù),還提供流量控制和差錯(cuò)控制等機(jī)制。
其次,TCP是面向連接的,其通信模式是全雙工的;面向連接是指:
- 在發(fā)送數(shù)據(jù)之前必須建立連接;
- 連接狀態(tài)只在兩端維護(hù),沿途節(jié)點(diǎn)不維護(hù);
連接建立需要進(jìn)行三次握手,關(guān)閉連接需要進(jìn)行四次揮手;
接下來(lái)面試官會(huì)問(wèn)可靠性數(shù)據(jù)傳輸?shù)脑怼⒘髁靠刂啤⒉铄e(cuò)控制、三次握手和四次揮手等;
二 TCP的可靠性傳輸
1. TCP的可靠性傳輸原理
- 流水線機(jī)制;
- 累計(jì)確認(rèn);
- TCP使用單一重傳定時(shí)器,當(dāng)超時(shí)或收到重復(fù)的ACK會(huì)觸發(fā)重傳事件;
- 其它的還有使用序列號(hào)對(duì)TCP報(bào)文段進(jìn)行排序和丟掉重復(fù)的報(bào)文段;使用校驗(yàn)和檢查錯(cuò)誤的報(bào)文段;
2. 流水線機(jī)制
流水線機(jī)制,允許發(fā)送方在收到ACK之前,可以連續(xù)的發(fā)送多個(gè)分組,發(fā)送方和接收方需要更大的存儲(chǔ)空間以緩存分組。
3. 累計(jì)確認(rèn)
接收方收到序列號(hào)1、2、3、4和5的包,不必每個(gè)都確認(rèn),只需確認(rèn)第5個(gè)就行,當(dāng)發(fā)送方收到接收方對(duì)5的確認(rèn)ACK后,就明白接收方前5個(gè)都已經(jīng)正確接收。
4. 超時(shí)重傳和快速重傳
超時(shí)重傳:發(fā)送端發(fā)送報(bào)文后,由于長(zhǎng)時(shí)間沒(méi)有收到ACK(該分組還在路上或者丟失),所以會(huì)重傳當(dāng)前分組;同時(shí)定時(shí)器RTO(Retransmission Timeout)會(huì)加倍。如果再次超時(shí),定時(shí)器會(huì)再次加倍。
快速重傳:如果發(fā)生超時(shí),TCP的定時(shí)器的時(shí)間會(huì)設(shè)置到很大,重發(fā)丟失分組之前要等很長(zhǎng)時(shí)間。因此需要通過(guò)重復(fù)的ACK檢測(cè)分組丟失,如果發(fā)送方收到同一個(gè)數(shù)據(jù)的3個(gè)ACK,則會(huì)假定該分組已經(jīng)丟失,會(huì)立即重傳。
三 流量控制和擁塞控制
流量控制是接收方和發(fā)送方的問(wèn)題,而擁塞控制是整個(gè)網(wǎng)絡(luò)的問(wèn)題。
1. 流量控制
在TCP的報(bào)頭中,有一個(gè)receive window的字段,接收方會(huì)通過(guò)設(shè)置該字段存儲(chǔ)自己緩沖區(qū)的可用空間。這樣發(fā)送方將會(huì)限制自己已發(fā)送但還未收到ACK的數(shù)據(jù)不超過(guò)接收方的可用空間。當(dāng)RecvWindow為0時(shí),為了避免死鎖,發(fā)送方還是會(huì)發(fā)送很小的數(shù)據(jù)段。
2. 擁塞控制
通過(guò)限制發(fā)送發(fā)的發(fā)送速率來(lái)進(jìn)行擁塞控制:
CongWin(congest window)被稱作擁塞窗口,最后一個(gè)發(fā)送的字節(jié)減去最后一個(gè)被確認(rèn)過(guò)的字節(jié)序列號(hào),要小于等于CongWin。發(fā)送速率:
rate≈CongWin/RTT (Bytes/sec)動(dòng)態(tài)調(diào)整CongWin以改變發(fā)送速率。
注:在早期版本,當(dāng)發(fā)生擁塞后直接將CongWin置為1,現(xiàn)在是將其置為原來(lái)的一半;
如何動(dòng)態(tài)調(diào)整發(fā)送速率,可以總結(jié)為:
**加性增-乘性減;
慢啟動(dòng);**
慢啟動(dòng)并不是指增長(zhǎng)速度慢,而是指初始速率低,初始速率為1,然后每收到一個(gè)ACK,就將CongWin翻倍,直到達(dá)到閾值的一半;
加性增是指到達(dá)閾值的一半后,每次讓CongWin增加1,而乘性減是當(dāng)發(fā)生loss事件后,將CongWin減為原來(lái)的一半(也可能置為1);
lose事件:收到3個(gè)重復(fù)的ACK或者超時(shí);
總結(jié):
當(dāng)CongWin低于閾值的時(shí)候,發(fā)送者處于慢啟動(dòng)階段,CongWin指數(shù)增長(zhǎng);
當(dāng)CongWin高于閾值,發(fā)送者處于擁塞避免階段,CongWin線性增長(zhǎng);
當(dāng)收到3個(gè)重復(fù)的ACK,閾值設(shè)置為CongWin的一半,CongWin設(shè)置為閾值,然后進(jìn)行線性增長(zhǎng);
當(dāng)超時(shí)發(fā)生,閾值設(shè)置為CongWin的一半,CongWin設(shè)置為1,然后進(jìn)行指數(shù)增長(zhǎng);
最后三次握手和四次揮手請(qǐng)參考:https://blog.csdn.net/qq_38038480/article/details/80569651
總結(jié)
以上是生活随笔為你收集整理的面试题:谈谈你对TCP的认识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SQL Server大量数据秒级插入/新
- 下一篇: 计算机ppt文字1是什么原因,ppt让答