如何學(xué)習(xí) TCP 協(xié)議圣勒,這篇給你整的明明白白的膝迎!

點(diǎn)擊上方 "程序員小樂(lè)"關(guān)注, 星標(biāo)或置頂一起成長(zhǎng)

每天凌晨00點(diǎn)00分, 第一時(shí)間與你相約

每日英文

You will meet two kinds of people in life: ones who build you up and ones who tear you down. But in the end, you'll thank them both.

生命中你會(huì)遇到兩種人:一種是鼓勵(lì)你的人盆色,一種是打擊你的人灰蛙,最終,這兩者都要感謝隔躲。

每日掏心話

空是靜的極致摩梧。放下得失心,執(zhí)著而不固執(zhí)宣旱,放下而不放棄仅父,看開(kāi)而不看破,才能不被外物所左右浑吟。

來(lái)自:liweisnake | 責(zé)編:樂(lè)樂(lè)

鏈接:blog.csdn.net/liweisnake/article/details/51924474

image

程序員小樂(lè)(ID:study_tech)第 911 次推文 圖源:百度

往日回顧:為什么要放棄 Lombok 笙纤?

正文

TCP協(xié)議目前是事實(shí)上的網(wǎng)絡(luò)基礎(chǔ)。許多更高層的應(yīng)用協(xié)議HTTP,FTP都基于TCP组力。

TCP協(xié)議的學(xué)習(xí)可以說(shuō)枯燥無(wú)比省容,尤其是學(xué)生階段,根本不知道用在什么地方燎字,根本不知道重要性是什么腥椒。事實(shí)上是,基于目前的網(wǎng)絡(luò)發(fā)展和分布式發(fā)展候衍,TCP簡(jiǎn)直就是基礎(chǔ)中的基礎(chǔ)笼蛛。許多網(wǎng)絡(luò)的問(wèn)題,配置蛉鹿,入侵滨砍,防御乃至架構(gòu),都涉及到TCP的具體應(yīng)用及機(jī)制。

以下是我總結(jié)的TCP學(xué)習(xí)過(guò)程惋戏,

1. 了解學(xué)習(xí)TCP協(xié)議的重要性和必要性领追,了解TCP協(xié)議為什么被發(fā)展出來(lái)

推薦這個(gè)問(wèn)題下的各個(gè)回答:TCP/IP 協(xié)議到底在講什么?

https://www.zhihu.com/question/51074319

2. 學(xué)習(xí)TCP協(xié)議的三次握手以及四次揮手日川,重點(diǎn)了解為什么要三次握手,為什么要四次揮手矩乐,在整個(gè)過(guò)程中狀態(tài)是如何變遷的龄句。(經(jīng)典的狀態(tài)圖以及握手揮手圖)

a.為什么要三次握手?不是一次散罕,兩次或者四次分歇。我們來(lái)論證一下,如果只有一次會(huì)發(fā)生什么情況欧漱,a向b發(fā)起連接請(qǐng)求职抡,假設(shè)b沒(méi)收到,則b其實(shí)完全不知道a發(fā)起了請(qǐng)求误甚,而a也完全不知道b收沒(méi)收到缚甩,所以一次握手是不可靠的;如果兩次握手呢窑邦,a向b發(fā)起連接請(qǐng)求擅威,b收到a的請(qǐng)求給a回復(fù)一個(gè)請(qǐng)求,假設(shè)此時(shí)a收到了b的回復(fù)冈钦,a知道了b已經(jīng)ready了郊丛,可b完全不知道a是否ready,有可能a并沒(méi)有收到b的請(qǐng)求瞧筛,也有可能收到了厉熟,但這些b都完全不知道,所以只是單向的建立了連接较幌;如果是四次握手呢揍瑟,其實(shí)第2次讓a知道b ready了,第三次讓b知道a也ready了乍炉,第四次完全就是多余了月培,會(huì)浪費(fèi)網(wǎng)絡(luò)資源。

b.為什么要四次揮手恩急?不是3次杉畜?實(shí)際上兩邊連接完全可以分開(kāi)看,用2次揮手?jǐn)嚅_(kāi)其中一邊連接衷恭,用另外2次揮手?jǐn)嚅_(kāi)另一邊的連接此叠,最終完成整個(gè)連接關(guān)閉。之所以這樣設(shè)計(jì)随珠,是因?yàn)橛锌赡苣骋贿厰?shù)據(jù)還未傳輸完灭袁,連接還未關(guān)閉猬错。因?yàn)門(mén)CP被設(shè)計(jì)為全雙工協(xié)議,可以任何一邊單向發(fā)送數(shù)據(jù)茸歧。

