TCP與UDP區別趣圖 小技巧:快速判斷udp,tcp埠是否同通暢

2021-03-06 肉眼品世界

一:TCP 和 UDP 之間的區別

↓↓↓

好了,我知道有些童鞋想到我們發過的舊圖了 

往期趣圖(點擊下方圖片可跳轉閱讀)

感覺是不是很爽,圖上UDP看起來那麼暴力,但是使用起來感覺還好,內網比較少丟包

二、主要丟包原因

 

1、接收端處理時間過長導致丟包:調用recv方法接收端收到數據後,處理數據花了一些時間,處理完後再次調用recv方法,在這二次調用間隔裡,發過來的包可能丟失。對於這種情況可以修改接收端,將包接收後存入一個緩衝區,然後迅速返回繼續recv。

 

2、發送的包巨大丟包:雖然send方法會幫你做大包切割成小包發送的事情,但包太大也不行。例如超過50K的一個udp包,不切割直接通過send方法發送也會導致這個包丟失。這種情況需要切割成小包再逐個send。

 

3、發送的包較大,超過接受者緩存導致丟包:包超過mtu size數倍,幾個大的udp包可能會超過接收者的緩衝,導致丟包。這種情況可以設置socket接收緩衝。以前遇到過這種問題,我把接收緩衝設置成64K就解決了。

int nRecvBuf=32*1024;//設置為32K

setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

 

4、發送的包頻率太快:雖然每個包的大小都小於mtu size 但是頻率太快,例如40多個mut size的包連續發送中間不sleep,也有可能導致丟包。這種情況也有時可以通過設置socket接收緩衝解決,但有時解決不了。所以在發送頻率過快的時候還是考慮sleep一下吧。

 

5、區域網內不丟包,公網上丟包。這個問題我也是通過切割小包並sleep發送解決的。如果流量太大,這個辦法也不靈了。總之udp丟包總是會有的,如果出現了用我的方法解決不了,還有這個幾個方法:要麼減小流量,要麼換tcp協議傳輸,要麼做丟包重傳的工作。

 

 

二、具體問題分析

 

1.發送頻率過高導致丟包

 

很多人會不理解發送速度過快為什麼會產生丟包,原因就是UDP的SendTo不會造成線程阻塞,也就是說,UDP的SentTo不會像TCP中的SendTo那樣,直到數據完全發送才會return回調用函數,它不保證當執行下一條語句時數據是否被發送。(SendTo方法是異步的)這樣,如果要發送的數據過多或者過大,那麼在緩衝區滿的那個瞬間要發送的報文就很有可能被丟失。至於對「過快」的解釋,作者這樣說:「A few packets a second are not an issue; hundreds or thousands may be an issue.」(一秒鐘幾個數據包不算什麼,但是一秒鐘成百上千的數據包就不好辦了)。要解決接收方丟包的問題很簡單,首先要保證程序執行後馬上開始監聽(如果數據包不確定什麼時候發過來的話),其次,要在收到一個數據包後最短的時間內重新回到監聽狀態,其間要儘量避免複雜的操作(比較好的解決辦法是使用多線程回調機制)。

 

2.報文過大丟包

 

至於報文過大的問題,可以通過控制報文大小來解決,使得每個報文的長度小於MTU。乙太網的MTU通常是1500 bytes,其他一些諸如撥號連接的網絡MTU值為1280 bytes,如果使用speaking這樣很難得到MTU的網絡,那麼最好將報文長度控制在1280 bytes以下。

 

3.發送方丟包

 

發送方丟包:內部緩衝區(internal buffers)已滿,並且發送速度過快(即發送兩個報文之間的間隔過短); 接收方丟包:Socket未開始監聽; 雖然UDP的報文長度最大可以達到64 kb,但是當報文過大時,穩定性會大大減弱。這是因為當報文過大時會被分割,使得每個分割塊(翻譯可能有誤差,原文是fragmentation)的長度小於MTU,然後分別發送,並在接收方重新組合(reassemble),但是如果其中一個報文丟失,那麼其他已收到的報文都無法返回給程序,也就無法得到完整的數據了。

 三、測試TCP,UDP 埠是否通常的小技巧

