天天看點

淺談TCP/IP協定棧(十)TCP的連接配接和狀态遷移

上一節講了TCP封包頭的格式以及其中一些字段的含義和作用,相信大家對于TCP協定已經有了初步的了解,下面我們還是圍繞TCP協定的概述,也就是面向連接配接的可靠的位元組流服務來進一步介紹TCP協定

雖然隻有3個關鍵字:面向連接配接、可靠、位元組流,但實際上真正了解TCP還是有一定難度的,不過也不要緊,讓我們分解關鍵字,一個一個細細道來,今天為大家介紹TCP面向連接配接的特性

提起TCP協定,相信大家也都聽過三次握手和四次揮手了,所謂三次握手是指在建立連接配接時,用戶端和服務端需要進行三次互動才能建立連接配接,而四次揮手則是指在斷開連接配接時需要進行四次互動才可以,經典的三握四揮流程圖如下:

淺談TCP/IP協定棧(十)TCP的連接配接和狀态遷移

舉個簡單的例子,兩個人小S和小C打電話,他們的三次握手建立連接配接過程就是:

小S:喂,是小C麼?

小C:嗯嗯是的,你是小S麼?

小S:是的是的,咱們開始愉快的聊天吧!

而四次揮手的過程則是:

小S:喂,小C,我有點累啦,今天要不就這樣吧

小C:好呀,你休息下,我再說兩句

小C:哎呀,我也好累呀,今天就到這裡吧

小S:好,那就到這吧,886

然後小S和小C就挂了電話,我們注意到,在四次揮手的過程中,小S先提出了斷開連接配接,但實際上他們的對話并沒有結束,後面小C确認這個消息後,并沒有立馬斷開連接配接,而是繼續對話,這是因為TCP協定具備全雙工特性,簡單點說就是一個連接配接,存在小C——小S和小S到小C兩條線路,而小S提出并由小C确認關閉的隻是小S——小C這條線路,是以小C還可以繼續向小S發消息,直到小C也覺得要關閉連接配接并由小S确認後,兩人的所有連接配接才徹底關閉。

是以可以看到,無論哪一方想關閉連接配接,并不是真的能夠立馬關閉,而是需要對方确認後才能關閉一端的連接配接,這個時候隻是不再主動發送資料到對端,實際上還需要接收資料,這也就是為什麼關閉連接配接需要四次揮手的原因。還有一種極端情況,就是小S或者小C突然關機了,另一方如何去關閉這個連接配接的問題,這裡涉及到一些定時器的知識,後續我們會詳細介紹。

介紹完三握四揮以後,我們再來看一個非常著名的TCP遷移圖:

淺談TCP/IP協定棧(十)TCP的連接配接和狀态遷移

可以說隻要了解了這張狀态遷移圖,就算是掌握了TCP的基礎(劃重點,狀态遷移圖必考,這10分白送就看你要不要了)

下面我們就對各個狀态做一個簡單的說明:

ESTABLISHED:正在通訊和傳輸資料,表明連接配接已建立并可以正常傳輸資料

TIME_WAIT:連接配接關閉時,主動提出關閉一方需要,也就是上述例子中的小S

CLOSE_WAIT:連接配接關閉時,被動關閉連接配接的一方,上述例子中的小C

FIN_WAIT1:連接配接關閉時,主動提出關閉的一方,發送FIN報後的狀态

LAST_ACK:連接配接關閉時,被動關閉一方需要收到最後一個ack報前所處狀态

還有一些狀态碼,比較好了解,就不再一一贅述啦,對于有Linux系統和Mac系統的小夥伴,可以用這個指令行看一下——

netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

查詢結果如下:

淺談TCP/IP協定棧(十)TCP的連接配接和狀态遷移

今天就暫時到這裡啦,後面開始介紹TCP協定中的各種定時器,敬請期待!