當前位置:編程學習大全網 - 編程語言 - 網絡編程的協議連接問題?

網絡編程的協議連接問題?

我們在前幾期的文章中曾經給大家簡單介紹了關於網絡編程中不同協議的使用情況與運行的原理問題。今天昌平IT培訓就繼續來了解壹下,關於網絡編程中不同協議的狀態連接問題。

1、為什麽建立連接協議是三次握手,而關閉連接是四次揮手呢?

這是因為服務端的LISTEN狀態下的SOCKET收到SYN的請求連接時,可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在壹個報文裏壹起發送.但是關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送了,但是另壹方未必所有的數據都全部發送完全了,所以可能不會立馬關閉SOCKET,也即妳可能還需要發送壹些數據給對方之後,再發送FIN報文給對方表示妳同意現在關閉連接了,所以這裏的

2、ACK報文和FIN報文是分開發送的.

為什麽不能用兩次握手進行連接?

在三次握手中,總***需要完成兩個重要的功能,既要雙方做好發送數據的準備工作(雙方都知道彼此已經準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被發送和確認.

現在把三次握手改成僅需要兩次握手,是可能會發生死鎖的.考慮計算機客戶端和服務端之間的通信,假定客戶端給服務端發送壹個連接請求分組,服務端收到了這個分組,並發送了確認應答分組.按照兩次握手的協定,服務端認為鏈接已經成功的建立了,可以開始發送數據分組.可是,客戶端在服務端的應答分組在傳輸中被丟失的情況下,將不會知道服務端是否已準備好,不知道服務端建立什麽樣的序列號,客戶端甚至會懷疑服務端是否收到自己的連接請求分組.在這種情況下,客戶端認為連接還未建立成功,將忽略服務端發來的任何數據分組,只等待連接確認應答分組.而服務端在發出的數據分組超時後,重復發送同樣的數據分組,就形成了死鎖.

3、為什麽TIME_WAIT狀態需要等2MSL後才能返回到CLOSED狀態?

什麽是MSL?MSL即MaximumSegmentLifetime,也就是報文大生存時間.'MSL是任何報文段被丟棄前在網絡內的長時間.'那麽,2MSL也就是這個時間的兩倍,當TCP連接完成四個報文段的交換時,主動關閉的壹方將繼續等待壹定時間(2-4)分鐘,即使兩端的應用程序結束.

4、為什麽需要2MSL呢.

壹,雖然雙方都同意關閉連接了,而且握手的四個報文也都協調和發送完畢,按理可以直接回到CLOSED狀態(就好比從SYN_SEND狀態到ESTABLISH狀態那樣);但是因為對方處於LAST_ACK狀態下的SOCKET可能會因為超時未收到ACK報文,而重發FIN報文,所以這個TIME_WAIT狀態的作用就是用來重發可能丟失的ACK報文.

二,報文可能會被混淆,意思是說其他時候的連接可能會被當做本次的連接.

當某個連接的壹端處於TIME_WAIT狀態時,該連接將不能再被使用.事實上,對於我們比較有現實意義的是,這個端口將不能再被使用.某個端口處於TIME_WAIT(其實應該是這個連接)狀態時,這意味著這個TCP連接並沒有斷開(完全斷開),那麽.如果妳bind這個端口,就會失敗.對於服務器而言,如果服務器突然crash掉了,那麽他將無法在2MSL內重新啟動,因為bind會失敗.解決這個問題的壹個方法就是設置SOCKET的SO_REUSEADDR選項.這個選項意味著可以重用壹個地址.

當建立壹個TCP連接時,服務端會繼續用原有端口,同時用這個端口與客戶端通信.而客戶端默認情況下會使用壹個隨機端口與服務端的端口通信.有時候,為了服務端的安全性,我們需要對客戶端進行驗證,即限定某個IP的某個特定端口的客戶端.客戶端可以使用bind來使用特定的端口.對於服務端,當設置了SO_REUSEADDR選項時,它可以在2MSL內啟動並listen成功.但是對於客戶端,當使用bind並設置SO_REUSEADDR時,如果在2MSL內啟動,雖然bind會成功,但是在windows平臺上connect會失敗.而在linux是哪個不存在這個問題.

  • 上一篇:三菱FX3G的性能介紹
  • 下一篇:編程將納入中小學課程,對此,父母該如何做好引導好孩子學好編程這門課?
  • copyright 2024編程學習大全網