tcp三次握手和四次揮手

為什么需要三次握手
TCP是全雙工的,即客戶端在給服務(wù)器端發(fā)送信息的同時,服務(wù)器端也可以給客戶端發(fā)送信息。而半雙工的意思是A可以給B發(fā),B也可以給A發(fā),但是A在給B發(fā)的時候,B不能給A發(fā),即不同時,為半雙工。 單工為只能A給B發(fā),B不能給A發(fā); 或者是只能B給A發(fā),不能A給B發(fā)。
假如只有兩次握手,B無法確定B的信息A是否能聽到。
假如四次握手,那就造成浪費了,因為第二個握手報文中syn和ack可以同時設(shè)置,三次握手后就已經(jīng)可以保證A可以給B發(fā)信息,A可以收到B的信息; B可以給A發(fā)信息,B可以收到A的信息。
為什么需要四次揮手
TCP是全雙工的,通信的雙方都可以獨立關(guān)閉自己的通信通道
TIME_WAIT狀態(tài)以及2msl
?1 可靠實現(xiàn)tcp全雙工連接的終止。如果四次握手中最后一個ack丟失(A發(fā)給B),對方將重發(fā)最終的fin,如果A端不維持TIME_WAIT狀態(tài),A端將響應(yīng)RST,B端會拋出異常
2 保證舊連接的分組在網(wǎng)絡(luò)中消逝。網(wǎng)絡(luò)情況不好時,如果A端無TIME_WAIT狀態(tài),A端跟B端又新建一個新的tcp連接(采用相同的端口號),這時被動方重傳或延時過來的FIN包過來后會直接影響新的TCP連接。TIME_WAIT狀態(tài)持續(xù)2MSL,足以讓某個方向的分組最多存活msl秒被丟棄。
服務(wù)器大量time_wait的原因、影響、解決方法
原因:在高并發(fā)短連接的TCP服務(wù)器上,當(dāng)服務(wù)器處理完請求后立刻主動正常關(guān)閉連接。這個場景下會出現(xiàn)大量socket處于TIME_WAIT狀態(tài)
影響:持續(xù)的的高并發(fā)短連接,會使服務(wù)器因端口資源不足而拒絕為一部分客戶服務(wù)
解決方法:1?可以設(shè)置SO_REUSEADDR套接字選項來通知內(nèi)核,如果端口忙,但TCP連接位于TIME_WAIT狀態(tài)時可以重用端口。 2?由于time_wait狀態(tài)是在主動關(guān)閉的一方出現(xiàn)的,所以在設(shè)計協(xié)議邏輯的時候,盡量由客戶端主動關(guān)閉,避免服務(wù)端出現(xiàn)time_wait
第三次握手失敗了怎么辦
當(dāng)client與server的第三次握手失敗了之后,即client發(fā)送至server的確認(rèn)建立連接報文段未能到達(dá)server,server在等待client回復(fù)ACK的過程中超時了,那么server會向client發(fā)送一個RTS報文段并進入關(guān)閉狀態(tài),即:并不等待client第三次握手的ACK包重傳,直接關(guān)閉連接請求,這主要是為了防止泛洪攻擊,即壞人偽造許多IP向server發(fā)送連接請求,從而將server的未連接隊列塞滿,浪費server的資源
三次握手有什么缺陷會被黑客利用,如何防范
黑客仿造IP大量的向server發(fā)送TCP連接請求報文包,從而將server的半連接隊列(即server收到連接請求SYN之后將client加入半連接隊列中)占滿,從而使得server拒絕其他正常的連接請求。即拒絕服務(wù)攻擊
防范方法:
1?縮短服務(wù)器接收客戶端SYN報文之后的等待連接時間,即SYN timeout時間,,但是過低的SYN timeout可能會影響正常的TCP連接的建立,一旦網(wǎng)絡(luò)不通暢便可能導(dǎo)致client連接請求失敗
2?SYN cookie:當(dāng)server接收到client的SYN之后,不立即分配資源,而是根據(jù)client發(fā)送過來的SYN包計算出一個cookie值,這個cookie值用來存儲server返回給client的SYN+ACK數(shù)據(jù)包中的初始序列號,當(dāng)client返回第三次握手的ACK包之后進行校驗,如果校驗成功則server分配資源,建立連接
3?SYN proxy代理,作為server與client連接的代理,代替server與client建立三次握手的連接,同時SYN proxy與client建立好了三次握手連接之后,確保是正常的TCP連接,而不是TCP泛洪攻擊,那么SYN proxy就與server建立三次握手連接
tcp的擁塞控制
TCP通過一個定時器(timer)采樣了RTT并計算RTO,但是,如果網(wǎng)絡(luò)上的延時突然增加,那么,TCP對這個事做出的應(yīng)對只有重傳數(shù)據(jù),然而重傳會導(dǎo)致網(wǎng)絡(luò)的負(fù)擔(dān)更重,于是會導(dǎo)致更大的延遲以及更多的丟包,這就導(dǎo)致了惡性循環(huán),最終形成“網(wǎng)絡(luò)風(fēng)暴”。為了在發(fā)送端調(diào)節(jié)所要發(fā)送的數(shù)據(jù)量,定義了一個“擁塞窗口”(Congestion Window),在發(fā)送數(shù)據(jù)時,將擁塞窗口的大小與接收端ack的窗口大小做比較,取較小者作為發(fā)送數(shù)據(jù)量的上限
擁塞控制與流量控制的區(qū)別
擁塞控制是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載,是一個全局性的過程。 流量控制是點對點通信量的控制,是一個端到端的問題,主要就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便接收端來得及接收
慢開始算法
剛剛加入網(wǎng)絡(luò)的連接,一點一點地提速,不要一上來就把路占滿。主機剛開始發(fā)送報文段時設(shè)置cwnd=1,每收到一個對新的報文段的確認(rèn)后,將cwn加1。慢開始算法每經(jīng)過一個傳輸輪次,擁塞窗口cwnd就加倍,一個傳輸輪次就是把擁塞窗口cwnd所允許發(fā)送的報文段都連續(xù)發(fā)送出去,并收到了對已發(fā)送的最后一個字節(jié)的確認(rèn),傳輸輪次所經(jīng)歷的時間就是往返時間RTT

