看完這篇TCP,和面試官扯皮就沒問題了

2021-10-03 23:50:42 字數 3472 閱讀 2053

無論什麼技術崗位,計算機網路幾乎是每場面試的必問內容,在面試**現的次數非常非常多,所以我面試之前也有所準備。看到csdn上介紹http的部落格比較多,tcp的比較少,於是今天結合面試問題先詳細講一講tcp

這部分之所以放在最前面,因為太重要!太重要!!太重要了!!!

源埠、目標埠:計算機上的程序要和其他程序通訊是要通過計算機埠的,而乙個計算機埠某個時刻只能被乙個程序占用,所以通過指定源埠和目標埠,就可以知道是哪兩個程序需要通訊。源埠、目標埠是用 16 位表示的,可推算計算機的埠個數為 2^16 個。

序列號:表示本報文段所傳送資料的第乙個位元組的編號。在 tcp 連線中所傳送的位元組流的每乙個位元組都會按順序編號。由於序列號由 32 位表示,所以每 2^32 個位元組,就會出現序列號迴繞,再次從 0 開始。那如何區分兩個相同序列號的不同 tcp 報文段就是乙個問題了,後面會有答案,暫時可以不管。

確認號:表示接收方期望收到傳送方下乙個報文段的第乙個位元組資料的編號。也就是告訴傳送發:我希望你(指傳送方)下次傳送的資料的第乙個位元組資料的編號是這個確認號。也就是告訴傳送方:我希望你(指傳送方)下次傳送給我的 tcp 報文段的序列號字段的值是這個確認號。

tcp 首部長度:由於 tcp 首部包含乙個長度可變的選項部分,所以需要這麼乙個值來指定這個 tcp 報文段到底有多長。或者可以這麼理解:就是表示 tcp 報文段中資料部分在整個 tcp 報文段中的位置。該字段的單位是 32 位字,即:4 個位元組。

urg:表示本報文段中傳送的資料是否包含緊急資料。urg=1,表示有緊急資料。後面的緊急指標字段只有當 urg=1 時才有效。

ack:表示是否前面的確認號字段是否有效。ack=1,表示有效。只有當 ack=1 時,前面的確認號字段才有效。tcp 規定,連線建立後,ack 必須為 1。

psh:告訴對方收到該報文段後是否應該立即把資料推送給上層。如果為 1,則表示對方應當立即把資料提交給上層,而不是快取起來。

rst:只有當 rst=1 時才有用。如果你收到乙個 rst=1 的報文,說明你與主機的連線出現了嚴重錯誤(如主機崩潰),必須釋放連線,然後再重新建立連線。或者說明你上次傳送給主機的資料有問題,主機拒絕響應。

syn:在建立連線時使用,用來同步序號。當 syn=1,ack=0 時,表示這是乙個請求建立連線的報文段;當 syn=1,ack=1 時,表示對方同意建立連線。syn=1,說明這是乙個請求建立連線或同意建立連線的報文。只有在前兩次握手中 syn 才置為 1。

fin:標記資料是否傳送完畢。如果 fin=1,就相當於告訴對方:「我的資料已經傳送完畢,你可以釋放連線了」

視窗大小:表示現在執行對方傳送的資料量。也就是告訴對方,從本報文段的確認號開始允許對方傳送的資料量。

緊急指標:標記緊急資料在資料字段中的位置。

選項部分:其最大長度可根據 tcp 首部長度進行推算。tcp 首部長度用 4 位表示,那麼選項部分最長為:(2^41. 1)*41. 20=40 位元組。

tcp在ip層提供的不可靠服務基礎上實現可靠資料傳輸服務

快速重傳機制: 在定時器超時之前即進行重傳。如果發生超時,將超時時間間隔加倍。

tcp重傳示例

利用滑動視窗實現流量控制。如果傳送方把資料傳送得過快,接收方可能會來不及接收,這就會造成資料的丟失。所謂流量控制就是讓傳送方的傳送速率不要太快,要讓接收方來得及接收。