1. 握手及揮手過(guò)程

image

2. TCP的狀態(tài)轉(zhuǎn)換圖

image

3. 學(xué)習(xí)TCP協(xié)議是如何保持可靠性設(shè)計(jì)的倦炒。

主要目的是用來(lái)參考,以便在其他通信場(chǎng)合時(shí)用作架構(gòu)和設(shè)計(jì)的參考

1).包應(yīng)答序列號(hào)及包****重組软瞎。

面臨的問(wèn)題:網(wǎng)絡(luò)傳輸中逢唤,會(huì)出現(xiàn)數(shù)據(jù)的破壞,丟包涤浇,重復(fù)鳖藕,分片混亂等問(wèn)題。

本質(zhì)上只锭,要想保證傳輸?shù)目煽啃灾鳎瑒t需要對(duì)傳輸?shù)膬?nèi)容進(jìn)行驗(yàn)證。

a. 對(duì)于網(wǎng)絡(luò)數(shù)據(jù)的破壞(比如宇宙射線影響偷笑導(dǎo)致發(fā)射火箭的數(shù)據(jù)中某一位從0變?yōu)?)蜻展,采取的策略是丟棄重新發(fā)送喉誊,以確保不會(huì)出現(xiàn)致命的錯(cuò)誤。TCP在自身協(xié)議中單獨(dú)劃了一塊checksum用于這種校驗(yàn)纵顾,校驗(yàn)算法本質(zhì)上是將整塊數(shù)據(jù)通過(guò)某個(gè)函數(shù)映射到16位的校驗(yàn)位上(比如用字符相加的和來(lái)校驗(yàn))

image

b. 對(duì)于數(shù)據(jù)傳輸正確裹驰,但是分片亂序,重復(fù)等問(wèn)題片挂,或是丟包幻林,采取的策略并非丟棄而是自行進(jìn)行包重組。

考慮兩種情況:第一種情況是某個(gè)包缺少了音念,導(dǎo)致整個(gè)數(shù)據(jù)中間缺了一段1000字節(jié)沪饺,那么如何通知到對(duì)方自己少了哪一段數(shù)據(jù);另一種情況是由于網(wǎng)絡(luò)或者重發(fā)機(jī)制的原因?qū)е履骋粋€(gè)包收到多次闷愤,如何把多余的包都排除掉整葡,僅保留已有數(shù)據(jù)。

TCP在設(shè)計(jì)時(shí)候充分考慮這點(diǎn)讥脐,其中SYN和ACK就是用來(lái)確保這個(gè)過(guò)程的遭居,SYN發(fā)送的是字節(jié)順序,ACK則應(yīng)答收到的字節(jié)序加1旬渠。這樣俱萍,無(wú)論是發(fā)送方還是接收方,都可以準(zhǔn)確的維護(hù)一張發(fā)送接收字節(jié)的列表告丢。從而可以知道對(duì)方還需要哪些字節(jié)枪蘑,或自己已經(jīng)接收了哪些字節(jié)。

image

2).重發(fā)機(jī)制

a. 超時(shí)重發(fā)

為了保證數(shù)據(jù)一定被接收到,就必須妥善處理超時(shí)岳颇,對(duì)于超時(shí)沒(méi)得到響應(yīng)照捡,則最好的辦法是重新發(fā)送。

首先將數(shù)據(jù)拷貝到發(fā)送緩沖區(qū)话侧,每個(gè)包在發(fā)送時(shí)都會(huì)啟動(dòng)一個(gè)定時(shí)器栗精,如果定時(shí)器超時(shí)前收到了對(duì)方應(yīng)答,則發(fā)送成功瞻鹏,清除緩沖區(qū)悲立,否則重傳數(shù)據(jù)包,直到達(dá)到最大次數(shù)乙漓。

TCP在每次發(fā)包時(shí)都會(huì)計(jì)算往返時(shí)間極其偏差级历,通過(guò)這個(gè)記錄可以大致判斷雙方的網(wǎng)絡(luò)情況從而確定超時(shí)時(shí)間释移。通常剛開(kāi)始超時(shí)時(shí)間較長(zhǎng)(如6s)叭披,而后可能到0.5s這樣較小的時(shí)間。

b. 高速重發(fā)

