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連接/三次握手
- 請求段(通常為客戶)發(fā)送一個SYN指名客戶打算連接的服務(wù)器的端口吨掌,以及初始序號ISN半抱。這個SYN段為報文段1
- 服務(wù)器發(fā)回包含服務(wù)器初始序號的SYN報文段(報文段2)作為應(yīng)答。同時膜宋,將確認(rèn)序號設(shè)置為客戶的ISN加1以對客戶的SYN報文段進(jìn)行確認(rèn)窿侈。一個SYN將占用一個序號
- 客戶將確認(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的接收緩存時
- 發(fā)送方不必發(fā)送一個窗口大的數(shù)據(jù)
- 來自接收方的報文確認(rèn)數(shù)據(jù)把窗口向右劃動
- 窗口的大小可以縮小但是右邊沿不能向左移動
- 接收方在發(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)就是:
- 在一個時間段轮傍,每當(dāng)接收方從網(wǎng)絡(luò)上移去一個報文段,發(fā)送方就在發(fā)送一個報文段到網(wǎng)絡(luò)上
- 不管有多少報文段填充了這個管道首装,返回路徑上總是有相同數(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
對一個給定的連接喜最,初始化cwmd為一個報文段,ssthresh為65536個字節(jié)
TCP輸出不能超過cwmd和接收方通告窗口的大小庄蹋,擁塞避免是發(fā)送方使用的流量控制瞬内,通告窗口是接收方使用的流量控制迷雪,前者是發(fā)送方感受到的網(wǎng)絡(luò)擁塞的估計,后者與接收方在該鏈接上可用的緩存大小有關(guān)
擁塞發(fā)生時(超時或者收到重復(fù)確認(rèn))虫蝶,ssthresh被設(shè)置為當(dāng)前窗口的一半大姓逻帧(當(dāng)前窗口是cwmd和接收方通告窗口的最小值,最小為兩個報文段能真。此外赁严,如果是超時導(dǎo)致了擁塞,cwmd被設(shè)置為1個報文段粉铐,這就是慢啟動
當(dāng)新的數(shù)據(jù)被對方確認(rèn)時疼约,就增加cwmd,增加的方法取決于我們現(xiàn)在正在慢啟動或者是擁塞避免蝙泼。如果cwmd小于ssthresh程剥,則是進(jìn)行慢啟動,否則是擁塞避免
快速避免和快速恢復(fù)
收到三個重復(fù)的ACK時汤踏,將ssthresh設(shè)置為當(dāng)前擁塞窗口cwmd的一半织鲸,重傳丟失的報文段,設(shè)置cwmd為三倍的報文段大小
每次收到一個ACK時溪胶,cwmd增加一個報文段大小并增加一個分組(如果新的cwmd允許發(fā)送)
當(dāng)下一個確認(rèn)的ACK到達(dá)時搂擦,設(shè)置cwmd為ssthresh,這個ACK應(yīng)該是在進(jìn)行重傳后一個往返時間對步驟1重傳的確認(rèn)哗脖。另外瀑踢,這個ACK也是對丟失的分組和收到的第一個重復(fù)的ACK之間的所有報文段的確認(rèn)。這一步采用的是擁塞避免懒熙,因為分組丟失時我們將當(dāng)前的速率減半