接收方為tcp連線分配buffer(速度匹配機制)

接收視窗(rcvwindow) = buffer中的可用空間 = rcvbuffer – [lastbytercvd – lastbyteread]

receiver將rcvwindow告知sender(如果rcvwindow會怎麼樣)

sender限制自己已經傳送的但還沒收到ack的資料

別看放在最後,因為是壓軸的知識點,很重要!

慢啟動指先把擁塞視窗cwnd設定為乙個最大報文段mss的數值,在每收到乙個對新的報文段的確認後,把擁塞視窗增加至多乙個mss的數值,在每經過乙個往返時間rtt,擁塞視窗w***就加倍。

慢啟動的「慢」並不是指cwnd的增長速度慢,而是指在tcp開始傳送報文段時先設定cwnd=1,使得傳送方在開始時只傳送乙個報文段(目的是探測一下網路的擁塞情況)

讓擁塞視窗cwnd緩慢地增大,即每經過乙個往返時間rtt就把傳送方的擁塞視窗cwnd加1,而不是加倍。

當cwnd < ssthresh時,使用上述的慢啟動演算法;

當cwnd > ssthresh時,停止使用慢啟動演算法而改用擁塞避免演算法;

當cwnd = ssthresh時,即可使用慢啟動演算法,也可以使用擁塞避免演算法;

快速重傳演算法首先要求接收方每收到乙個失序的報文段後就立即發出重複確認(為的是使傳送方及早知道有報文段沒有達到對方)而不要等到自己傳送資料時才進行捎帶確認。

快重傳演算法規定,傳送方只要一連收到3個重複確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設定的重傳計數器時間到期。

當傳送方連續收到三個重複確認,就執行「乘法減小」演算法,把慢開始門限ssthresh減半。這是為了 預防網路發生擁塞。請注意:接下去不執行慢開始演算法。

與慢開始不同之處是現在不執行慢開始演算法(即擁塞視窗cwnd現在不設定為1),而是把cwnd值設定為慢開始門限ssthresh減半後的數值,然後開始執行擁塞避免演算法,使擁塞視窗緩慢地線性增大。

參考:

咱們玩歸玩,鬧歸鬧,別拿面試開玩笑。

tcp的知識點多,話題性自然也多。,面試官問的問題往往都是有關聯性的,一旦問到了,大家一定要回答全面,不要丟三落四,回答到點上。tcp的三次握手、四次揮手是最常問的內容,在面試**現的次數非常非常多,大家面試前要把http、tcp等計算機網路的基礎打牢。

看完這篇單例模式,終於敢和面試官對線了

三 推 列舉模式 四 推 holder模式 五 總結 不想看過程的可以直接看結果 執行緒安全 懶載入反射破壞 餓漢模式 類載入就建立物件確保執行緒安全 立即載入 能避免懶漢模式 synchronized synchronized對方法加鎖 懶載入不能避免 雙重檢測鎖 volatile jdk 1.5...

HashMap怎麼和面試官講清楚?

集合中我們經常使用的就是hashmap,我們知道它的底層實現是hash桶外加鍊錶的方式來進行儲存資料的,但是底層又是如何進行具體實現的,我們可能真的說不清除。現在我們從原始碼層次上進行講解hashmap的原理 get方法的底層實現 先看下原始碼 我們傳入key的引數,底層呼叫的是getnode的方式...

求職者和面試官如何做好電話面試

面試方式有很多種,其中 面試是較為特殊性的,因為雙方不是面對面,而是通過 傳聲的,所以作為求職者和面試官如何做好 面試呢?應聘者應對 面試?1 主動選擇通話時間 接到 的地點可能在任何地方,街道 商場 公共汽車站等等,這些地方聲音嘈雜,不利於溝通,這時,你可以主動要求另約時間再聯絡,如說 對不起,我...