4、有限狀態機
上圖是 tcp 的狀態機,看了很久,感覺還是理解得不深。先在這裡打個點。
(1)closed 狀態時初始狀態。
(2)listen:被動開啟,伺服器端的 狀態變為listen(監聽)。被動開啟的概念:連線的一端的應用程式通知作業系統,希望建立乙個傳入的連線。這時候作業系統為連線的這一端建立乙個連 接。與之對應的是主動連線:應用程式通過主動開啟請求來告訴作業系統建立乙個連線。
(3)synrecvd:伺服器端收到syn後,狀態為syn;傳送syn ack;
(4)syn_senty:應用程式傳送syn後,狀態為syn_sent;
(5)established:synrecvd收到ack後,狀態為established; syn_sent在收到syn ack,傳送ack,狀態為established;
(6)close_wait:伺服器端在收到fin後,傳送ack,狀態為close_wait;如果此時伺服器端還有資料需要傳送,那麼就傳送,直到資料傳送完畢;此時,伺服器端傳送fin,狀態變為last_ack;
(7)fin_wait_1:應用程式端傳送fin,準備斷開tcp連線;狀態從established——>fin_wait_1;
(8)fin_wait_2:應用程式端只收到伺服器端得ack訊號,並沒有收到fin訊號;說明伺服器端還有資料傳輸,那麼此時為半連線;
(9)time_wait:有兩種方式進入 該狀態:1、fin_wait_1進入:此時應用程式埠收到fin+ack(而不是像fin_wait_2那樣只收到ack,說明資料已經傳送完畢)並 向伺服器端口傳送ack;2、fin_wait_2進入:此時應用程式埠收到了fin,然後向伺服器端傳送ack;time_wait是為了實現tcp 全雙工連線的可靠性關閉,用來重發可能丟失的ack報文;需要持續2個msl(最大報文生存時間):假設應用程式埠在進入time_wait後,2個 msl時間內並沒有收到fin,說明應用程式最後發出的ack已經收到了;否則,會在2個msl內在此收到ack報文;
4.1.客戶端應用程式的狀態遷移圖
客戶端的狀態可以用如下的流程來表示:
closed->syn_sent->established->fin_wait_1->fin_wait_2->time_wait->closed
以上流程是在程式正常的情況下應該有的流程,從書中的圖中可以看到,在建立連線時,當客戶端收到syn報文的ack以後,客戶端就開啟了資料互動地連線。而結束連線則通常是客戶端主動結束的,客戶端結束應用程式以後,需要經歷fin_wait_1,fin_wait_2等狀態,這些狀態的遷移就是前面提到的結束連線的四次握手。
4.2.伺服器的狀態遷移圖
伺服器的狀態可以用如下的流程來表示:
closed->listen->syn收到->established->close_wait->last_ack->closed
在建立連線的時候,伺服器端是在第三次握手之後才進入資料互動狀態,而關閉連線則是在關閉連線的第二次握手以後(注意不是第四次)。而關閉以後還要等待客戶端給出最後的ack包才能進入初始的狀態。
4.3.其他狀態遷移
書中的圖還有一些其他的狀態遷移,這些狀態遷移針對伺服器和客戶端兩方面的總結如下
listen->syn_sent,對於這個解釋就很簡單了,伺服器有時候也要開啟連線的嘛。
syn_sent->syn收到,伺服器和客戶端在syn_sent狀態下如果收到syn資料報,則都需要傳送syn的ack資料報並把自己的狀態調整到syn收到狀態,準備進入established
syn_sent->closed,在傳送超時的情況下,會返回到closed狀態。
syn_收到->listen,如果受到rst包,會返回到listen狀態。
syn_收到->fin_wait_1,這個遷移是說,可以不用到established狀態,而可以直接跳轉到fin_wait_1狀態並等待關閉。
4.4.2msl等待狀態
書中給的圖裡面,有乙個time_wait等待狀態,這個狀態又叫做2msl狀態,說的是在time_wait2傳送了最後乙個ack資料報以後,要進入time_wait狀態,這個狀態是防止最後一次握手的資料報沒有傳送到對方那裡而準備的(注意這不是四次握手,這是第四次握手的保險狀態)。這個狀態在很大程度上保證了雙方都可以正常結束,但是,問題也來了。
由於插口的2msl狀態(插口是ip和埠對的意思,socket),使得應用程式在2msl時間內是無法再次使用同乙個插口的,對於客戶程式還好一些,但是對於服務程式,例如httpd,它總是要使用同乙個埠來進行服務,而在2msl時間內,啟動httpd就會出現錯誤(插口被使用)。為了避免這個錯誤,伺服器給出了乙個平靜時間的概念,這是說在2msl時間內,雖然可以重新啟動伺服器,但是這個伺服器還是要平靜的等待2msl時間的過去才能進行下一次連線。
附帶三次握手與四次揮手
三次握手過程理解
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入syn_sent狀態,等待伺服器確認;syn:同步序列編號(synchronize sequence numbers)。
第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=j+1),同時自己也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器進入syn_recv狀態;
第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=k+1),此包傳送完畢,客戶端和伺服器進入established(tcp連線成功)狀態,完成三次握手。
四次揮手過程理解
TCP有限狀態機
狀 態 描 述 closed 關閉狀態,沒有連線活動或正在進行 listen 監聽狀態,伺服器正在等待連線進入 syn rcvd 收到乙個連線請求,尚未確認 syn sent 已經發出連線請求,等待確認 established 連線建立,正常資料傳輸狀態 fin wait 1 主動關閉 已經傳送關閉...
有限狀態機
有限狀態機 finite state machine,fsm 又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。狀態儲存關於過去的資訊,就是說 它反映從系統開始到現在時刻的輸入變化。轉移指示狀態變更,並且用必須滿足來確使轉移發生的條件來描述它。動作是在給...
有限狀態機
以前,只碰到過 陣列中所有數字只出現2次,只有乙個出現1次,找這個數的問題 每次迴圈異或陣列中元素,最後的結果就是single one。這次換作出現3次就懵逼了,主要原因,沒有使用過有限狀態機,應該說是連概念都沒有,所以這次一定要好好記錄一下 關於這道題的解釋discussion中woshidais...