
文章目錄一、TCP雙向分流里的FIN1.FIN信息1.1放置FIN1.1.1處前預剩發(fā)1.1.2處后被遺漏1.2發(fā)送FIN1.2.1剩余已發(fā)完1.2.2獨立仍接收1.3接收FIN1.3.1現在已收完1.3.2獨立仍在發(fā)二、數據的需求與TCB的服務1.數據需求TCB的發(fā)收服務1.1需本端TCB可靠發(fā)送1.2需對端TCB持續(xù)接收2.TCB服務數據的發(fā)收到達2.1正常完成2.2異常續(xù)/斷3.數據需求與到達服務之間的關系三、TCB對關閉的判斷處理1.正常關閉判理2.異常關閉判理2.1傳輸層2.1.1被動判斷2.1.1.1[只檢ACK超時異常]2.1.1.1.1ACK有超時異常檢測可靠傳輸有重傳的截止2.1.1.2(心跳包補成全局檢測)2.2應用層2.2.1主動判斷2.2.2調整盡成2.2.3干預調改2.1.2直接關閉3.具體異常情況的判理過程(例)3.1我方主機掉電3.2我方延遲調用close3.2.1危害3.2.2判理3.2.2.1傳輸層無能3.2.2.2僅靠應用層四、情況的判斷處理1.視角受限1.1傳輸層的被動判斷1.2應用層的主動判斷2.異常的種類時機2.1可能不定異常的范圍種類2.2可能不定異常的出現時機3.處理法則3.1無法判斷,囊括處理的事與愿及(例)3.1.1對方發(fā)送出現問題時3.1.2僅剩收對方ACK時通信道路出現問題3.1.3只是最后一個FIN沒收到3.1.4ACK傳輸延時的信息差五、四次揮手的順序與揮完1.先后揮順序1.1先揮先斷1.2不同進序2.揮不揮得完2.1揮得完2.1.1正常完整四次揮完的過程2.2揮不完一、TCP雙向分流里的FINTCP連接是全雙工的一條連接里有2條發(fā)送分流:(每方發(fā)向另方流)*2發(fā)送分流與接收分流是共同的一條,A的發(fā)送分流B的接收分流、B的發(fā)送分流A的接收分流4個緩沖區(qū):(每方接收發(fā)送區(qū))*2發(fā)送分流的發(fā)送通道可以關閉接收分流的接收通道永不關閉,只能劃結尾1.FIN信息每一方的FIN都是排在本方所有發(fā)送數據末尾的最后一個序號的報文FIN從己方發(fā)送緩沖區(qū)發(fā)到發(fā)送分流時劃發(fā)送結尾傳到對方接收緩沖區(qū)時在接收分流劃接收結尾此端的所有發(fā)送數據就是全部地到達對方了1.1放置FIN調用close放FIN到傳輸層的發(fā)送緩沖區(qū)后1.1.1處前預剩發(fā)放FIN前已放的預剩發(fā)送數據,包括還在發(fā)送緩沖區(qū)未發(fā)與已經發(fā)在發(fā)送流中未達的數據后面就是繼續(xù)按TCP可靠機制傳輸的1.1.2處后被遺漏放FIN后,當時還放在應用層用戶態(tài)緩沖區(qū)的數據,即使后面接著把它們放到發(fā)送緩沖區(qū),也已經固定會排在FIN后了就沒劃為此端的預剩發(fā)送數據后面我方的發(fā)送通道關閉后才運到通道口前,就不能發(fā)出、就算發(fā)出去了,對方的接收通道關閉后,最多才送到通道口前,就不能收到就是定為已被遺漏的數據了1.2發(fā)送FIN1.2.1剩余已發(fā)完之前我方不想發(fā)數據了就調用close后,就造出FIN放在發(fā)送緩沖區(qū),就劃定了它前面的都是此端的預剩數據把FIN前面的發(fā)送緩沖區(qū)剩余數據發(fā)到流完后,FIN也就發(fā)到了流里,就在發(fā)送分流末尾放置劃出了結束標記,就關閉發(fā)送通道1.2.2獨立仍接收仍然接收對方發(fā)送分流發(fā)來的數據,直到收到對方的FIN發(fā)送分流終點標記,也劃接收結尾地收完了1.3接收FIN1.3.1現在已收完接收緩沖區(qū)從接收分流收到FIN終點標記,就劃出了接收分流的結尾,就知道傳輸層接收緩沖區(qū)已經收完了所有對方發(fā)來的數據了后面應用層往傳輸層的接收緩沖區(qū)取完,到FIN終點標記后再取,應用層就會得到EOF,就知道取完了接收緩沖區(qū)1.3.2獨立仍在發(fā)沒想結束發(fā)送而調用close前,發(fā)送緩沖區(qū)就不放FIN也沒劃預剩數據,發(fā)送通道就會一直開著等到后面自己不想發(fā)了調用close再放FIN劃了預剩數據發(fā)完發(fā)送緩沖區(qū)的FIN剩余數據,才關閉了發(fā)送通道二、數據的需求與TCB的服務1.數據需求TCB的發(fā)收服務每端所有發(fā)送數據即單FIN,到達對方前 需要 本端對端的雙TCB分別的發(fā)送,接收的服務1.1需本端TCB可靠發(fā)送發(fā)送FIN,就把發(fā)送緩沖區(qū)里的預剩數據全部發(fā)到流上了,隨即關閉發(fā)送流的發(fā)送通道還在發(fā)送分流上還未到達對方接收緩沖區(qū)的路上所有剩余的發(fā)送數據需要 我方的TCB開著保持發(fā)送服務,繼續(xù)一路重傳保證它們的可靠傳輸,直到全部傳到對方、1.2需對端TCB持續(xù)接收需要 對方的TCB開著保持接收服務,持續(xù)到我方的發(fā)送數據所有都接收完為止2.TCB服務數據的發(fā)收到達每端TCB要服務 本端對端的所有發(fā)送數據即雙FIN分別的發(fā)送,接收的到達服務 我方所有數據即FIN到達對方的可靠發(fā)送對方所有數據即FIN到達我方的狀態(tài)接收2.1正常完成收到FIN報文就是確認收完對方所有發(fā)送數據的標志收到FIN的ACK報文就是確認對方收完我方所有發(fā)送數據的標志收到一FIN與另FIN的ACK就是確認雙FIN到達 完成服務2.2異常續(xù)/斷超時收不到ACK判斷有異常后靠應用層的調整上限與傳輸層的關閉下限 繼續(xù)/中斷服務3.數據需求與到達服務之間的關系一個TCB完成一向數據的單個發(fā)送/接收到達服務-同時另個TCB的此向數據對應的接收/發(fā)送服務也完成了-同時此向數據的發(fā)送與接收需求都已完成了三、TCB對關閉的判斷處理1.正常關閉判理連續(xù)正常限時內地收完 對方發(fā)送數據與我方發(fā)送數據的ACK回復就能被動判斷雙向數據都已無需求,已到達服務完就能確定不漏數據的需求到達服務 地關閉此方的TCB2.異常關閉判理2.1傳輸層2.1.1被動判斷階段里有超時沒收到 發(fā)送數據(沒實際數據發(fā)也有固定的心跳報文保障有發(fā))的ACK回復[階段里超時收不到發(fā)送數據,可能是對方主動發(fā)數據選擇暫時歇會了,不能被動判斷為異常,但也可以應用層干預寫成如果超時太久而主動判斷為異常;但是ACK是對方被動收到數據后得立即回的,如果階段里超時收不到ACK,那就能被動判斷為異常]就被動判斷出現了異常,并通常只能判排在范圍中2.1.1.1[只檢ACK超時異常]默認的傳輸層TCB對每階段的發(fā)送數據沒有超時的時間限制只對每階段的接收ACK數據有超時的時間限制,超時等待收不到后就關閉TCB對比發(fā)送分流的發(fā)送通道可以關閉接收分流的接收通道永不關閉,只能劃結尾2.1.1.1.1ACK有超時異常檢測可靠傳輸有重傳的截止收到我方FIN的ACK前對方即使收到了我方的FIN知道我方的發(fā)送數據發(fā)完,發(fā)送通道關閉了、他收完了我方的發(fā)送數據,他劃出了我方發(fā)送分流的接收結尾但是在我方收到,確認FIN送到對方的ACK前還是一直認為對方的接收通道沒有劃結尾,仍在接收數據就還在進行對發(fā)送了的數據,計時等收,對方接收后會被動返ACK,多次超時重傳還收不到,而判斷有異常的檢測把就算對方能收到FIN后,也可能存在的,返回ACK時出現的對方發(fā)送/我方接收/通信道路 也納入檢測使得ACK異常檢測 全程完整仍在進行,我方沒收到ACK的發(fā)送數據的重傳即使對方已經收到FIN,收完我方所有的發(fā)送數據,劃了接收通道結尾,只是ACK返回丟失,我方事實過頭的數據重傳造成了重復浪費但是過頭地就能保障到,我方發(fā)送數據的到達完整2.1.1.2(心跳包補成全局檢測)如果是我方發(fā)送出現異?;蛭曳綗o實際數據要發(fā)時心跳包的固定會發(fā)送 讓這段時間也是正常的,在計時收ACK,依舊能通過收ACK判斷是否有異常2.2應用層應用層用自己寫的2.2.1主動判斷能否主動測查出其一異常并修復能否主動判斷出雙向數據還有無需求,都已無到達服務完地2.2.2調整盡成在本應用層,調整扶持繼續(xù)服務或盡力完成結束服務2.2.3干預調改往下傳輸層,干預調改TCB的應對處理比如異常已測查出并修復TCB就繼續(xù)服務不去關閉了異常無法解決要關閉TCB時讓TCB在應用層盡成服務完,它管的數據需求與到達服務后,再關閉讓TCB超時等待收不到ACK而關閉的時間,按實際情況與性能需求縮短一點覆蓋用應用層自己實現快周期發(fā)的心跳包,選擇用更頻繁的報文消耗量換取更短時間的等待判斷性能2.1.2直接關閉傳輸層默認已寫用 不管知不知道,不管還有無漏數據到達需求 都直接關閉TCB可被應用層干預地調改成其它的處理3.具體異常情況的判理過程(例)3.1我方主機掉電(1)我方的傳輸層沒有被動判斷異常(2)我方的應用層沒有主動測查異常與判斷數據的需求到達服務、沒有調整與盡成地 服務被中斷、沒有向下干預調改 TCB的處理(3)我方的傳輸層TCB中斷地被關[1]對方的傳輸層超時收不到ACK,被動判斷出有異常[2]對方的應用層主動測查異常與判斷數據的需求到達服務、調整無果后盡成地結束服務、向下干預調改TCB的處理[3]我方的傳輸層在盡成服務完后再異常關閉TCB3.2我方延遲調用close3.2.1危害調用close異?;蛲浾{用close 而延遲的時間會使本方多開了一段,無發(fā)數據的發(fā)送通道開啟,浪費一段TCB的發(fā)送干耗維護會使對方多開一段,無收數據的接收通道開啟,浪費一段TCB的接收干耗維護3.2.2判理延遲的這段時間里3.2.2.1傳輸層無能我方傳輸層對每階段發(fā)送數據(調用close發(fā)送FIN數據),本身沒有超時限制,不能被動檢出異常不管 對方是否已發(fā)FIN發(fā)送通道關閉、FIN是否傳到我方使我方劃出接收結尾、收到我方返回的ACK而結束ACK超時異常的檢測我方始終還未發(fā)送FIN關閉發(fā)送通道、對方始終是還沒收到我方還未發(fā)的FIN,接收通道就仍沒劃結尾地在收、我方也還沒收到自己還未發(fā)的FIN的ACK而結束ACK的異常檢測因此我方還有數據發(fā)送過去,對方也還有收地會返ACK回來所以如果只是我方調用close出現異常,我方無法觸發(fā)ACK超時判斷到有異常對方即使在對方FIN還沒發(fā),對方發(fā)送通道沒關、我方沒收FIN沒劃接收通道、我方沒返ACK,對方沒收ACK而還有超時ACK的異常檢測 前對方發(fā)送數據過來,我方接收通道還沒劃結尾,收了就會返ACK所以ACK無法超時而檢測出,只是我方調用close的異常一直到后面對方發(fā)了FIN并收到返回的ACK,結束超時ACK的異常檢測3.2.2.2僅靠應用層所以close異常延遲的這段時間里對方與我方的傳輸層都無法被動判斷出有異常而雙方干耗著維護這段延遲時間內的TCB會累積這段延遲時間的CLOSED_WAIT此時就靠雙方的應用層寫有的,觀察到大量CLOSED_WAIT而主動測查出,有調用close延遲的異常四、情況的判斷處理1.視角受限每方處在 相比上帝全局視角下的 單方受限且不同視角下每一方判斷的數據需求與到達服務與事實、與對方是獨立的,且能差異在無法判斷全局視角下在雙向FIN到達前的TCB關閉,都是異常關閉的單方視角下沒有判斷確認到雙向FIN到達而視為的異常關閉實際上可能雙向FIN已到達的正常關閉1.1傳輸層的被動判斷傳輸層原生已寫好的被動判斷異常的判排范圍小、判排出有異常后,在傳輸層是設計成保底的,直接去關閉TCB的,沒去寫數據需求與到達服務的判斷(交給在應用層進一步處理寫了)1.2應用層的主動判斷應用層自己增去寫的主動判斷擴增有測查異常的判排范圍、增有查用當現情況地判斷,數據需求與到達服務2.異常的種類時機2.1可能不定異常的范圍種類收不到ACK的異常不定的范圍種類可以是對方發(fā)送出現問題對方接收出現問題我方發(fā)送出現問題我方接收出現問題通信道路出現問題2.2可能不定異常的出現時機收不到ACK的異常不定的出現時機可以在完成哪個方向數據需求的前完成哪個方向數據需求的后完成哪個方向數據到達的前完成哪個方向數據到達的后完成哪個TCB服務的前完成哪個TCB服務的后3.處理法則來自我方,環(huán)境,對方的能判斷到精確情況的就針對處理僅判斷到范圍情況的就囊括處理3.1無法判斷,囊括處理的事與愿及(例)3.1.1對方發(fā)送出現問題時如果是對方發(fā)送出現問題,接收沒有問題我方收不到ACK判斷異常,也無法修復就盡成把我方TCB的所有要發(fā)送數據與RST報文發(fā)完后,再異常關閉TCB我方可以判斷確認 對方的發(fā)送數據沒有全到達我方,我方TCB沒有完成接收到達服務、對方的發(fā)送數據還有發(fā)送與接收需求雖然我方無法判斷確認 我方的發(fā)送數據是否全部已經到達,我方TCB是否完成發(fā)送到達服務、我方的發(fā)送數據是否還有發(fā)送與接收需求但是如果出在對方發(fā)送出題問題的這種異常情況下,囊括處理后的事實是 我方的所有發(fā)送數據與RST報文都已到達了對方,我方TCB完成了發(fā)送到達服務、我方的發(fā)送數據都已無發(fā)送與接收需求這樣我方的TCB的異常關閉,其中它管的也就只漏掉了對方發(fā)送數據的接收需求與接收到達服務3.1.2僅剩收對方ACK時通信道路出現問題如果在對方已經發(fā)完它方的所有發(fā)送數據并收完它們的ACK、收完我方所有的發(fā)送數據后,返回ACK時通信道路此時出現異常對方會已完成雙FIN送達地正常關閉它的TCB我方收不到ACK判斷異常我方里面可以判斷確認 對方的發(fā)送數據已全部到達我方,我方TCB完成了接收到達服務、對方的發(fā)送數據已無發(fā)送與接收需求(我方返回的ACK是不知道對方有沒有收到,而無法知道在對方的視角下的對方的發(fā)送數據是否還有發(fā)送需求但那是在對方視角里的判斷,與我方視角里的對方發(fā)送數據已無發(fā)送需求的判斷是無關獨立的)我方無法判斷確認 我方的發(fā)送數據是否已全部送達對方,我方TCB是否完成發(fā)送到達服務、我方的發(fā)送數據是否還有發(fā)送與接收需求地異常關閉TCB但如果是在對方收完所有數據返回ACK時出現的異常囊括處理后的事實是 我方的所有發(fā)送數據都已全部送達,我方TCB也完成發(fā)送到達服務、我方的發(fā)送數據也都已無發(fā)送與接收需求這樣無法判斷確認的看似異常的TCB關閉,實則上可能也是完成雙FIN的正常關閉3.1.3只是最后一個FIN沒收到如果我方收對方發(fā)送數據就只是最后一個FIN沒收到然后發(fā)送的數據出現超時ACK,傳輸層被動判斷有異常應用層主動判斷數據需求與到達服務時對于里面的對方發(fā)送數據,可以自己靈活寫的主動判斷為 此時對方所有的發(fā)送數據都已到達,我方TCB完成了接收到達服務and對方TCB完成了發(fā)送到達服務、對方發(fā)送數據已無發(fā)送與接收需求 的實際事實3.1.4ACK傳輸延時的信息差我方發(fā)送FIN,一直到收到它的ACK前都無法判斷確認 對方的接收通道是否已經關閉而事實是 在我方發(fā)送的FIN到達對方時,對方的接收通道就已經關閉了還需要到后面ACK傳輸返回到時,我方才已知道五、四次揮手的順序與揮完1.先后揮順序1.1先揮先斷雙方的close可以互不關聯地按各自節(jié)奏發(fā)先揮方的定義是FIN先達對方者為FIN1(先發(fā)FIN2的可能后到達對方,后發(fā)FIN1的可能先到達對方),會先完成單斷1、如果對方的FIN2較返回的ACK1先到達我方那么我方會先收到對方的FIN2最后等的是 先到達對方FIN1的ACK1與此同時后揮方會先收到更早到的FIN1最后等的是 后到達我方FIN2的ACK2所以相比后揮方最后收ACK2先揮方會更早收到最后ACK1先完成單揮2、如果對方的FIN2較返回的ACK1后到達我方(通常就是Socket.hasNext嵌套Socket.close判斷條件寫法下,必須先收FIN1先返ACK1后,再進入判斷里去執(zhí)行close后發(fā)FIN2,導致的)那么我方會先收到 先到達對方FIN1的ACK1最后等的是 后到達我方的FIN2與此同時后揮方會先收到更早到的FIN1最后等的是 后到達我方FIN2的ACK2所以先揮方會先收到最后的FIN2,先完成單揮接著后揮方再收到最后的,先揮方最后收到FIN2后返回的ACK2,后完成單揮1.2不同進序四次揮手雙方有先有后地參與進流程,雙方展開的報文收發(fā)順序會不同導致先揮者在 收到對方FIN后,確認到雙FIN送達,正常關閉TCB后揮者在 收到回復ACK后,確認到雙FIN送達,正常關閉TCB2.揮不揮得完關閉TCB釋放連接狀態(tài)有兩種方式2.1揮得完正常,有序用FIN關閉完整四次地揮完手每方都是 有作FIN劃定好預剩發(fā)送數據、確認雙向數據都已無對已方TCB需求、確認雙向數據FIN都已到達對方,完成己方TCB服務地 正常關閉TCB2.1.1正常完整四次揮完的過程能不超時收ACK異常地完整四次揮完,兩端正常地關閉TCB,釋放連接狀態(tài)的過程AESTABLISHEDBESTABLISHEDclose()↓FIN1發(fā)到流----------------FIN_WAIT_1我端的預剩發(fā)送數據已經全部發(fā)到流里了我也就把我這端發(fā)送分流的發(fā)送通道關閉了收到FIN1確認到對方的所有發(fā)送數據全部到達我方也就給接收分流劃上了接收結尾----------------回ACK1CLOSE_WAIT我端可能還沒調用close,FIN2可能還沒做也就還沒劃預剩發(fā)送數據,或者已做劃了預剩發(fā)送數據,但在發(fā)送緩沖區(qū)里沒發(fā)完現在就沒關發(fā)送通道地,繼續(xù)從發(fā)送緩沖區(qū)源放數據到發(fā)送分流頭,沒斷頭地發(fā)送數據收到ACK1FIN_WAIT2確認到我方的FIN1到達對方,我端的所有發(fā)送數據全部到達對方B應用層什么時候決定關閉close()↓----------------FIN2發(fā)到流LAST_ACK我端的所有發(fā)送數據也已經全部發(fā)到發(fā)送分流里了我也把我這端發(fā)送分流的發(fā)送通道關閉了收到FIN2回ACK2-------------------------TIME_WAIT收到FIN2確認到對方的所有發(fā)送數據全部到達我方也就給接收分流劃上了接收結尾【到此時我方就確認到 雙FIN都已到達,雙方的所有發(fā)送數據都全部到達對方就確定雙向數據都已無對本端TCB需求、雙向數據全已到達,完成了本端TCB的服務 地正常關閉本端的TCB】等待2MSL↓CLOSED收到ACK2確認到我方的FIN2到達對方,我端的所有發(fā)送數據全部到達對方【到此時我方就確認到 雙FIN都已到達,雙方的所有發(fā)送數據都全部到達對方就確定雙向數據都已無對本端TCB需求、雙向數據全已到達,完成了本端TCB的服務 地正常關閉本端的TCB】↓CLOSED2.2揮不完異常,立即用RST中止超時ACK四次揮手無法揮完的至少有一方判斷有異常,它的應用層與傳輸層調整無果,盡力服務完后無法判斷全,它管的 雙向數據對它的需求、雙向數據是否已到達,它的服務是否完成 地結束TCB服務,異常關閉TCB