TCP半开连接与半闭连接
半打開(Half-Open)連接和半關(guān)閉(Half-Close)連接。TCP是一個(gè)全雙工(Full-Duplex)協(xié)議,因此這里的半連接"半"字就是相對于全雙工的"全"來說的。
全雙工傳輸
英文寫法是:Full-Duplex Transmissions
是指交換機(jī)在發(fā)送數(shù)據(jù)的同時(shí)也能夠接收數(shù)據(jù),兩者同步進(jìn)行,這好像我們平時(shí)打電話一樣,說話的同時(shí)也能夠聽到對方的聲音。目前的交換機(jī)都支持全雙工。
全雙工的好處在于遲延小,速度快。
與之對應(yīng)的是【半雙工】這個(gè)概念:就是指一個(gè)時(shí)間段內(nèi)只有一個(gè)動(dòng)作發(fā)生,舉個(gè)簡單例子,一天窄窄的馬路,同時(shí)只能有一輛車通過,當(dāng)目前有兩量車對開,這種 情況下就只能一輛先過,等到頭兒后另一輛再開,這個(gè)例子就形象的說明了半雙工的原理。早期的對講機(jī)、以及早期集線器等設(shè)備都是實(shí)行半雙工的產(chǎn)品。隨著技術(shù) 的不斷進(jìn)步,半雙工會(huì)逐漸退出歷史舞臺(tái)。
全雙工與半雙工
在串行通信中,數(shù)據(jù)通常是在兩個(gè)站(如終端和微機(jī))之間進(jìn)行傳送,按照數(shù)據(jù)流的方向可分成三種基本的傳送方式:全雙工、半雙工、和單工.但單工目前已很少采用,下面僅介紹前兩種方式.
1 、全雙工方式( full duplex )
當(dāng)數(shù)據(jù)的發(fā)送和接收分流,分別由兩根不同的傳輸線傳送時(shí),通信雙方都能在同一時(shí)刻進(jìn)行發(fā)送和接收操作,這樣的傳送方式就是全雙工制.在全雙工方式下,通信 系統(tǒng)的每一端都設(shè)置了發(fā)送器和接收器,因此,能控制數(shù)據(jù)同時(shí)在兩個(gè)方向上傳送.全雙工方式無需進(jìn)行方向的切換,因此,沒有切換操作所產(chǎn)生的時(shí)間延遲,這對 那些不能有時(shí)間延誤的交互式應(yīng)用(例如遠(yuǎn)程監(jiān)測和控制系統(tǒng))十分有利.這種方式要求通訊雙方均有發(fā)送器和接收器,同時(shí),需要 2 根數(shù)據(jù)線傳送數(shù)據(jù)信號(hào).(可能還需要控制線和狀態(tài)線,以及地線).
比如,計(jì)算機(jī)主機(jī)用串行接口連接顯示終端,而顯示終端帶有鍵盤.這樣,一方面鍵盤上輸入的字符送到主機(jī)內(nèi)存;另一方面,主機(jī)內(nèi)存的信息可以送到屏幕顯示. 通常,往鍵盤上打入 1 個(gè)字符以后,先不顯示,計(jì)算機(jī)主機(jī)收到字符后,立即回送到終端,然后終端再把這個(gè)字符顯示出來.這樣,前一個(gè)字符的回送過程和后一個(gè)字符的輸入過程是同時(shí) 進(jìn)行的,即工作于全雙工方式.
2 、半雙式方式( half duplex )
若使用同一根傳輸線既作接收又作發(fā)送,雖然數(shù)據(jù)可以在兩個(gè)方向上傳送,但通信雙方不能同時(shí)收發(fā)數(shù)據(jù),這樣的傳送方式就是半雙工制.采用半雙工方式時(shí),通信 系統(tǒng)每一端的發(fā)送器和接收器,通過收 / 發(fā)開關(guān)轉(zhuǎn)接到通信線上,進(jìn)行方向的切換,因此,會(huì)產(chǎn)生時(shí)間延遲.收 / 發(fā)開關(guān)實(shí)際上是由軟件控制的電子開關(guān).
當(dāng)計(jì)算機(jī)主機(jī)用串行接口連接顯示終端時(shí),在半雙工方式中,輸入過程和輸出過程使用同一通路.有些計(jì)算機(jī)和顯示終端之間采用半雙工方式工作,這時(shí),從鍵盤打 入的字符在發(fā)送到主機(jī)的同時(shí)就被送到終端上顯示出來,而不是用回送的辦法,所以避免了接收過程和發(fā)送過程同時(shí)進(jìn)行的情況.
目前多數(shù)終端和串行接口都為半雙工方式提供了換向能力,也為全雙工方式提供了兩條獨(dú)立的引腳.在實(shí)際使用時(shí),一般并不需要通信雙方同時(shí)既發(fā)送又接收,像打印機(jī)這類的單向傳送設(shè)備,半雙工甚至單工就能勝任,也無需倒向.
一、半開連接
從協(xié)議定義的角度來說,TCP的半開連接是指TCP連接的一端異常崩潰,或者在未通知對端的情況下關(guān)閉連接,這種情況下不可以正常收發(fā)數(shù)據(jù),否則會(huì)產(chǎn)生RST(后面內(nèi)容我們在介紹RST)。比如一個(gè)常見的情況是TCP連接的一端異常斷電,就會(huì)導(dǎo)致TCP的半開連接。如果沒有數(shù)據(jù)傳輸,對端就不會(huì)知道本端的異常而一直處于ESTABLISHED狀態(tài)(TCP有存活檢測機(jī)制,后面內(nèi)容我們會(huì)進(jìn)行介紹)。
另外從linux實(shí)現(xiàn)的角度來說,因?yàn)閘inux內(nèi)部有個(gè)半連接隊(duì)列,TCP半開連接是指發(fā)送了TCP連接請求,等待對方應(yīng)答的狀態(tài),此時(shí)連接并沒有完全建立起來,雙方還無法進(jìn)行通信交互的狀態(tài),此時(shí)就稱為半連接。由于一個(gè)完整的TCP連接需要經(jīng)過三次握手才能完成,這里把三次握手之前的連接都稱之為半連接。
二、半關(guān)連接
TCP的半關(guān)連接是指TCP連接只有一方發(fā)送了FIN,另一方?jīng)]有發(fā)出FIN包,仍然可以在一個(gè)方向上正常發(fā)送數(shù)據(jù)。這種場景并不常見,一般來說Berkeley sockets API調(diào)用shutdown()接口時(shí)候就會(huì)進(jìn)入半關(guān)閉狀態(tài)(調(diào)用常規(guī)的close()一般是期待完整的雙向關(guān)閉這個(gè)TCP連接),shutdown()接口相當(dāng)指示程序,本端已經(jīng)沒有數(shù)據(jù)待發(fā)送,所以我發(fā)送一個(gè)FIN到對端,但是我仍然想要從對端接收數(shù)據(jù),直到對端發(fā)送一個(gè)FIN指示關(guān)閉連接為止。如下圖所示,在紅色背景文本框標(biāo)注的數(shù)據(jù)傳輸場景下就是TCP的半關(guān)連接
三、wireshrk抓包示例
首先注意半開連接是不能正常傳輸數(shù)據(jù)的,而半關(guān)連接是可以在其中的一個(gè)方向上傳輸數(shù)據(jù)的。下面簡單附一下wireshark的抓包圖示,限于篇幅僅作簡要介紹,詳細(xì)請參考對應(yīng)的wireshark抓包文件
1.TCP半開
通過單臺(tái)筆記本的雙無線網(wǎng)卡測試tcp連接的半開,步驟如下
server綁定網(wǎng)卡A的地址
client綁定網(wǎng)卡B的地址并連接server對應(yīng)截圖中的No 1--No 3包
client發(fā)送"hello"消息 對應(yīng)截圖中的No 4包
server正常接收到后"hello"消息后 拔掉網(wǎng)卡A
kill掉server進(jìn)程 使server的FIN消息不能發(fā)送到client
插上網(wǎng)卡A 注意在路由器中綁定IP地址和MAC地址,使得網(wǎng)卡A的地址和之前是一致的,此時(shí)client和server即處于半開連接狀態(tài)
client向server發(fā)送"world"消息 對應(yīng)截圖中的No 6包
server回復(fù)rst消息
2.TCP半關(guān)
正常建立連接后,client首先發(fā)送"hello"消息給server,然后server發(fā)送FIN給client,關(guān)閉了server到client方向的數(shù)據(jù)傳輸,但是client仍然可以向server傳輸數(shù)據(jù),此時(shí)client和server之間的連接即處于半關(guān)連接的狀態(tài),接下來client向server發(fā)送"world"消息,然后發(fā)送FIN給server關(guān)閉client到server方向的數(shù)據(jù)傳輸。
補(bǔ)充說明:
1.目前l(fā)inux最新的實(shí)現(xiàn)已經(jīng)沒有半連接隊(duì)列了,連接請求的pseudo sock已經(jīng)插入ehash(e代表establish,ehash即已連接hash隊(duì)列)中了
總結(jié)
以上是生活随笔為你收集整理的TCP半开连接与半闭连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何连接路由器如何牵路由器
- 下一篇: 我用的360路由器怎么和其他路由器桥接3