擁塞避免算法
擁塞避免算法的思路是讓擁塞窗口cwnd緩慢地增大,即每經(jīng)過一個往返rtt時間吧發(fā)送方的擁塞窗口cwnd加1,而不是慢開始算法的加倍,使擁塞窗口cwn按線性規(guī)律緩慢增長
當(dāng)cwnd < ssthresh時,使用慢開始算法
當(dāng)cwnd > ssthresh時,使用擁塞避免算法
當(dāng)cwnd = ssthresh時,既可使用慢開始,也可使用擁塞避免
網(wǎng)絡(luò)擁塞時
無論在慢開始還是擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞,就要把慢開始門限ssthresh設(shè)置為出現(xiàn)擁塞時的發(fā)送方窗口值的一半,把擁塞窗口cwnd設(shè)置為1,執(zhí)行慢開始算法。這樣做的目的是為了迅速減少主機發(fā)送到網(wǎng)絡(luò)中的分組數(shù)。
快重傳
如果發(fā)送方設(shè)置的超時計時器時限已到但還沒有收到確認(rèn),那么很可能是網(wǎng)絡(luò)出現(xiàn)了擁塞,致使報文段在網(wǎng)絡(luò)中的某處被丟棄。這時,TCP馬上把擁塞窗口 cwnd 減小到1,并執(zhí)行慢開始算法,同時把慢開始門限值ssthresh減半。這是不使用快重傳的情況。使用快重傳時,發(fā)送方只要一連收到三個重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對方尚未收到的報文段,快重傳并非取消重傳計時器,而是在某些情況下可更早地重傳丟失的報文段,

快恢復(fù)
與快重傳配合使用,當(dāng)發(fā)送端收到連續(xù)三個重復(fù)的確認(rèn)時,發(fā)送方認(rèn)為網(wǎng)絡(luò)很可能沒有發(fā)生擁塞(沒有快重傳時,只要發(fā)生重傳,就認(rèn)為網(wǎng)絡(luò)發(fā)生擁塞,需要執(zhí)行慢開始),把慢開始的門限ssthresh減半,但不執(zhí)行慢開始算法,cwnd現(xiàn)在不設(shè)置為1,設(shè)置為ssthresh減半后的數(shù)值,然后開始執(zhí)行擁塞避免算法
TCP/IP詳解--擁塞控制 & 慢啟動 快恢復(fù) 擁塞避免 - losbyday - 博客園
tcp的流量控制
流量控制跟擁塞控制相比就簡單很多了,tcp利用滑動窗口實現(xiàn)流量控制
流量控制就是讓發(fā)送方的發(fā)送速率不用太快,要讓接收方來得及接收,通過接收方通知的窗口大小來實現(xiàn)流量控制