1.相關問題算法
問題1: 請詳細描述三次握手和四次揮手的過程,並畫出狀態圖緩存
問題2: 四次揮手中TIME_WAIT狀態存在的目的是什麼?網絡
問題3: TCP是經過什麼機制保障可靠性的?tcp
2.問題回答spa
問題1:指針
狀態圖以下blog
補充知識:TCP報文中共計6個標誌位,每一個標誌位佔1個字節,即URG、ACK、PSH、RST、SYN、FIN等隊列
三次握手詳情進程
四次揮手詳情(被動關閉)路由
補充1:
SYN攻擊:在三次握手過程當中,Server發送SYN-ACK以後,收到Client的ACK以前的TCP鏈接稱爲半鏈接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短期內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,因爲源地址是不存在的,所以,Server須要不斷重發直至超時,這些僞造的SYN包將產時間佔用未鏈接隊列,致使正常的SYN請求由於隊列滿而被丟棄,從而引發網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式很是簡單,即當Server上有大量半鏈接狀態且源IP地址是隨機的,則能夠判定遭到SYN攻擊了,使用以下命令可讓之現行:
#netstat -nap | grep SYN_RECV
補充2:
四次揮手的同時關閉情況:實際中還會出現同時發起主動關閉的狀況,具體流程以下圖
問題2:
在四次揮手中,第三次揮手結束後,Client端進入TIME_WAIT狀態,客戶端不會立刻進入closed狀態,理由以下
問題3:
TCP傳輸的可靠性主要靠如下手段來保證傳輸
建議:滑動窗口與流量控制視狀況是否說明
補充:滑動窗口與流量控制
1).滑動窗口:
「窗口」對應的是一段能夠被髮送者發送的字節序列,其連續的範圍稱之爲「窗口」;
「滑動」則是指這段「容許發送的範圍」是能夠隨着發送的過程而變化的,方式就是按順序「滑動」。
案例以下:
TCP創建鏈接的初始,B會告訴A本身的接收窗口大小,好比爲‘20’:
字節31-50爲發送窗口
A發送11個字節後,發送窗口位置不變,B接收到了亂序的數據分組:
只有當A成功發送了數據,即發送的數據獲得了B的確認以後,纔會移動滑動窗口離開已發送的數據;同時B則確認連續的數據分組,對於亂序的分組則先接收下來,避免網絡重複傳遞:
2).流量控制
流量控制方面主要有兩個要點須要掌握。一是TCP利用滑動窗口實現流量控制的機制;二是如何考慮流量控制中的傳輸效率。
1. 流量控制
所謂流量控制,主要是接收方傳遞信息給發送方,使其不要發送數據太快,是一種端到端的控制。主要的方式就是返回的ACK中會包含本身的接收窗口的大小,而且利用大小來控制發送方的數據發送,案例如圖:
這裏面涉及到一種狀況,若是B已經告訴A本身的緩衝區已滿,因而A中止發送數據;等待一段時間後,B的緩衝區出現了富餘,因而給A發送報文告訴A個人rwnd大小爲400,可是這個報文不幸丟失了,因而就出現A等待B的通知||B等待A發送數據的死鎖狀態。爲了處理這種問題,TCP引入了持續計時器(Persistence timer),當A收到對方的零窗口通知時,就啓用該計時器,時間到則發送一個1字節的探測報文,對方會在此時迴應自身的接收窗口大小,若是結果仍未0,則重設持續計時器,繼續等待。
2. 傳遞效率
一個顯而易見的問題是:單個發送字節單個確認,和窗口有一個空餘即通知發送方發送一個字節,無疑增長了網絡中的許多沒必要要的報文(請想一想爲了一個字節數據而添加的40字節頭部吧!),因此咱們的原則是儘量一次多發送幾個字節,或者窗口空餘較多的時候通知發送方一次發送多個字節。對於前者咱們普遍使用Nagle算法,即:
對於後者咱們每每的作法是讓接收方等待一段時間,或者接收方得到足夠的空間容納一個報文段或者等到接受緩存有一半空閒的時候,再通知發送方發送數據。
ok