UDP點滴

1、UDP(user datagramprotocol):用戶數據包協議,是一個傳輸層協議。

2、UDP是無連接的。UDP的客戶端和服務器沒有固定的綁定關係。言下之意,同一個UDP 客戶端 socket可以向多個不同UDP服務器socket發包,同一個UDP服務器socket可以接收來自多個不同UDP客戶端socket的數據包。

3、UDP是一個不可靠的傳輸層協議,沒有丟包重傳機制。

4、UDP的每一個數據包,都是有包邊界的,不像TCP是面向字節流的協議。

5、未連接UDP socket不能收到“端口不可達之類的icmp消息”

6、UDP socket也可以調用connect函數。對於UDPsocket來說,調用connect並不會有類似TCP一樣的“三次握手”機制,僅僅是綁定“目的IP地址,目的端口號”。關鍵點:UDP socket的connect,不會向對端發送任何數據包!!!!!!!

7、已連接的UDP socket,發包的時候,可以用send,sendto。對於sendto,目的地址指針參數必須爲NULL,目的地址長度參數必須是0。

8、已連接的UDP socket,接收數據包的時候,可以用recv,recvfrom。對於recvfrom,源地址指針參數必須爲NULL,源地址長度參數必須是0。

9、已連接的UDP socket可以接收到類似“端口不可達,之類的icmp消息”

10、已連接的UDP socket只能收,“源IP地址和源端口號”與“綁定的IP地址和端口號”相匹配的數據包。例如,客戶端UDP socket 調用了connect連接了服務端UDP socket,那麼客戶端只能收到數據包的“源IP地址、源端口號”與“調用connect綁定的IP地址、端口號”匹配的數據包。

11、對於已連接的UDP socket,在以下兩種情況下,可以繼續調用connect函數

1)綁定一個新的“目的端口號和IP”

2)取消已有的連接。可以通過把socket 地址結構的sin_family字段值設爲AF_UNSPEC

12、對於已連接的UDP socket,只有在調用send或者sendto發送第一個數據包的時候,才能收到“類似icmp端口不可達的錯誤”。因爲,UDP connect的時候,不會有發包行爲。

13、對於UDP socket,調用connect,內核會同時綁定本地的ip地址和端口號。(注意,sun solaris不支持)

14、UDP可以支持“單播、廣播、組播”,TCP只能支持“單播”

15、調用UDP的recvmsg函數,可以得到輔助數據。例如,數據包的目的IP,目的端口。

16、當調用UDP的recvfrom函數的時候,如果接收的數據包大小超過了接收數據緩衝的大小,那麼多餘的數據就會被內核丟棄。並且,設置MSG_TRUNC標誌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章