一、UDP
1、udp一個socket接收緩沖區的默認值
cat /proc/sys/net/core/rmem_default
~$ 212992,單位Byte,=208KB
2、udp一個socket發送緩沖區的默認值
cat /proc/sys/net/core/wmem_default
~$ 212992,單位Byte
3、每個UDP socket都有一個接收緩沖區,沒有發送緩沖區,從概念上來說就是只要有數據就發,不管對方是否可以正確接收,所以不緩沖,不需要發送緩沖區。
UDP:當套接字接收緩沖區滿時,新來的數據報無法進入接收緩沖區,此數據報就被丟棄。UDP是沒有流量控制的,快的發送者可以很容易的湮沒慢的接收者,導致接收方的UDP 丟棄新來的數據報。
4、概念
實際上在同一個網段,或者在信號很好的局域網,UDP實際上是非常可靠的。如沒有丟包並包的按順序依次到達(這個幾乎是短局域網的常態),並不需要重新傳輸包,所以TCP的所有應答和等待只會浪費時間,增加網絡延時。
5、單播
一對一通信。通常我們討論的udp的程序都是一對一的單播程序。
6、廣播
一個主機對整個局域網上所有主機上的數據通信。
廣播UDP與單播UDP的區別就是IP地址不同,廣播使用廣播地址255.255.255.255,將消息發送到在同一廣播網絡上的每個主機。值得強調的是:本地廣播信息是不會被路由器轉發。當然這是十分容易理解的,因為如果路由器轉發了廣播信息,那么勢必會引起網絡癱瘓。這也是為什么IP協議的設計者故意沒有定義互聯網范圍的廣播機制。
廣播地址通常用於在網絡游戲中處於同一本地網絡的玩家之間交流狀態信息等。
其實廣播顧名思義,就是想局域網內所有的人說話,但是廣播還是要指明接收者的端口號的,因為不可能接受者的所有端口都來收聽廣播。
7、多播(Multicasting)
單播用於兩個主機之間的端對端通信,廣播用於一個主機對整個局域網上所有主機上的數據通信。單播和廣播是兩個極端,要么對一個主機進行通信,要么對整個局域網上的主機進行通信。實際情況下,經常需要對一組特定的主機進行通信,而不是整個局域網上的所有主機,這就是多播的用途。
這里可以簡化下TCP/IP/UDP的相關討論,默認我們知道IP(UDP和TCP一樣)可以把數據包在一個網絡中發到另一個設備。更准確點就是IP把數據包從一個IP地址發到另一個IP地址。多播的決竅就是在同一時間把一個數據包發送到多個設備,可以把一個特定的IP地址指定為多播地址,並同時發送到多個設備。
IP多播首先要知道的是只有UDP有多播,沒有TCP多播這樣的東西,為什么呢?多播的重點是高效的把同一個包盡可能多的發送到不同的,甚至可能是未知的設備。但是TCP連接可能要求丟包重發或者延時或重組順序,這些操作可能非常消耗資源,不適於許多使用多播的應用場景。(同時多播不知道發出的包是不是已經到達,這個也導致不能使用TCP)。
2、TCP協議
基於TCP Socket編程,假設TCP最多一次只能發送1K byte的數據,服務器端程序首先要將300K數據按照順序砍成300塊 (Segment),按照從頭到尾編號,1-300,然后調用send()函數300次,嚴格按照時間順序,第一次調用發編號1,第二次調用發編號2,…第三百次調用發編號300,這個不復雜,只要編寫一個循環程序(300次)即可,只要每次調用的返回值都OK,應用程序的任務就算完成了。
以上的編號1-300就是TCP segment編號,那字節流的編號呢,就是 1,300000,其中 1-1000 字節被編在1號TCP segment,1001-2000字節編在2號segment,以此類推。
TCP不關心本地send()給自己的內容是啥(反正都是字節), 只關心時序,先發給自己的肯定先編號,后發的后編號,TCP本身只保證 傳輸的順序,至於在服務器端 本地、客戶端 本地的順序則由 Receive()/ Send()時序來保證!問題的關鍵在於TCP是有緩沖區,作為對比,UDP面向報文段是沒有緩沖區的。
TCP發送報文時,是將應用層數據寫入TCP緩沖區中,然后由TCP協議來控制發送這里面的數據,而發送的狀態是按字節流的方式發送的,跟應用層寫下來的報文長度沒有任何關系,所以說是流。
作為對比的UDP,它沒有緩沖區,應用層寫的報文數據會直接加包頭交給網絡層,由網絡層負責分片,所以是面向報文段的。
3、tcpdump
sudo tcpdump -i enp0s25 udp port 2000