計算機網(wǎng)絡之傳輸層

這一層是面試的重點物延。在這里總結一下输玷。

首先先看一下傳輸層位于哪一層。

TCP

可以看到傳輸層主要有UDP和TCP兩種協(xié)議矗积。我們先來看一下較為復雜的TCP協(xié)議具伍。TCP與UDP不同的是TCP是一個可靠數(shù)據(jù)傳輸協(xié)議澄惊。TCP中有幾個比較重要的機制:(1)超時與重傳機制 (2)流量控制機制 (3)擁塞控制機制搪柑。TCP包中的包頭也有相應的字段用來實現(xiàn)相關字段薄腻。我們來看一下TCP包的包頭岛马。


我們來說一下幾個字段存在的意義棉姐。

我們來說一下幾個字段存在的意義。

1. seq number和 ack number用于實現(xiàn)超時和重傳機制啦逆。同時擁塞控制也會用到伞矩。

2. receive window用于流量控制。

流量控制

流量控制存在的意義是使得發(fā)送方的發(fā)送速率和接收方的處理速率相匹配夏志。避免出現(xiàn)發(fā)送方發(fā)送數(shù)據(jù)過快而接收方無法及時處理的問題乃坤。具體操作就是在接收方的ack包中帶上receive window字段保證發(fā)送端發(fā)送的速率不至于過快。

超時與重傳

在實現(xiàn)超時與重傳時沟蔑,tcp使用了ack和seq號來做相關處理湿诊。我們先來了解一下這個seq和ack的使用方法。實際上seq是代表當前包的序列號在發(fā)送端發(fā)送的時候帶上瘦材,ack是接收端收到的包的序列號(實際上TCP的ack是指定的收到的包的下一個即期望收到的包的序列號)在接收端收到的時候返回給發(fā)送端表明這個包我收到了厅须。如果接收端發(fā)送的序列號和發(fā)送端期望收到的不一樣的話發(fā)送端就能知道發(fā)生了丟包。從而使用對應的機制來重傳食棕。超時重傳的機制主要有兩種:回退N幀和選擇重傳

回退N幀

回退N幀的本質就是使用累計確認的方式即我發(fā)了12345 5個包只要我收到了第五個包的ack就表明我收到了5之前的所有包朗和。但是如果發(fā)生了失序的包比如1245少了一個3失序的包全部丟棄返回收到ack2的信息。所以回退N幀的N就是這里來的簿晓,即發(fā)送方要重傳丟掉的包和之后的所有的包眶拉。看一個圖就清楚了抢蚀。

選擇重傳

選擇重傳則是針對每一個包進行ack镀层,如果某個包超時還沒有收到ack那么重傳對應的包。對失序的包進行緩存皿曲。

TCP的重傳機制

TCP借鑒了gbn和selective repeat的優(yōu)點使用了帶累計確認的選擇重傳唱逢。即對失序的包進行存儲,同時返回累計確認的ack number屋休。

擁塞控制

擁塞控制存在的意義是保證發(fā)送和接收方的速率不超過鏈路的承載量坞古。避免出現(xiàn)使用速率過快,比如發(fā)送的數(shù)據(jù)包超過了鏈路承載的速率導致頻繁丟包劫樟。在實現(xiàn)擁塞控制時痪枫,tcp使用了ack和seq號來做相關處理。

其實主要就是分為3個階段:

1 慢啟動階段

cwnd設置為1個MSS叠艳,在這個階段cwnd(congestion window) 指數(shù)形式增長奶陈,直到出現(xiàn)超時或三次重復ack或者到達設定閾值。到達閾值切換為擁塞避免階段附较。超時進入慢啟動階段吃粒,三次重復ack進入快速恢復階段。

2 擁塞避免階段

在這個階段cwnd線性增長拒课,直到出現(xiàn)超時或三次重復ack徐勃。超時進入慢啟動階段,三次重復ack進入快速恢復階段早像。

**3 快速恢復階段**

