7)Tcp關(guān)閉連接需要四次握手,這又是為什么呢?
這是由tcp半關(guān)閉(harf-close)造成的。既然一個(gè)TCP連接是全雙工(即數(shù)據(jù)在兩個(gè)方向上能同時(shí)傳遞),因此每個(gè)方向必須單獨(dú)地進(jìn)行關(guān)閉。即一方發(fā)送一個(gè)FIN,另一方收到后發(fā)送一個(gè)ACK,這就是所謂的四次握手了。
8)第一次握手做什么?
客戶端發(fā)送一個(gè)FIN(這個(gè)客戶端是主動(dòng)發(fā)起關(guān)閉的一端,與建立連接時(shí)的客戶端不一定是同一主機(jī))
此時(shí)客戶端進(jìn)入FIN_WAIT_1狀態(tài)。
9)第二次握手做什么?
服務(wù)端收到FIN,發(fā)回客戶端一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1(因?yàn)镕IN和SYN一樣,會(huì)占用一個(gè)序號(hào));客戶端收到ACK之后會(huì)進(jìn)入FIN_WAIT_2狀態(tài),服務(wù)端會(huì)進(jìn)入CLOSE_WAIT狀態(tài)。
10)第三次握手做什么?
服務(wù)端發(fā)送給客戶端一個(gè)FIN。服務(wù)端進(jìn)入LAST_ACK狀態(tài)。
11)第四次握手做什么?
客戶端收到FIN,發(fā)回服務(wù)端一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1;客戶端會(huì)進(jìn)入TIME_WAIT狀態(tài),2MSL超時(shí)后進(jìn)入CLOSE狀態(tài)。服務(wù)端收到ACK后也會(huì)進(jìn)入CLOSE狀態(tài)。
其實(shí)我們通俗的說每次握手其實(shí)就是發(fā)一次數(shù)據(jù)包的過程。建立連接時(shí)雙方共發(fā)送了3個(gè)包,關(guān)閉連接時(shí)發(fā)送和確認(rèn)的兩次握手決定了一端數(shù)據(jù)流的關(guān)閉,四次握手可以保證兩方都關(guān)閉。
12)為什么建立連接是三次握手,而關(guān)閉連接是四次呢?
建立連接時(shí),服務(wù)端可以把應(yīng)答ACK和同步SYN放在一個(gè)報(bào)文里進(jìn)行發(fā)送。而關(guān)閉連接時(shí),收到FIN通知僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送過來了,并不表示自己的數(shù)據(jù)全部發(fā)送給了對(duì)方。所以ACK和FIN是分了兩次進(jìn)行發(fā)送。如果服務(wù)端收到FIN,恰恰自己也沒有數(shù)據(jù)要發(fā),是不是ACK和FIN可以一起發(fā)給客戶端呢,這樣就可以少一次數(shù)據(jù)流了。世界是美好的,經(jīng)典的TCP連接狀態(tài)圖中也考慮到了這種情況,tcp關(guān)閉連接確實(shí)是只有三次數(shù)據(jù)流動(dòng),服務(wù)端將ACK和FIN放在一個(gè)包里進(jìn)行發(fā)送,但四次握手這個(gè)概念卻已經(jīng)根深蒂固無法更改了。
13)Tcp的各個(gè)狀態(tài)是怎樣的?
客戶端的正常tcp狀態(tài):
CLOSED->SYN_SENT(第1次)->ESTABLISHED(第3次)->FIN_WAIT_1(第1次)->FIN_WAIT_2(第2次)->TIME_WAIT(第4次)->CLOSED
服務(wù)端的正常tcp狀態(tài):
CLOSED->LISTEN->SYN_RCVD(第2次)->ESTABLISHED(第3次)->CLOSE_WAIT(第2次)->LAST_ACK(第3次)->CLOSED(第4次)
tcp還有其他的非正常狀態(tài),在此不做討論。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |