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是否能聽到。
假如四次握手谜诫,那就造成浪費(fèi)了漾峡,因?yàn)榈诙€握手報(bào)文中syn和ack可以同時設(shè)置,三次握手后就已經(jīng)可以保證A可以給B發(fā)信息喻旷,A可以收到B的信息生逸; B可以給A發(fā)信息,B可以收到A的信息且预。
為什么需要四次揮手
TCP是全雙工的槽袄,通信的雙方都可以獨(dú)立關(guān)閉自己的通信通道
TIME_WAIT狀態(tài)以及2msl
?1 可靠實(shí)現(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套接字選項(xiàng)來通知內(nèi)核懊蒸,如果端口忙荣倾,但TCP連接位于TIME_WAIT狀態(tài)時可以重用端口。 2?由于time_wait狀態(tài)是在主動關(guān)閉的一方出現(xiàn)的骑丸,所以在設(shè)計(jì)協(xié)議邏輯的時候舌仍,盡量由客戶端主動關(guān)閉,避免服務(wù)端出現(xiàn)time_wait
第三次握手失敗了怎么辦
當(dāng)client與server的第三次握手失敗了之后通危,即client發(fā)送至server的確認(rèn)建立連接報(bào)文段未能到達(dá)server铸豁,server在等待client回復(fù)ACK的過程中超時了,那么server會向client發(fā)送一個RTS報(bào)文段并進(jìn)入關(guān)閉狀態(tài)菊碟,即:并不等待client第三次握手的ACK包重傳节芥,直接關(guān)閉連接請求,這主要是為了防止泛洪攻擊逆害,即壞人偽造許多IP向server發(fā)送連接請求头镊,從而將server的未連接隊(duì)列塞滿,浪費(fèi)server的資源
三次握手有什么缺陷會被黑客利用忍燥,如何防范
黑客仿造IP大量的向server發(fā)送TCP連接請求報(bào)文包拧晕,從而將server的半連接隊(duì)列(即server收到連接請求SYN之后將client加入半連接隊(duì)列中)占滿,從而使得server拒絕其他正常的連接請求梅垄。即拒絕服務(wù)攻擊
防范方法:
1?縮短服務(wù)器接收客戶端SYN報(bào)文之后的等待連接時間厂捞,即SYN timeout時間,队丝,但是過低的SYN timeout可能會影響正常的TCP連接的建立靡馁,一旦網(wǎng)絡(luò)不通暢便可能導(dǎo)致client連接請求失敗
2?SYN cookie:當(dāng)server接收到client的SYN之后,不立即分配資源机久,而是根據(jù)client發(fā)送過來的SYN包計(jì)算出一個cookie值臭墨,這個cookie值用來存儲server返回給client的SYN+ACK數(shù)據(jù)包中的初始序列號,當(dāng)client返回第三次握手的ACK包之后進(jìn)行校驗(yàn)膘盖,如果校驗(yàn)成功則server分配資源胧弛,建立連接
3?SYN proxy代理,作為server與client連接的代理侠畔,代替server與client建立三次握手的連接结缚,同時SYN proxy與client建立好了三次握手連接之后,確保是正常的TCP連接软棺,而不是TCP泛洪攻擊红竭,那么SYN proxy就與server建立三次握手連接
tcp的擁塞控制
TCP通過一個定時器(timer)采樣了RTT并計(jì)算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ò)中的路由器或鏈路不致過載斩熊,是一個全局性的過程。 流量控制是點(diǎn)對點(diǎn)通信量的控制伐庭,是一個端到端的問題粉渠,主要就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便接收端來得及接收
慢開始算法
剛剛加入網(wǎng)絡(luò)的連接圾另,一點(diǎn)一點(diǎn)地提速霸株,不要一上來就把路占滿。主機(jī)剛開始發(fā)送報(bào)文段時設(shè)置cwnd=1集乔,每收到一個對新的報(bào)文段的確認(rèn)后去件,將cwn加1。慢開始算法每經(jīng)過一個傳輸輪次扰路,擁塞窗口cwnd就加倍尤溜,一個傳輸輪次就是把擁塞窗口cwnd所允許發(fā)送的報(bào)文段都連續(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í)行慢開始算法。這樣做的目的是為了迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù)愉阎。
快重傳
如果發(fā)送方設(shè)置的超時計(jì)時器時限已到但還沒有收到確認(rèn)绞蹦,那么很可能是網(wǎng)絡(luò)出現(xiàn)了擁塞,致使報(bào)文段在網(wǎng)絡(luò)中的某處被丟棄榜旦。這時幽七,TCP馬上把擁塞窗口 cwnd 減小到1,并執(zhí)行慢開始算法溅呢,同時把慢開始門限值ssthresh減半澡屡。這是不使用快重傳的情況。使用快重傳時咐旧,發(fā)送方只要一連收到三個重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對方尚未收到的報(bào)文段驶鹉,快重傳并非取消重傳計(jì)時器,而是在某些情況下可更早地重傳丟失的報(bào)文段铣墨,
快恢復(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利用滑動窗口實(shí)現(xiàn)流量控制
流量控制就是讓發(fā)送方的發(fā)送速率不用太快纳本,要讓接收方來得及接收窍蓝,通過接收方通知的窗口大小來實(shí)現(xiàn)流量控制