套接字選項(xiàng)SO_RESUEADDR
即使端口處于2MSL狀態(tài),使用該選項(xiàng),仍然能夠在該端口建立連接。
服務(wù)器常會(huì)設(shè)置該選項(xiàng),以防服務(wù)器重啟。
TIME_WAIT狀態(tài)時(shí)收到數(shù)據(jù)
時(shí)間等待錯(cuò)誤
如果在TIME_WAIT時(shí)間內(nèi),收到了對端發(fā)送來的數(shù)據(jù)報(bào)(不是重置報(bào)文段都行),那么該狀態(tài)將被破壞,稱為時(shí)間等待錯(cuò)誤。原因是,當(dāng)收到報(bào)文段以后,通常Seq是舊的,所以本端就會(huì)發(fā)送ACK,對端已經(jīng)關(guān)閉或者是別的連接,就會(huì)發(fā)送RST,導(dǎo)致TIME_WAIT狀態(tài)被破壞。
但是許多系統(tǒng)規(guī)定,TIME_WAIT狀態(tài)是不對重置報(bào)文段做出反應(yīng)。
同時(shí)關(guān)閉
兩端同時(shí)發(fā)送FIN,兩端又同時(shí)ACK。又同時(shí)進(jìn)入TIME_WAIT
異常連接狀態(tài)及處理
非常規(guī)的11中狀態(tài),可能因?yàn)檫M(jìn)程崩潰或是其他原因之類的
靜默時(shí)間
當(dāng)處于TIME_WAIT的主機(jī)崩潰以后,重啟,然后需要等待相當(dāng)與一個(gè)MSL的時(shí)間才能建立新的連接。
這段時(shí)間成為靜默時(shí)間。
重置報(bào)文段
當(dāng)一段發(fā)現(xiàn)到達(dá)的報(bào)文段對相關(guān)連接(也就是進(jìn)程,套接字對)而言不正確的時(shí)候,TCP就會(huì)發(fā)送一個(gè)重置報(bào)文段,從而導(dǎo)致對端的連接快速拆卸(也就是結(jié)束吧!)。
重置報(bào)文段要求
重置報(bào)文段的ACK位必須有,而且ACK的值必須在正確的窗口范圍內(nèi),這樣可以防止被攻擊。
重置報(bào)文終止與FIN終止
FIN正常關(guān)閉一條連接成為有序釋放,通常不會(huì)出現(xiàn)丟失數(shù)據(jù)的情況。
重置報(bào)文段終止一條連接成為終止釋放。重置報(bào)文段在任何時(shí)候都可以發(fā)送,代替FIN來終止連接,且不學(xué)校對端ACK
終止報(bào)文段特性:
- 任何排隊(duì)的數(shù)據(jù)都將被拋棄,一個(gè)重置報(bào)文段立即被發(fā)出。
- 重置報(bào)文段的接收方會(huì)說明通信另一端采用了終止連接的方式而不是一次正常關(guān)閉。API必須提供一種實(shí)現(xiàn)上述終止行為的方式取代正常的關(guān)閉連接
發(fā)生情況
- 對沒有在監(jiān)聽的端口發(fā)起連接請求
當(dāng)連接請求到一端的時(shí)候,該端沒的端口上沒有進(jìn)程在監(jiān)聽,TCP的話就會(huì)發(fā)從一個(gè)重置報(bào)文段。而UDP則會(huì)生成一個(gè)目標(biāo)地不可達(dá)的ICMP。 -
半開鏈接
通信一端崩潰又重啟,此時(shí)如果對端發(fā)送信息,那么本端會(huì)發(fā)送重置報(bào)文。
套接字選項(xiàng)SO_LINGER
此選項(xiàng)指定函數(shù)close對面向連接的協(xié)議如何操作(如TCP)。內(nèi)核缺省close操作是立即返回,如果有數(shù)據(jù)殘留在套接口緩沖區(qū)中則系統(tǒng)將試著將這些數(shù)據(jù)發(fā)送給對方。
參考文章1,參考文章2
當(dāng)該數(shù)值設(shè)置為0,那么也意味著,不會(huì)再連接終止之前為了確保本端緩存中的數(shù)據(jù)都發(fā)送出去而等待。
TCP超時(shí)重傳
TCP擁有兩套獨(dú)立雞翅來完成重傳,一、基于時(shí)間,二、給予確認(rèn)信息ACK
TCP在發(fā)送數(shù)據(jù)時(shí)會(huì)設(shè)置計(jì)時(shí)器,如果計(jì)時(shí)器超時(shí)認(rèn)為受到數(shù)據(jù)確認(rèn)信息,就會(huì)引發(fā)相應(yīng)的超時(shí),或給予計(jì)時(shí)器的重傳操作,計(jì)時(shí)器超時(shí)時(shí)成為重傳超時(shí)(RTO)。
TCP累計(jì)確認(rèn)無法返回新的ACK,或者當(dāng)ACK包含選擇確認(rèn)信息(SACK)時(shí),表明出現(xiàn)書序數(shù)據(jù)報(bào),空洞。就會(huì)引起快速重傳。
基于時(shí)間的超時(shí)重傳
超時(shí)重傳計(jì)時(shí)器的設(shè)置
TCP超時(shí)和重傳的基礎(chǔ)是如何根據(jù)給點(diǎn)連接RTT設(shè)置RTO。
若RTO短與RTT,那么沒分都會(huì)重傳,反之,整個(gè)網(wǎng)絡(luò)利用率就會(huì)隨之下降。
RTT樣本:TCP在收到數(shù)據(jù)后會(huì)返回確認(rèn)信息ACK,該信息中攜帶一個(gè)字節(jié)的數(shù)據(jù),測量傳輸該確認(rèn)需要的時(shí)間,該測量結(jié)果成為RTT樣本。
每個(gè)連接的RTT軍獨(dú)立計(jì)算。
如何根據(jù)RTT來設(shè)置RTO,有如下的方法
經(jīng)典方法
平滑RTT估計(jì)值SRTT
公式:SRTT=a*SRTT+(1-a)RTT
,a取0.8-0.9
。
當(dāng)TCP運(yùn)行在RTT變化較大的網(wǎng)絡(luò)中,無法取得期望的結(jié)果。
標(biāo)準(zhǔn)方法
以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)
快速重傳
帶選擇確認(rèn)的重傳
偽超時(shí)與重傳
因?yàn)閬G失ACK,或者實(shí)際RTT顯著增長,可能出現(xiàn)偽超時(shí)的現(xiàn)象。
以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)
包失序與包重復(fù)
造成包失序的原因
每個(gè)包可以選擇各自的傳送路徑。某些高級(jí)路由器的采用多個(gè)并行數(shù)據(jù)鏈路,不同的處理演示也會(huì)導(dǎo)致包的離開順序和到達(dá)順序不匹配
包的失序會(huì)造成重傳,很近單嘛,前面一個(gè)小號(hào)的Seq沒到達(dá),后面的先到達(dá),那么ACK就會(huì) 重復(fù)
包重復(fù)
包重組
當(dāng)TCP超時(shí)重發(fā)是,循序執(zhí)行重新租寶,發(fā)送送一個(gè)更大的報(bào)文段提高性能,不超過MSS和MTU。
出現(xiàn)在每次傳送的包較小,又丟包的情況
數(shù)據(jù)流與窗口管理
交互式通信
SSH
每個(gè)交互鍵通常會(huì)生成一個(gè)單獨(dú)的數(shù)據(jù)報(bào),也就是每個(gè)按鍵是獨(dú)立傳輸?shù)摹?br> ssh調(diào)用一個(gè)shell,對客戶端輸入的字符做出輝縣,因此,每個(gè)字符生成4個(gè)tcp數(shù)據(jù)段,客戶端的交互按鍵輸入,服務(wù)器對按鍵的ACK,服務(wù)器生成的輝縣,客戶端對回顯的ACK。通常第二段和第三段合并,成為捎帶延時(shí)確認(rèn)。
PSH位設(shè)置,意味著發(fā)送端的緩存為空,也就是沒什么可以發(fā)送了。
延時(shí)確認(rèn)
許多情況下,TCP并不是對每個(gè)到來的包都單獨(dú)的ACK,利用累計(jì)ACK可以確認(rèn)之前的ACK。累計(jì)確認(rèn)可以允許TCP延時(shí)一段時(shí)間發(fā)送ACK,以便將ACK和相同方向上需要傳輸?shù)臄?shù)據(jù)結(jié)合發(fā)。這種捎帶傳輸?shù)姆椒ǔS糜谂繑?shù)據(jù)傳輸。
不能任意的延遲ACK,會(huì)造成重傳。同時(shí)當(dāng)失序發(fā)生時(shí),必須立刻傳送ACK。
系統(tǒng)可以設(shè)置,一般延時(shí)為200-600毫秒。
Nagle算法
該算法要求,當(dāng)TCP連接中有在傳數(shù)據(jù)(那些已發(fā)送,但是未確認(rèn)的數(shù)據(jù))時(shí),小的報(bào)文段就不能被發(fā)送,知道所有的數(shù)據(jù)都受到ACK。并且受到ACK后,TCP收集這些小的數(shù)據(jù),整合到一個(gè)報(bào)文段中發(fā)送。
這種方法破事TCP遵循等停規(guī)程,只有收到所有傳送數(shù)據(jù)的ACK后才能繼續(xù)發(fā)送新數(shù)據(jù)。
該算法的不同之處在于他實(shí)現(xiàn)了自時(shí)鐘控制,ACK返回越快,傳輸也越快。在相對高延遲的廣域網(wǎng)中,更需要減小小報(bào)文的數(shù)目,該算法使得單位時(shí)間內(nèi)發(fā)送的報(bào)文數(shù)目更少,RTT控制發(fā)包速率。
該算法減少小包數(shù)目的同時(shí),也增大了傳輸時(shí)延,也就是總的發(fā)送時(shí)間。
流量控制與窗口管理
窗口大小表明本端可用緩存大小,對端傳送的數(shù)據(jù)不應(yīng)該超過改大小。
也表明對端發(fā)送的數(shù)據(jù)的最大大小為TCP頭部ACK號(hào)和窗口大小字段之和。
也就是Seq = ACK+MSS
滑動(dòng)窗口
發(fā)送窗口
TCP活動(dòng)的兩端都維護(hù)一個(gè)發(fā)送窗口結(jié)構(gòu)和接受窗口結(jié)構(gòu)。
TCP以字節(jié)為單位維護(hù)窗口結(jié)構(gòu)。
每個(gè)TCP報(bào)文段都包含ACK號(hào)和窗口通告信息,TCP發(fā)送端可以據(jù)此調(diào)節(jié)窗口結(jié)構(gòu)。
窗口左邊界不能左移。
窗口的動(dòng)作分為,關(guān)閉(收到ACK,左邊右移),打開(MSS擴(kuò)大,右邊右移),收縮(MSS減小,右邊左移)
當(dāng)收到ACK號(hào)增大,而MSS不變時(shí)窗口向前滑動(dòng)
當(dāng)當(dāng)左邊界與右邊界相等時(shí),成為零窗口,此時(shí)發(fā)送端不能在發(fā)送新的數(shù)據(jù),這種情況下,TCP開始探測對端窗口,伺機(jī)增大窗口。
接受窗口
接受窗口也有左邊界和右邊界,但窗口內(nèi)的字節(jié)并沒有區(qū)分,到達(dá)序號(hào)小于左邊便捷,被認(rèn)為是重復(fù)的,丟棄!超過右邊界的則超出處理范圍,丟棄!只有Seq在窗口內(nèi)的包才能被確認(rèn),SACK的包也能被確認(rèn),因?yàn)閷Χ税l(fā)送的包的最大大小為ACK+MSS,因此整個(gè)包的大小不會(huì)超過MSS,同時(shí)MSS一般都不是太小,不會(huì)緩沖區(qū)溢出。
因此,上面提到那些,不同連接的包因?yàn)榫W(wǎng)絡(luò)阻塞,最后又到達(dá)新連接的包,大概率是要被丟棄的。
接受窗口只有收到左邊界序號(hào)的數(shù)據(jù)時(shí)才會(huì)向右滑動(dòng)。
零窗口
當(dāng)接受窗口值變?yōu)?是,可以郵箱的組織發(fā)送端繼續(xù)發(fā)送,知道窗口大小回復(fù)為非0值。當(dāng)接收端窗口得到可用空間是,就會(huì)給發(fā)送端傳輸一個(gè)窗口更新,告知器可以繼續(xù)發(fā)送數(shù)據(jù),這樣的這樣的窗口更新通常不包含數(shù)據(jù),成為純ACK,因此不能保證傳輸?shù)目煽啃浴?br>
如果一端的窗口更新ACK丟失,通信雙方就會(huì)處于等待狀態(tài)。為避免這種情況發(fā)生。發(fā)送端會(huì)采用一個(gè)持續(xù)計(jì)時(shí)器間歇性的查詢接收端,看其窗口是否已經(jīng)增長。
持續(xù)計(jì)時(shí)器會(huì)觸發(fā)窗口探測的傳輸,強(qiáng)制要求對端返回ACK。窗口探測包包含一個(gè)字節(jié)數(shù)據(jù),采用TCP傳輸,因此可以避免窗口更新丟失導(dǎo)致的死鎖。因?yàn)榘粋€(gè)字節(jié)數(shù)據(jù)Seq改變,接受端必須處理,如果接受就會(huì)ACK。窗口大小還是0,那么就會(huì)丟棄該報(bào),沒有響應(yīng)。這時(shí)候發(fā)送端會(huì)持續(xù)的發(fā)送窗口探測包。
糊涂窗口SWS
當(dāng)接收端通告窗口較小,或者發(fā)送端發(fā)送的數(shù)據(jù)較小。這樣數(shù)據(jù)報(bào)的有效攜帶率小,耗費(fèi)網(wǎng)絡(luò)資源多。
避免方法
- 接收端
不應(yīng)該通告小的窗口值。這個(gè)沒看懂啊。 - 發(fā)送端
不應(yīng)發(fā)送曉得報(bào)文段,而應(yīng)該采用Nagle算法控制何時(shí)發(fā)送。直到:數(shù)據(jù)報(bào)到達(dá)MSS全場,或者數(shù)據(jù)段長度超過最大窗口值的一半。
緊急機(jī)制
以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)以后再補(bǔ)