cwnd設置為三次重復ack前的一半(reno)還有一種是tahoe這種處理方式直接將狀態(tài)切換為慢啟動僻肖。然后切換為擁塞階段。如果超時切換為慢啟動階段卢鹦。

著名的三次握手與四次揮手

tcp在建立連接的時候需要進行三次握手臀脏,在斷開連接的時候要進行四次揮手。

具體流程見圖

握手流程圖

首先要搞清楚為什么需要三次握手建立連接冀自∷瘢看了很多博客和回答,我個人總結的根本原因是兩個:同步雙方的信息更新當前的狀態(tài)凡纳。如果我們使用兩次握手會有什么問題呢窃植?即A-> B發(fā)送SYN信息,B收到A的信息以后發(fā)送一個ACK回去就視為連接已經建立荐糜。

1.? 資源的浪費

比如A->B發(fā)了一個SYN包巷怜。SYN超時后重傳一個新的SYN和新的隨機seq number。但是B收到舊的SYN包的時候會視為一個有效的請求并分配資源返回一個ACK給A暴氏。但是A已經不會理會這個舊的ACK了只會用新的SYN建立的連接進行通信延塑。B就會傻傻的等一個永遠不會發(fā)送信息的連接(屆不到的愛戀)。出現(xiàn)這個問題的原因就是狀態(tài)沒有更新答渔。B不知道A的狀態(tài)已經變化了关带。如果使用三次握手機制A在收到一個舊的ACK的時候就會發(fā)RST告訴B這個鏈接已經不要了從而更新狀態(tài)。

2. 協(xié)商SEQ

在超時重傳機制里SEQ和ACK是實現(xiàn)機制的重要信息之一。通過三次握手可以同步雙方的信息A告訴B說要用這個seq宋雏,B->A B->A說好我使用這個seq芜飘。這樣就可以同步從A->B這個方向的seq。但是B->A也需要一組磨总。但是在B->A這一步既可以確認A->B的seq也可以發(fā)送B->A的seq嗦明。因此本來應該四步的操作可以簡化為3步。這樣就可以同步兩方的seq信息蚪燕。

常見面試題

1.為什么要三次握手?

見上面的解析

2.SYN Seq Num的初始值是固定的嗎娶牌?

不是的。是由一個初始序列號( initial sequence number ISN)生成器生成的馆纳。這個生成器會用一個32位長的時鐘诗良,差不多4μs增長一次,因此 ISN 會在大約 4.55 小時循環(huán)一次

(2^32位的計數(shù)器鲁驶,需要2^32*4 μs才能自增完鉴裹,除以1小時共有多少μs便可算出2^32*4 /(1*60*60*1000*1000)=4.772185884)

而一個段在網(wǎng)絡中并不會比最大分段壽命(Maximum Segment Lifetime (MSL) ,默認使用2分鐘)長灵嫌,MSL 比4.55小時要短壹罚,所以我們可以認為 ISN 會是唯一的。

3. 為什么ISN要是隨機的值寿羞?

1. 防止舊的連接的包對新的連接產生影響猖凛。比如有一個舊的連接的數(shù)據(jù)包滯留在鏈路中,等到屬于他的連接關閉了才到目的地點绪穆。如果每次都是固定值辨泳,接收方可能將其視為當前連接的數(shù)據(jù)包。

2. 安全考慮玖院,由于是隨機的猜測將更加困難菠红。如果攻擊者沒有辦法監(jiān)聽流量產生一個seq在接收窗口的數(shù)據(jù)包就十分困難。

4.什么是SYN攻擊

系統(tǒng)會維護一個半連接隊伍难菌。即接收方已經向發(fā)送方發(fā)送ack但是還沒有收到回復的隊列试溯。攻擊者可以偽造IP短時間大量發(fā)送SYN請求,收到請求后不發(fā)ack郊酒。而服務端還需要維護這些資源從而達到dos攻擊的目的遇绞。

5. 為什么在前兩次握手不可以帶數(shù)據(jù)

