網路上有若干客戶端向一台機器的某個埠一直不停發送UDP包 這台機器打開埠和不打開埠的區別在哪?
12-28
標題字有限制,在這裡詳細描述一下:
比如伺服器建立socket打開埠1000,有若干客戶端一直發送UDP包來.
伺服器接收到就扔掉,(io方式用epoll或者iocp).
伺服器乾脆不監聽這個埠,區別在哪?
OS對於沒有開始監聽的埠,是怎麼處理的?
伺服器如果不監聽某個udp埠,那麼,網卡還是會收到相關的數據包, 還是會產生中斷,還是會從網卡拷貝數據到系統態,只是系統態讀數據分析出無處轉發,然後當做錯誤包丟棄了。
如果伺服器監聽了某個udp埠,那麼這個數據包將會被轉發到監聽socket handle的接收緩衝區中,如果緩衝區未滿push back 新數據包,然後epoll通知用戶態代碼需要讀緩衝區,用戶態代碼獲得cpu控制權,從讀緩衝區read, 從系統態拷貝到用戶態,整個開銷要大上許多。
Udp網路編程主要的難點是不容易發揮多cpu的優勢,一般是單線程收發,然後把收到的數據通過隊列方式傳遞給多個線程處理,然後再從多個線程隊列返回處理結果,單線程寫入。
另外一個難點是需要考慮丟包,即使是本機一個線程發,一個線程收,也有丟包,因此需要定時重發和超時處理。
第三個難點是發端一般用頭2個位元組標識發包id,例如dns包,那麼就需要一個id管理代碼,最大支持65536個正在等待中的查詢,如果上級dns server的處理緩慢,那麼就有可能耗盡可用id,當年一起全國網路事故涉及到了暴風影音客戶端每x秒查詢一次dns,加上一次dos攻擊處理過程中的連鎖反應,導致全國多省dns id資源耗盡,難以提供服務查詢,網路大面積訪問困難。暴風影音和某dns pod均被有關部門約談,dos攻擊者被抓捕。當然現在dns server這塊代碼已有一些解決方案,至少不會再有上次一樣的問題了。總之,這部分代碼的處理要多考慮一些特例。
ICMP不可達——目標埠不可達
然後丟棄就好了啊
物理層,數據鏈路層,網路層,傳輸層。到不了傳輸層哦。
如Mac地址正確擇網卡接受數據後拋棄數據。如Mac地址不正確hub網路設備網卡未工作在雜散模式下擇網卡不接受數據。如網卡工作在雜散模式下其接受所有能收到的數據報文。
推薦閱讀:
※《TCP/IP詳解 卷1:協議》哪些章節需要重點閱讀?
※OpenWrt 路由器如何讓 lan 口主機獲得 ipv6 網路訪問?
※怎麼理解TCP的面向連接和UDP的無連接(不面向連接)?
※tcp 握手後向公網發送包,與mss大小不符合,丟失問題?