比起超時(shí)才重新發(fā)送玩讳,TCP還設(shè)計(jì)了更為巧妙的方式來(lái)做重發(fā)涩蜘。稱(chēng)為快速重發(fā)。即目標(biāo)主機(jī)在確認(rèn)時(shí)總是確認(rèn)排在最先的缺失包熏纯,當(dāng)發(fā)送方發(fā)現(xiàn)連續(xù)收到3個(gè)同樣的ack時(shí)同诫,則表明該包已經(jīng)丟了,需要快速重新發(fā)送樟澜,這樣能否避免要等到超時(shí)才能重發(fā)误窖。

更多可以參考這里

https://wizardforcel.gitbooks.io/network-basic/content/8.html

3).流量控制(滑動(dòng)窗口)

a. 滑動(dòng)窗口協(xié)議

滑動(dòng)窗口本質(zhì)上是為了在通信過(guò)程中同步收發(fā)雙方的速率。通過(guò)發(fā)送端的發(fā)送窗口和接收端的接收窗口來(lái)保證發(fā)送的可靠性秩贰,同時(shí)協(xié)調(diào)發(fā)送的速度霹俺。

image

對(duì)于發(fā)送端來(lái)說(shuō),整個(gè)窗口分為下面四段毒费,一是已經(jīng)發(fā)送也收到確認(rèn)回復(fù)的丙唧;二是已經(jīng)發(fā)送但尚未收到回復(fù)的;三是還沒(méi)有發(fā)送但即將發(fā)送的(接收方有空間觅玻,只是發(fā)送方尚未發(fā)送而已)想际;四是沒(méi)發(fā)送,但是接收方已經(jīng)沒(méi)空間的

同理溪厘,對(duì)于接收方來(lái)說(shuō)胡本,整個(gè)窗口分為三段,一是已經(jīng)接收并且已經(jīng)回復(fù)ACK的畸悬;二是已經(jīng)接收的打瘪;三是為接收也沒(méi)準(zhǔn)備接收的

而所謂的滑動(dòng),則是將窗口從上一次收到的連續(xù)ACK的位置整個(gè)劃到下一次收到連續(xù)ACK的位置而已。注意連續(xù)二字闺骚,不連續(xù)則不能算作已經(jīng)接收完畢彩扔。

image

b. 滑動(dòng)窗口的收縮與擴(kuò)張

滑動(dòng)窗口最牛逼的地方在于動(dòng)態(tài)的調(diào)整收發(fā)雙方的窗口大小,以便使得收發(fā)雙方通信同步而不僅僅是對(duì)于發(fā)送接收字節(jié)的管理僻爽。

在TCP協(xié)議中虫碉,有16個(gè)字節(jié)專(zhuān)門(mén)用來(lái)放window大小,是接收端主機(jī)向發(fā)送方主機(jī)通知自己可以接納的數(shù)據(jù)大小胸梆,而發(fā)送方會(huì)根據(jù)該窗口數(shù)據(jù)發(fā)送不超過(guò)這個(gè)限度的數(shù)據(jù)敦捧。接收方可以根據(jù)自己的處理能力不斷的增大或者縮小這個(gè)值,而發(fā)送方主機(jī)則只要保持與之同步即可碰镜。

當(dāng)收縮到最芯ぢ选(即0窗口)時(shí),按照約定發(fā)送方不能再給接收方發(fā)送數(shù)據(jù)了绪颖,那豈不是陷入死局秽荤,大家從此斷開(kāi)?實(shí)際上發(fā)送方會(huì)一段時(shí)間后重試柠横,如果還不行拉長(zhǎng)一段時(shí)間后再重試窃款,直到達(dá)到最大重試次數(shù)。

image

4).擁塞控制

擁塞控制的起因是牍氛,作為T(mén)CP本身雖然已經(jīng)有了各種校驗(yàn)和檢測(cè)方法保證通信雙方能否互相通信并且能夠同步雙方的情況了晨继。但是它還忽略了一個(gè)關(guān)鍵因素—網(wǎng)絡(luò)狀況。網(wǎng)絡(luò)是通路搬俊,如果這個(gè)通路太擁擠紊扬,應(yīng)該適當(dāng)減少發(fā)送,而如果這個(gè)通路比較寬松唉擂,則可以適當(dāng)增加發(fā)送餐屎。

TCP的擁塞控制包括:慢啟動(dòng),擁塞避免楔敌,擁塞發(fā)生啤挎,快速恢復(fù)。

慢啟動(dòng)每次將擁塞窗口的大小設(shè)置為1個(gè)數(shù)據(jù)段卵凑,之后每次收到確認(rèn)應(yīng)答則擁塞窗口加1

image

