為什么要“三次握手投剥,四次揮手”?
1)所謂三次握手(Three-way Handshake),是指建立一個TCP連接時澳腹,需要客戶端和服務(wù)器總共發(fā)送3個包。三次握手的目的是連接服務(wù)器指定端口杨何,建立TCP連接,并同步連接雙方的序列號和確認(rèn)號并交換 TCP 窗口大小信息酱塔。在socket編程中,客戶端執(zhí)行connect()時晚吞,將觸發(fā)三次握手:即客戶端和服務(wù)端通信前要進(jìn)行連接延旧,“3次握手”的作用就是雙方都能明確自己和對方的收、發(fā)能力正常槽地。
第一次握手:客戶端發(fā)送網(wǎng)絡(luò)包迁沫,服務(wù)端收到。服務(wù)端得出結(jié)論:客戶端發(fā)送能力捌蚊、服務(wù)端接收能力正常集畅。
第二次握手:服務(wù)端發(fā)包,客戶端收到缅糟⊥χ牵客戶端得出結(jié)論:服務(wù)端接收、發(fā)送能力正常窗宦,客戶端接收赦颇、發(fā)送能力正常二鳄。
第三次握手:客戶端發(fā)包,服務(wù)端收到媒怯。服務(wù)端得出結(jié)論:客戶端接收订讼、發(fā)送能力正常,服務(wù)端發(fā)送扇苞、接收能力正常欺殿。
所以第一、二次握手鳖敷,只是為了驗證彼此的接收發(fā)送能力是否正常脖苏。經(jīng)歷上面的三次握手過程,客戶端和服務(wù)端都確認(rèn)了自己的接收定踱、發(fā)送能力是正常的棍潘,就可以正常通信了。
2)所謂四次揮手(four-way handshake)屋吨,就是指TCP的連接的拆除過程需要發(fā)送四個包蜒谤,客戶端或服務(wù)器均可主動發(fā)起揮手動作,在socket編程中至扰,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作鳍徽。
TCP連接是雙向傳輸?shù)膶Φ鹊哪J剑褪钦f雙方都可以同時向?qū)Ψ桨l(fā)送或接收數(shù)據(jù)敢课〗准溃客戶端或者服務(wù)端皆可以主動發(fā)送指令告訴對方,我要關(guān)閉連接了直秆,比如:
客戶端:我要關(guān)閉連接了(客戶端發(fā)起Close)
服務(wù)端:好濒募,你關(guān)吧(服務(wù)端收到關(guān)閉指令,回了一個ACK)【此時客戶端不可以向服務(wù)端傳輸數(shù)據(jù)圾结,但是服務(wù)端仍然可以向客戶端傳輸數(shù)據(jù)】
服務(wù)端:我傳完所有數(shù)據(jù)啦(發(fā)送一個FIN段來關(guān)閉向客戶端傳輸方向上的連接)
客戶端:哦瑰剃,好的,知道(發(fā)送ACK確認(rèn)關(guān)閉連接)
注意:接收到FIN報文的一方只能回復(fù)一個ACK, 它是無法馬上返回對方一個FIN報文段的筝野,因為結(jié)束數(shù)據(jù)傳輸?shù)摹爸噶睢笔巧蠈討?yīng)用層給出的晌姚,它只負(fù)責(zé)“搬運(yùn)”。