Tcp连接的七次握手浅析
連接的三次握手
關(guān)閉的四次握手
對(duì)于關(guān)閉流程,一共有三種情況:客戶端主動(dòng)關(guān)閉,服務(wù)器端主動(dòng)關(guān)閉,客戶端和服務(wù)器端同時(shí)主動(dòng)關(guān)閉。這里僅僅以客戶端主動(dòng)關(guān)閉為例列出下圖。
對(duì)于關(guān)閉流程,服務(wù)器端和客戶端是對(duì)等的地位,其它兩種場景處理過程類似。需要注意的是,由于對(duì)端是是可以主動(dòng)關(guān)閉的,因此在代碼中需要加上被動(dòng)關(guān)閉的響應(yīng)流程。
為什么連接和關(guān)閉握手次數(shù)不一樣
看到上述流程,可能有一個(gè)疑問:為什么連接和關(guān)閉的握手次數(shù)不一樣?其實(shí),不論是連接還是關(guān)閉,客戶端和服務(wù)器端都是發(fā)送了一次請(qǐng)求(SYN/FIN),回應(yīng)了一次應(yīng)答(ACK),它們是對(duì)稱的。但是,在連接的時(shí)候服務(wù)器端的請(qǐng)求和應(yīng)答是在一次握手中同時(shí)完成的,而關(guān)閉的時(shí)候卻是分兩次完成的,所以就造成了連接和關(guān)閉的握手次數(shù)不對(duì)稱。
現(xiàn)在,新問題又來了:為什么連接時(shí)復(fù)用一次握手,而關(guān)閉的時(shí)候不復(fù)用握手?這個(gè)則是因?yàn)檫B接和關(guān)閉的行為不是一樣所造成的。
- 在連接過程中,客戶端是主動(dòng)連接,服務(wù)器端是被動(dòng)連接,這個(gè)順序是確定了的,因此,可以復(fù)用第二次握手。
- 在關(guān)閉的過程中,客戶端和服務(wù)器端可能同時(shí)主動(dòng)關(guān)閉,此時(shí)就不能復(fù)用第二次握手了,因此請(qǐng)求和應(yīng)答需要單獨(dú)的發(fā)送。
Tcp連接的狀態(tài)遷移圖
前面只考慮了理想的情況,在實(shí)際的過程中,可能還需要處理一些異常操作,如下則是一個(gè)完成的TCP連接的狀態(tài)遷移圖。
半打開連接和半關(guān)閉連接
如前所述,建立或關(guān)閉一個(gè)連接時(shí)需要三或四步的,在這個(gè)過程中,TCP連接則會(huì)處于一個(gè)半打開或半關(guān)閉狀態(tài)。例如,前面狀態(tài)圖中的FIN_WAIT_1和FIN_WAIT_2就是半關(guān)閉狀態(tài)。
一般來說,半連接只是一個(gè)暫停的過程。但是,在一些異常的情況的時(shí)候(如遠(yuǎn)端主機(jī)故障)的時(shí)候常常會(huì)造成半關(guān)閉連接,由于Tcp連接處于半打開或半關(guān)閉狀態(tài)的時(shí)候,仍然會(huì)占用相應(yīng)的端口資源,尤其對(duì)于http之類的海量服務(wù)來說,會(huì)造成大量端口被占用,會(huì)造成資源的浪費(fèi)。
另外,有的程序也針對(duì)Tcp協(xié)議的這一特征來惡意進(jìn)行網(wǎng)絡(luò)攻擊。例如,對(duì)于一個(gè)服務(wù)器,大量的惡意客戶端建立連接后,既不發(fā)請(qǐng)求,也不close套接字,這種情況下服務(wù)器如何保護(hù)自己呢。因?yàn)槿绻犞沃脑?#xff0c;大量的惡意連接會(huì)耗盡服務(wù)器的可用描述符,導(dǎo)致服務(wù)器不能服務(wù)。就算服務(wù)器主動(dòng)close,如果客戶端不close的話,那么這個(gè)連接還是不能完全釋放。對(duì)于服務(wù)器來說,需要增加相應(yīng)的機(jī)制進(jìn)行半連接的處理。
總結(jié)
以上是生活随笔為你收集整理的Tcp连接的七次握手浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 时间转化函数及常见函数 .
- 下一篇: Excel 内的 VBS 脚本编程锦策