是不是經常遇見這樣的場景:xx運維:你看看你是不是把伺服器8008埠阿里雲埠沒開,我程序明明跑起來的,在伺服器上能看到埠

運維同學:NND,沒事就說我的問題

上伺服器一看,雲安全策略也是打開,firewall也是埠打開的,咋就不通了呢,這事說不清,甩鍋也甩不清,別慌,把他原來的8008埠進行停止

然後:

python2 -m SimpleHTTPServer 8008telnet xx.xx.xx.xx 8008

發現立馬通了,那就直接告訴他代碼的問題吧(一般是一些rpc埠限制了ip)

再來說說UDP,在區塊鏈中,節點與節點之間的通信常常是p2p,會發送UDP命令,但是有的時候發現節點跑不起來,看日誌UDP命令沒發送,那怎麼測試UDP埠是不是通的呢,百度一下,它一般告訴你:

你本地機器一試,果然是通的,確實好用,但是你遠程測試的時候,咋發現提示成功,節點之間還是不發送udp呢?看來光用這還不行,那想一種辦法來監控伺服器是否收到該埠的UDP包了,於是tcpdump上場了

相關焦點

  • 筆記 | 面試官問我:TCP與UDP的區別
    面試官:你說你熟悉網絡基礎,也有網絡編程的經驗,那在選擇tcp或udp時是出於什麼目的,即 TCP 和 UDP 有什麼區別?(來自網絡的趣圖)UDP:用戶數據報協議(User Datagram Protocol)。在網絡中它與TCP協議一樣用於處理數據包,是一種無連接的協議。
  • python筆記28(TCP,UDP,socket協議)
    4、代碼部分:①介紹socket;②使用socket完成tcp協議的web通信;③使用socket完成udp協議的web通信。1、TCP協議1、可靠,慢,全雙工通信2、建立連接的時候,三次握手3、斷開連接的時候,四次揮手4、在建立起連接後發送的每條信息都有回執為了保證數據的完整性,還有重傳機制5、長連接:會一直佔用雙方的埠6、I/O操作(input,output),輸入輸出相對內存來說的。
  • TCP和UDP區別
    ;//源目標埠__be16 source;//源目標埠2__be16 dest;//目的埠__be16 dest;//目標埠2__be32 seq;//順序號4保證順序性?對比一下,容易得出,TCP 有20個字節,比UDP 的8個字節多,多出來的這些字節,有些配合連接(3次握手,4次揮手,11種狀態),所以有一個區別,就是TCP是面向連接,UDP無連接。一、有無連接的區別TCP  11種狀態也是經常被問到。具體的圖就不畫出來了,網上有一堆資料。
  • 《圖解TCP/IP(第5版)》
    /ip基礎知識2.1  tcp/ip出現的背景及其歷史2.1.1  從軍用技術的應用談起2.1.2  arpanet的誕生2.1.3  tcp/ip的誕生2.1.4  unix系統的普及與網際網路的擴張2.1.5  商用網際網路服務的啟蒙2.2  tcp/ip的標準化2.2.1  tcp/ip的具體含義2.2.2  tcp/ip標準化精髓
  • Tcp的reset報文介紹
    RST報文的tcp頭裡RST標誌置位。發送RST報文的場景包括以下幾種1、 請求的tcp埠不存在2、 協議棧任何異常Tcp請求的埠不存在對於udp,如果報文請求一個不存在的埠,將產生一個icmp報文通知埠不可達『對於tcp報文,當請求一個不存在的埠,將會rst復位這個連結』連結出現異常後正常連結關閉,是通過fin方法
  • 關於NFS埠的配置
    不知道大家現在是否還有疑惑。今天我們主要講解一下NFS埠的設置的問題。在很多網絡環境中,不同的埠設置導致的功能會有所差異。在設置了防火牆的環境中使用NFS,需要在防火牆上打開如下埠:1. portmap 埠 111 udp/tcp;  2. nfsd 埠 2049 udp/tcp;  3. mountd 埠 "xxx" udp/tcp
  • Proxy-Go v3.3 發布,socks 新增 UDP 支持並增強代理穩定性
    Proxy是golang實現的高性能http,https,websocket,tcp,udp,socks5代理伺服器,支持正向代理、內網穿透、SSH中轉。更新內容:修復了socks代理模式對證書文件的判斷邏輯.增強了http代理,socks代理的ssh中轉模式的穩定性.
  • 網絡埠一覽表 四
    )協議代理伺服器常用埠:23HTTP伺服器:默認的埠號為80/tcp,注意:木馬Executor開放此埠。HTTPS伺服器:默認的埠號為443/tcp 443/udp。Telnet:默認埠號為23/tcp,注意:木馬Tiny Telnet Server所開放的埠。 FTP:默認的埠號為21/tcp,注意:木馬Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所開放的埠。
  • TCP性能和發送接收Buffer的關係
    = 1net.ipv4.tcp_moderate_rcvbuf = 1net.ipv4.tcp_rmem = 4096 87380 6291456net.ipv4.tcp_wmem = 4096 16384 4194304net.ipv4.udp_rmem_min = 4096net.ipv4.udp_wmem_min = 4096
  • 為什麼 TCP 會被 UDP 取代
    tcp-congestion-control圖 1 - TCP 的擁塞控制機制每一個 TCP 連接都會維護一個擁塞控制窗口(Congestion Window),擁塞控制窗口的作用有兩個:防止發送方向接收方發送了太多數據,導致接收方無法處理;防止
  • 為什麼 TCP 會被 UDP 取代?
    tcp-congestion-control圖 1 - TCP 的擁塞控制機制每一個 TCP 連接都會維護一個擁塞控制窗口(Congestion Window),擁塞控制窗口的作用有兩個:防止發送方向接收方發送了太多數據,導致接收方無法處理;防止
  • 20個Linux防火牆應用技巧
    本文帶領大家探討了Linux系統管理員應該掌握的20個防火牆應用技巧。/24 -p udp -m udp --dport 631 -j ACCEPT  # iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT  # 打開123埠,允許區域網用戶進行
  • 埠掃描技術,Namp工具的使用介紹
    找出網絡上的主機,測試哪些埠在監聽,這些工作通常是由掃描來實現的.掃描網絡是黑客進行入侵的第一步.通過使用掃描器(如Nmap)掃描網絡,尋找存在漏洞的目標主機.一旦發現了有漏洞的目標,接下來就是對監聽埠的掃描.Nmap通過使用TCP協議棧指紋準確地判斷出被掃主機的作業系統類型.
  • 解Bug之路-NAT引發的性能瓶頸|埠|tcp|nginx|ip|ack_網易訂閱
    那麼為什麼會這個SYN時間戳比之前揮手的時間戳還小呢?那當然是NAT的鍋嘍,NAT把多臺機器的ip虛擬成同一個ip。但是多臺機器的時間戳(也即從啟動開始到現在的時間,非牆上時間),如下圖所示:  那麼什麼時候重用TIME_WAIT狀態的Socket呢筆者知道,防火牆的埠號選擇邏輯是RoundRobin的,也即從2048開始一直增長到65535,再迴繞到2048,如下圖所示:
  • Proxy-Go SDK v8.4 發布,新增內網穿透 P2P、TCP 指定出口 IP!
    增加了tools工具功能,目前有:nat類型判斷,方便查看網絡是否支持p2p,比如:proxy tools -a nattype tcp轉發,內網穿透,udp轉發,tls傳輸模式增加了--ca參數設置用於驗證證書的籤發機構證書。
  • 面試官問我為什麼 TCP 會被 UDP 取代?我懵了
    tcp-congestion-control圖 1 - TCP 的擁塞控制機制每一個 TCP 連接都會維護一個擁塞控制窗口(Congestion Window),擁塞控制窗口的作用有兩個:防止發送方向接收方發送了太多數據,導致接收方無法處理;防止