7)Tcp關(guān)閉連接需要四次握手,這又是為什么呢?
這是由tcp半關(guān)閉(harf-close)造成的。既然一個TCP連接是全雙工(即數(shù)據(jù)在兩個方向上能同時傳遞),因此每個方向必須單獨地進行關(guān)閉。即一方發(fā)送一個FIN,另一方收到后發(fā)送一個ACK,這就是所謂的四次握手了。
8)第一次握手做什么?
客戶端發(fā)送一個FIN(這個客戶端是主動發(fā)起關(guān)閉的一端,與建立連接時的客戶端不一定是同一主機)
此時客戶端進入FIN_WAIT_1狀態(tài)。
9)第二次握手做什么?
服務(wù)端收到FIN,發(fā)回客戶端一個ACK,確認序號為收到的序號加1(因為FIN和SYN一樣,會占用一個序號);客戶端收到ACK之后會進入FIN_WAIT_2狀態(tài),服務(wù)端會進入CLOSE_WAIT狀態(tài)。
10)第三次握手做什么?
服務(wù)端發(fā)送給客戶端一個FIN。服務(wù)端進入LAST_ACK狀態(tài)。
11)第四次握手做什么?
客戶端收到FIN,發(fā)回服務(wù)端一個ACK,確認序號為收到的序號加1;客戶端會進入TIME_WAIT狀態(tài),2MSL超時后進入CLOSE狀態(tài)。服務(wù)端收到ACK后也會進入CLOSE狀態(tài)。
其實我們通俗的說每次握手其實就是發(fā)一次數(shù)據(jù)包的過程。建立連接時雙方共發(fā)送了3個包,關(guān)閉連接時發(fā)送和確認的兩次握手決定了一端數(shù)據(jù)流的關(guān)閉,四次握手可以保證兩方都關(guān)閉。
12)為什么建立連接是三次握手,而關(guān)閉連接是四次呢?
建立連接時,服務(wù)端可以把應(yīng)答ACK和同步SYN放在一個報文里進行發(fā)送。而關(guān)閉連接時,收到FIN通知僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送過來了,并不表示自己的數(shù)據(jù)全部發(fā)送給了對方。所以ACK和FIN是分了兩次進行發(fā)送。如果服務(wù)端收到FIN,恰恰自己也沒有數(shù)據(jù)要發(fā),是不是ACK和FIN可以一起發(fā)給客戶端呢,這樣就可以少一次數(shù)據(jù)流了。世界是美好的,經(jīng)典的TCP連接狀態(tài)圖中也考慮到了這種情況,tcp關(guān)閉連接確實是只有三次數(shù)據(jù)流動,服務(wù)端將ACK和FIN放在一個包里進行發(fā)送,但四次握手這個概念卻已經(jīng)根深蒂固無法更改了。
13)Tcp的各個狀態(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)蒙古 |