1. 簡介
首先,tcp是乙個傳輸層協議,提供程序到程序之間的可靠性資料傳輸服務,還提供流量控制和差錯控制等機制。
其次,tcp是面向連線的,其通訊模式是全雙工的;面向連線是指:
連線建立需要進行三次握手,關閉連線需要進行四次揮手;
接下來面試官會問可靠性資料傳輸的原理、流量控制、差錯控制、三次握手和四次揮手等;
1. tcp的可靠性傳輸原理
2. 流水線機制
流水線機制,允許傳送方在收到ack之前,可以連續的傳送多個分組,傳送方和接收方需要更大的儲存空間以快取分組。
3. 累計確認
接收方收到序列號1、2、3、4和5的包,不必每個都確認,只需確認第5個就行,當傳送方收到接收方對5的確認ack後,就明白接收方前5個都已經正確接收。
4. 超時重傳和快速重傳
超時重傳:傳送端傳送報文後,由於長時間沒有收到ack(該分組還在路上或者丟失),所以會重傳當前分組;同時定時器rto(retransmission timeout)會加倍。如果再次超時,定時器會再次加倍。
快速重傳:如果發生超時,tcp的定時器的時間會設定到很大,重發丟失分組之前要等很長時間。因此需要通過重複的ack檢測分組丟失,如果傳送方收到同乙個資料的3個ack,則會假定該分組已經丟失,會立即重傳。
流量控制是接收方和傳送方的問題,而擁塞控制是整個網路的問題。
1. 流量控制
在tcp的報頭中,有乙個receive window的字段,接收方會通過設定該欄位儲存自己緩衝區的可用空間。這樣傳送方將會限制自己已傳送但還未收到ack的資料不超過接收方的可用空間。當recvwindow為0時,為了避免死鎖,傳送方還是會傳送很小的資料段。
2. 擁塞控制
通過限制傳送發的傳送速率來進行擁塞控制:
lastbytesent-lastbyteacked <= congwin
congwin(congest window)被稱作擁塞視窗,最後乙個傳送的位元組減去最後乙個被確認過的位元組序列號,要小於等於congwin。傳送速率:
rate≈congwin/rtt (bytes/sec)
動態調整congwin以改變傳送速率。
注:在早期版本,當發生擁塞後直接將congwin置為1,現在是將其置為原來的一半;
如何動態調整傳送速率,可以總結為:
**加性增-乘性減;
慢啟動;**
慢啟動並不是指增長速度慢,而是指初始速率低,初始速率為1,然後每收到乙個ack,就將congwin翻倍,直到達到閾值的一半;
加性增是指到達閾值的一半後,每次讓congwin增加1,而乘性減是當發生loss事件後,將congwin減為原來的一半(也可能置為1);
lose事件:收到3個重複的ack或者超時;
總結:
當congwin低於閾值的時候,傳送者處於慢啟動階段,congwin指數增長;
當congwin高於閾值,傳送者處於擁塞避免階段,congwin線性增長;
當收到3個重複的ack,閾值設定為congwin的一半,congwin設定為閾值,然後進行線性增長;
當超時發生,閾值設定為congwin的一半,congwin設定為1,然後進行指數增長;
最後三次握手和四次揮手請參考:
面試題 談談你對hibernate的理解
說說這類問題一般要和乙個東西比較,說說他們的優點和缺點,hibernate就和jdbc比較唄,你就說說jdbc的優缺點,然後說說hibernate的優缺點,最後對比得出hibernate更好。hibernate 1 運算元據庫的框架 底層是通過jdbc運算元據庫的 2 用物件導向的方式運算元據庫 2...
面試題 談談你對對vuex的理解
當面試官問我們對vuex的理解的時候,我們不能只說 vuex是乙個專為vue.js應用程式開發的狀態管理模式 盡量不要讓面試官連續追問 總會問到自己不會的然後說你實力還差那麼點來可以得降薪 應該從三個方面一次性去說清楚 1.vuex是什麼?2.vuex的核心概念 3.為什麼要用vuex?對於問題一,...
面試官 談談你對mysql事務的認識
今天回頭繼續講講資料庫系列的文章。這篇文章屬於mysql資料庫系列,我們來談談事務方面的常見面試題。那麼,具體題目有下面這些 1 講講為什麼用事務?事務的四大特性?事務的隔離級別知道吧,你們生產用哪種?2 innodb中acid具體是如何實現的?3 redo log和binlog的一致性如何保證?4...