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