1. 程式人生 > >TCP/UDP與connect系統呼叫

TCP/UDP與connect系統呼叫

一、TCP與UDP區別

       TCP保證資料正確性,UDP可能丟包;TCP保證資料順序,UDP不保證。

       TCP---傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。

       UDP---使用者資料報協議,是一個簡單的面向資料報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快
二、TCP中connect操作與UDP中connect操作的區別

       1)TCP中呼叫connect會引起三次握手,client與server建立連線。UDP中呼叫connect時核心僅僅把對端ip&port記錄下來。

       2)TCP只能呼叫一次connect,UDP中可以多次呼叫connect。

三、UDP多次呼叫connect的兩種用途

   UDP是一個無連線的協議,因此socket函式connect()似乎對UDP是沒有意義的,然而事實不是這樣。它可以用來指定本地埠和本地地址,來建立虛擬連線。

1)指定一個新的ip&port連線。(直接設定connect第二個引數即可

       2)斷開和之前的ip&port的連線。(將connect第二個引數中的

sin_family設定成 AF_UNSPEC即可

四、UDP呼叫connect的作用:提高效率

       普通的UDP傳送兩個報文時核心操作如下:建立連線--->傳送報文--->斷開連線--->建立連線--->傳送報文--->斷開連線;

       採用connect方式的UDP傳送兩個報文時核心操作如下:建立連線--->傳送報文--->傳送報文。另外一點,每次傳送報文核心都有可能要做路由查詢。

五、UDP中使用connect的好處

       1)提高效率,如上;

       2)高併發服務中會增加系統穩定性。原因:假設client A 通過非connect的UDP與server B,C通訊。B,C提供相同服務。為了負載均衡,我們讓A與B,C交替通訊。A 與 B通訊:IPa:PORTa <----> IPb:PORTb;A 與 C通訊:IPa:PORTa' <---->IPc:PORTc。假設PORTa 與 PORTa'相同了(在大併發情況下會發生這種情況),那麼就有可能出現A等待B的報文,卻收到了C的報文,導致收報錯誤。解決方法就是採用connect的UDP通訊方式:在A中建立兩個udp,然後分別connect到B,C。

PS:採用connect的UDP傳送接受報文可以呼叫send,write和recv,read操作。當然也可以呼叫sendto,recvfrom。呼叫sendto的時候第五個引數必須是NULL,第六個引數是0。呼叫recvfrom,recv,read系統呼叫只能獲取到先前connect的ip&port傳送的報文。