TCP

TCP/IP卷1
TCP相關(guān)章節(jié)18-22章

首部格式

16位源端口號吹埠,16位目標(biāo)端口號
32位序號
32位確認(rèn)序號
4位首部長度,6位保留脑融,6位操作標(biāo)志位(URG,ACK,PSH,RST,SYN,FIN)喻频,16位窗口大小
16位校驗和,16位緊急指針

PSH PUSH 盡快把數(shù)據(jù)發(fā)給接收進(jìn)程
RST RESET 復(fù)位連接
FIN FINISH 發(fā)送方完成數(shù)據(jù)發(fā)送
SYN synchronous 同步
URG urgent 緊急

建立TCP連接/三次握手

  1. 請求段(通常為客戶)發(fā)送一個SYN指名客戶打算連接的服務(wù)器的端口吨掌,以及初始序號ISN半抱。這個SYN段為報文段1
  2. 服務(wù)器發(fā)回包含服務(wù)器初始序號的SYN報文段(報文段2)作為應(yīng)答。同時膜宋,將確認(rèn)序號設(shè)置為客戶的ISN加1以對客戶的SYN報文段進(jìn)行確認(rèn)窿侈。一個SYN將占用一個序號
  3. 客戶將確認(rèn)序號設(shè)置為服務(wù)器的ISN加1以對服務(wù)器的SYN報文進(jìn)行確認(rèn)(報文段3)

四次握手是由TCP協(xié)議的全雙工和半關(guān)閉造成的

Maximum Segment Size 最大報文長度
TCP的MSS默認(rèn)為536
MSS越長,相比于20字節(jié)的TCP首部和20字節(jié)的IP首部來說都更長

TCP狀態(tài)變遷

典型狀態(tài)變遷:

建立連接:

SYN_SENT                        LISTEN
              SYN j
                                SYN_RCVD
              SYN k,ACK j+1
ESTABLISHED
              ACK k+1
                                ESTABLISHED

斷開連接:

FIN_WAIT_1
              FIN m
                                CLOSE_WAIT
              ACK m+1
FIN_WAIT_2

                                LAST_ACK
              FIN n
TIME_WAIT
              ACK n+1
                                CLOSED

如果從LISTEN狀態(tài)秋茫,收到SYN史简,然后發(fā)SYN,ACK進(jìn)入SYN_RCVD,再收到RST就會回到LISTEN

TIME_WAIT要等待2MSL maximum segment life 去向ACK消息最大存活時間(MSL) + 來向FIN消息的最大存活時間(MSL)

同時打開/同時關(guān)閉

機器1用8888向機器2的7777端口發(fā)送SYN肛著,機器2用7777向機器1的8888發(fā)送SYN
則兩個機器收到SYN之后發(fā)送SYN,ACK圆兵,同時進(jìn)入SYN_RCVD
接受到SYN,ACK進(jìn)入ESTABLISHED

同時關(guān)閉也是一樣
從FIN_WAIT_1 -> CLOSING -> TIME_WAIT

滑動窗口

發(fā)送被確認(rèn) 發(fā)送未被確認(rèn) 可用的窗口 不能夠發(fā)送

窗口由接收方通告

窗口左邊沿向右邊沿靠近叫窗口合攏,發(fā)生在數(shù)據(jù)被發(fā)送和確認(rèn)時

窗口右邊沿向右移動允許發(fā)送更多數(shù)據(jù)枢贿,我們稱之為窗口張開殉农,發(fā)生在接收端讀取已經(jīng)確認(rèn)的數(shù)據(jù)并且釋放了TCP的接收緩存時

  1. 發(fā)送方不必發(fā)送一個窗口大的數(shù)據(jù)
  2. 來自接收方的報文確認(rèn)數(shù)據(jù)把窗口向右劃動
  3. 窗口的大小可以縮小但是右邊沿不能向左移動
  4. 接收方在發(fā)送一個ACK前不必等待窗口被填滿,收到幾個報文就可以發(fā)送ACK

窗口大小

接收方控制滑動窗口大小局荚,這將影響TCP的性能

慢啟動

擁塞窗口 cwmd congestion window
發(fā)送方開始發(fā)送一個報文段超凳,收到ACK之后變?yōu)閮蓚€,收到這兩個報文段的ACK之后耀态,擁塞窗口變?yōu)?

從發(fā)送方發(fā)送報文段到發(fā)送方接受到ACK的時間為往返時間RTT round trip time

通常ack只有一個ip首部和一個TCP首部

連接的理想狀態(tài)就是:

  1. 在一個時間段轮傍,每當(dāng)接收方從網(wǎng)絡(luò)上移去一個報文段,發(fā)送方就在發(fā)送一個報文段到網(wǎng)絡(luò)上
  2. 不管有多少報文段填充了這個管道首装,返回路徑上總是有相同數(shù)量的ACK

帶寬的時延乘積

帶寬時延乘積:bandwith * RTT = capacity 管道容量

擁塞

當(dāng)數(shù)據(jù)從一個帶寬大的管道向一個帶寬小的管道傳輸時可能會發(fā)生數(shù)據(jù)丟失的情況

