TCP連接一旦建立,服務器端和客戶端就成為了對等關系,任何一方都可以發出關閉握手請求,甚至可以同時發出關閉握手請求。TCP的連接建立需要3次握手,而正常關閉則需要4次握手。
1、主動關閉的一方A調用close(),SendQ不再接收send()寫入信息,在SendQ隊列的最后,向被動關閉的一方發送TCP的IP數據報作為關閉握手的請求。這個數據報中包含著標志FIN,也包含著此刻的字節序號m。
2、B接收到第一次關閉握手請求后馬上返回一個數據報作為回應。因為B接收到了FIN作為關閉連接的一個字節的數據,所以返回的字節序號是m+1。當A接收到B的這個回應,也即是第二次握手以后,表明確認在A到B的方向上不再有數據傳送,A即轉入所謂半關閉狀態,等待B的關閉請求。而B收到FIN會導致recv()返回零,讓應用層知道A到B的連接已經斷開。
3、B方通知了應用層后也就進入等待關閉的狀態。當B開始進入關閉流程,也會由B向A發送一個FIN,同時包含著B到A通訊方向上此刻的字節序號n。
4、A接收到B的這個FIN之后,也會將序號n+1反饋給B,自此,表明B到A的方向上不再有數據傳送,TCP連接正式成功關閉。
以上只是對TCP連接關閉的簡單描述,事實上,除了使用close()關閉,還可以使用shutdown(),這樣在“半關閉”狀態下還可以對TCP做其他的利用,具體內容就請大家自己查閱相關資料了。
最后,送上本人對于TCP連接的理解——“雙向的單行道”——分別建立連接,也分別斷開連接。
posted on 2010-06-07 20:58
lf426 閱讀(2943)
評論(0) 編輯 收藏 引用 所屬分類:
SDL入門教程 、
socket 編程入門教程