主要是為了安全考慮,如果在前兩次就可以帶數(shù)據(jù)的話燎窘。服務器就需要分配資源存儲這些還沒有建立連接的對端發(fā)來的數(shù)據(jù)庫摹闽。如果惡意攻擊者發(fā)送大量SYN數(shù)據(jù)包就很容易成功實施dos攻擊。

揮手流程圖

這里可以看出來褐健,在關閉連接的時候多了一次揮手流程付鹿。原因是在接收端收到FIN請求包的時候可能還在處理數(shù)據(jù),比如還有數(shù)據(jù)沒有發(fā)。因此并不能立刻關閉socket舵匾,只能發(fā)一個ACK包告訴請求發(fā)起端你的FIN請求我收到了俊抵。等到接收端處理完畢后才會發(fā)FIN。因此多了一次握手過程纽匙。這里有兩個比較重要的狀態(tài)一個是請求發(fā)起關閉連接端的TIME_WAIT的狀態(tài)和收到關閉連接端的CLOSE_WAIT狀態(tài)务蝠。

常見面試題

1 為什么要四次揮手拍谐?

見上文

2 為什么client要等 2個MSL再徹底關閉連接烛缔?

1. 為了防止最后一次揮手的ack包丟包,如果在TIMED_WAIT階段受到重復的FIN包則會重發(fā)最后一個ACK包轩拨。2. 防止當前連接的數(shù)據(jù)包對下一個連接的影響践瓷,經過兩根MSL可以認為鏈路中已經沒有關于這個連接的數(shù)據(jù)包了。

3. server存在過多time-wait階段的連接怎么處理亡蓉?

1. 可以修改linux編譯內核選項允許CLOSE_WAIT狀態(tài)的端口重用 晕翠。2. 可以修改內核選項允許加速回收。

UDP

和TCP相比UDP就簡單很多了砍濒。UDP是一個無連接的不保障可靠性的傳輸層協(xié)議淋肾。

UDP的包頭

從包頭可以看出UDP與TCP不同的是UDP多了一個length。UDP本質是基于包的協(xié)議爸邢,而TCP是基于流的協(xié)議樊卓。因此TCP才會有著名的粘包問題。并且UDP是不包含源IP和目的IP的杠河。因此在傳輸層UDP復用機制與TCP不同碌尔。UDP針對目的IP和目的端口號相同的請求會由一個進程處理,而TCP會由兩個來處理券敌。

UDP的復用機制

TCP復用機制

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末唾戚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子待诅,更是在濱河造成了極大的恐慌叹坦,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卑雁,死亡現(xiàn)場離奇詭異募书,居然都是意外死亡,警方通過查閱死者的電腦和手機序厉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門锐膜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弛房,你說我怎么就攤上這事道盏。” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵荷逞,是天一觀的道長媒咳。 經常有香客問我,道長种远,這世上最難降的妖魔是什么涩澡? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坠敷,結果婚禮上妙同,老公的妹妹穿的比我還像新娘。我一直安慰自己膝迎,他們只是感情好粥帚,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著限次,像睡著了一般芒涡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卖漫,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天费尽,我揣著相機與錄音,去河邊找鬼羊始。 笑死旱幼,一個胖子當著我的面吹牛,可吹牛的內容都是我干的店枣。 我是一名探鬼主播速警,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸯两!你這毒婦竟也來了闷旧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钧唐,失蹤者是張志新(化名)和其女友劉穎忙灼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钝侠,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡该园,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帅韧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片里初。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忽舟,靈堂內的尸體忽然破棺而出双妨,到底是詐尸還是另有隱情淮阐,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布刁品,位于F島的核電站泣特,受9級特大地震影響,放射性物質發(fā)生泄漏挑随。R本人自食惡果不足惜状您,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兜挨。 院中可真熱鬧膏孟,春花似錦、人聲如沸暑劝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽担猛。三九已至,卻和暖如春丢氢,著一層夾襖步出監(jiān)牢的瞬間傅联,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工疚察, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒸走,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓貌嫡,卻偏偏與公主長得像比驻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岛抄,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355