數(shù)據(jù)量太大路由器緩存無法存放也可能發(fā)生數(shù)據(jù)丟失的情況创夜,這兩種情況稱為擁塞

ACK的時間間隔與帶寬最小的管道一致

如果帶寬小的瓶頸管道不能容納擁塞的數(shù)據(jù)分組的緩存,就會發(fā)生擁塞

超時重傳

超時重傳中最重要的就是對于給定連接的RTT的測量

由于路由器和網(wǎng)絡(luò)流量隨時會變化所以我們假設(shè)RTT也會隨時變化

R <- aR + (1-a)M

a是一個推薦值為0.9的平滑因子仙逻,每次進(jìn)行新的測量的時候驰吓,這個平滑的RTT將得到更新,90%來自于上一個RTT系奉,10%來自于新的測量

Retransmission time-Out檬贰,RTO 重傳超時時間

RTO測量公式:

Err = M - A
A <- A + gErr
D <- D + H(|Err| - D)
RTO = A + 4D

A為加權(quán)平均往返時間RTTs D為偏差的加權(quán)平均值RTTv


擁塞避免算法

假定由于分組收到損壞引起的丟失是非常少的,因此分組丟失就意味著在源主機和目的主機之間的某處網(wǎng)絡(luò)上發(fā)生了阻塞

擁塞避免算法和慢啟動算法需要維持兩個變量:一個擁塞窗口cwmd和一個慢啟動門檻ssthresh

  1. 對一個給定的連接喜最,初始化cwmd為一個報文段,ssthresh為65536個字節(jié)

  2. TCP輸出不能超過cwmd和接收方通告窗口的大小庄蹋,擁塞避免是發(fā)送方使用的流量控制瞬内,通告窗口是接收方使用的流量控制迷雪,前者是發(fā)送方感受到的網(wǎng)絡(luò)擁塞的估計,后者與接收方在該鏈接上可用的緩存大小有關(guān)

  3. 擁塞發(fā)生時(超時或者收到重復(fù)確認(rèn))虫蝶,ssthresh被設(shè)置為當(dāng)前窗口的一半大姓逻帧(當(dāng)前窗口是cwmd和接收方通告窗口的最小值,最小為兩個報文段能真。此外赁严,如果是超時導(dǎo)致了擁塞,cwmd被設(shè)置為1個報文段粉铐,這就是慢啟動

  4. 當(dāng)新的數(shù)據(jù)被對方確認(rèn)時疼约,就增加cwmd,增加的方法取決于我們現(xiàn)在正在慢啟動或者是擁塞避免蝙泼。如果cwmd小于ssthresh程剥,則是進(jìn)行慢啟動,否則是擁塞避免

快速避免和快速恢復(fù)

  1. 收到三個重復(fù)的ACK時汤踏,將ssthresh設(shè)置為當(dāng)前擁塞窗口cwmd的一半织鲸,重傳丟失的報文段,設(shè)置cwmd為三倍的報文段大小

  2. 每次收到一個ACK時溪胶,cwmd增加一個報文段大小并增加一個分組(如果新的cwmd允許發(fā)送)

  3. 當(dāng)下一個確認(rèn)的ACK到達(dá)時搂擦,設(shè)置cwmd為ssthresh,這個ACK應(yīng)該是在進(jìn)行重傳后一個往返時間對步驟1重傳的確認(rèn)哗脖。另外瀑踢,這個ACK也是對丟失的分組和收到的第一個重復(fù)的ACK之間的所有報文段的確認(rèn)。這一步采用的是擁塞避免懒熙,因為分組丟失時我們將當(dāng)前的速率減半

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丘损,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子工扎,更是在濱河造成了極大的恐慌徘钥,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肢娘,死亡現(xiàn)場離奇詭異呈础,居然都是意外死亡,警方通過查閱死者的電腦和手機橱健,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門而钞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拘荡,你說我怎么就攤上這事臼节。” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵网缝,是天一觀的道長巨税。 經(jīng)常有香客問我,道長粉臊,這世上最難降的妖魔是什么草添? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮扼仲,結(jié)果婚禮上远寸,老公的妹妹穿的比我還像新娘。我一直安慰自己屠凶,他們只是感情好驰后,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阅畴,像睡著了一般倡怎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贱枣,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天监署,我揣著相機與錄音,去河邊找鬼纽哥。 笑死钠乏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的春塌。 我是一名探鬼主播晓避,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只壳!你這毒婦竟也來了俏拱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤吼句,失蹤者是張志新(化名)和其女友劉穎锅必,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惕艳,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搞隐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了远搪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劣纲。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谁鳍,靈堂內(nèi)的尸體忽然破棺而出癞季,到底是詐尸還是另有隱情劫瞳,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布绷柒,位于F島的核電站柠新,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辉巡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一蕊退、第九天 我趴在偏房一處隱蔽的房頂上張望郊楣。 院中可真熱鬧,春花似錦瓤荔、人聲如沸净蚤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽今瀑。三九已至,卻和暖如春点把,著一層夾襖步出監(jiān)牢的瞬間橘荠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工郎逃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哥童,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓褒翰,卻偏偏與公主長得像贮懈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子优训,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350