由于這很容易造成指數(shù)級(jí)的增長(zhǎng)放大庆聘,于是又引入一個(gè)慢啟動(dòng)閾值的概念,即當(dāng)tcp通信開(kāi)始時(shí)勺卢,網(wǎng)絡(luò)吞吐會(huì)急劇上升伙判,當(dāng)?shù)竭_(dá)一個(gè)閾值之后,則開(kāi)始下降然后緩慢上升黑忱。

image

4.TCP中的各種異常攻擊情況

1).SYN攻擊宴抚。主要是建聯(lián)時(shí)攻擊勒魔。攻擊方發(fā)起SYN請(qǐng)求,被攻擊方收到請(qǐng)求后回應(yīng)ACK菇曲,此時(shí)攻擊方本應(yīng)當(dāng)回應(yīng)此ACK使得被攻擊方變?yōu)閑stablish狀態(tài)冠绢,然而攻擊方此時(shí)不做回應(yīng),使得被攻擊方維護(hù)的未連接隊(duì)列中該記錄存活時(shí)間因?yàn)槌瑫r(shí)重試而增加常潮,而短期大量該類(lèi)型攻擊淹沒(méi)可使得被攻擊方未連接隊(duì)列不斷增長(zhǎng)弟胀,讓系統(tǒng)響應(yīng)變慢,網(wǎng)絡(luò)擁堵甚至系統(tǒng)崩潰喊式。

2).RST攻擊孵户。RST復(fù)位主要是通信任何一方認(rèn)為異常的連接則可以清除該連接的緩沖區(qū),并向?qū)Ψ桨l(fā)送RST標(biāo)志強(qiáng)制關(guān)閉連接岔留。RST攻擊主要是用來(lái)斷一個(gè)已有連接的夏哭,比如A與B連接中,此時(shí)C冒出來(lái)偽裝成A向B發(fā)送一個(gè)帶RST位的請(qǐng)求献联,則B將清除所有與A的“記憶”竖配,下次A再來(lái)時(shí),B將不認(rèn)識(shí)A酱固;當(dāng)然了械念,如果C冒充A向B發(fā)送一個(gè)SYN請(qǐng)求头朱,則B會(huì)主動(dòng)發(fā)起RST復(fù)位运悲。這類(lèi)攻擊主要用來(lái)癱瘓重要連接,從而趁虛而入项钮。

image.gif

歡迎在留言區(qū)留下你的觀點(diǎn)班眯,一起討論提高。如果今天的文章讓你有新的啟發(fā)烁巫,歡迎轉(zhuǎn)發(fā)分享給更多人署隘。加入技術(shù)交流群,在后臺(tái)回復(fù)“加群”或者“學(xué)習(xí)”即可亚隙。

猜你還想看

阿里磁餐、騰訊、百度阿弃、華為诊霹、京東最新面試題匯集

記住:永遠(yuǎn)不要在 MySQL 中使用 UTF-8

你知道高并發(fā)的性能測(cè)試怎么做嗎渣淳?

后端開(kāi)發(fā)必備的 MySQL 日志文件知識(shí)點(diǎn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脾还,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子入愧,更是在濱河造成了極大的恐慌鄙漏,老刑警劉巖嗤谚,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怔蚌,居然都是意外死亡巩步,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)桦踊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渗钉,“玉大人,你說(shuō)我怎么就攤上這事钞钙■伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵芒炼,是天一觀的道長(zhǎng)瘫怜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)本刽,這世上最難降的妖魔是什么鲸湃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮子寓,結(jié)果婚禮上暗挑,老公的妹妹穿的比我還像新娘。我一直安慰自己斜友,他們只是感情好炸裆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鲜屏,像睡著了一般烹看。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洛史,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天惯殊,我揣著相機(jī)與錄音,去河邊找鬼也殖。 笑死土思,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忆嗜。 我是一名探鬼主播己儒,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼霎褐!你這毒婦竟也來(lái)了址愿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冻璃,失蹤者是張志新(化名)和其女友劉穎响谓,沒(méi)想到半個(gè)月后损合,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娘纷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嫁审,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖晶。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡律适,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遏插,到底是詐尸還是另有隱情捂贿,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布胳嘲,位于F島的核電站厂僧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏了牛。R本人自食惡果不足惜颜屠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹰祸。 院中可真熱鬧甫窟,春花似錦、人聲如沸蛙婴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敬锐。三九已至背传,卻和暖如春呆瞻,著一層夾襖步出監(jiān)牢的瞬間台夺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工痴脾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤介,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓赞赖,卻偏偏與公主長(zhǎng)得像滚朵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子前域,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345