socket程式設計的那些事兒

2021-08-17 23:38:45 字數 2880 閱讀 5136

1、python的socket程式設計中socket.so_reuseaddr的含義:socket中so_reuseaddr詳解

2、socket程式設計的time_wait和close_wait狀態:

(1)定義:tcp四次揮手時,主動發起斷開連線的一方最後會進入time_wait狀態,而被動斷開連線的一方最後會進入close_wait狀態:

(2)為什麼需要time_wait狀態?

a.防止上一次連線中的包,迷路後重新出現,影響新連線(經過2msl,上一次連線中所有的重複包都會消失)

b.可靠的關閉tcp連線。在主動關閉方傳送的最後乙個 ack(fin) ,有可能丟失,這時被動方會重新發fin, 如果這時主動方處於 closed 狀態 ,就會響應 rst 而不是 ack。所以主動方要處於 time_wait 狀態,而不能是 closed 。另外這麼設計time_wait 會定時的**資源,並不會占用很大資源的,除非短時間內接受大量請求或者受到攻擊。

(3)如何解決time_wait過多問題?

讓伺服器能夠快速**和重用那些time_wait的資源,如修改/etc/sysctl.conf檔案的配置內容,修改完之後執行/sbin/sysctl -p讓引數生效:

#對於乙個新建連線,核心要傳送多少個 syn 連線請求才決定放棄,不應該大於255,預設值是5,對應於180秒左右時間   

net.ipv4.tcp_syn_retries=2

#net.ipv4.tcp_synack_retries=2

#表示當keepalive起用的時候,tcp傳送keepalive訊息的頻度。預設是2小時,改為300秒

net.ipv4.tcp_keepalive_time=1200

net.ipv4.tcp_orphan_retries=3

#表示如果套接字由本端要求關閉,這個引數決定了它保持在fin-wait-2狀態的時間

net.ipv4.tcp_fin_timeout=30

#表示syn佇列的長度,預設為1024,加大佇列長度為8192,可以容納更多等待連線的網路連線數。

net.ipv4.tcp_max_syn_backlog = 4096

#表示開啟syn cookies。當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊,預設為0,表示關閉

net.ipv4.tcp_syncookies = 1

#表示開啟重用。允許將time-wait sockets重新用於新的tcp連線,預設為0,表示關閉

net.ipv4.tcp_tw_reuse = 1

#表示開啟tcp連線中time-wait sockets的快速**,預設為0,表示關閉

net.ipv4.tcp_tw_recycle = 1

##減少超時前的探測次數

net.ipv4.tcp_keepalive_probes=5

##優化網路裝置接收佇列

net.core.netdev_max_backlog=3000

(4) 為什麼出現過多close_wait狀態?

被動斷開連線的一方(圖中的b)沒有關閉自身的連線,也即沒有傳送fin給主動斷開一方(圖中的a),導致埠不能釋放。

3、python的socket模組:

s.send(),當對端使用(rst或者fin)關閉了socket時,會丟擲socket.error,即[errno 10053];而當對端的tcp 接收視窗滿了,則會丟擲socket.timeout。 

4、當解決nat打洞問題時,需要掌握:nat的四種型別,另一篇參考

一般來講, nat可以分為四種型別,分別是:

(1) 全錐型(full cone)

(2)受限錐型(restricted cone), 或者說是ip受限錐型

(3)埠受限錐型(port restricted cone), 或者說是ip + port受限錐型

(4)對稱型(symmetric)

其中1,2,3屬於同一種型別,都是錐型,區別只是路由器的不同的安全策略。

還有些nat不屬於這四種中的任何一種,就不在討論範圍了。

client(192.168.0.3, 100)和server(1.1.1.1, 1111)在路由器上建立好對映關係後,如果這個時候路由器(8.8.8.8)在800埠上收到從另外一台server(2.2.2.2, 2222)發來的資料,是不是應該**給(192.168.0.3, 100)呢?

有四種情況:

(1)無條件**給(192.168.0.3, 100), 這就是全錐型(full cone)nat。

(2)如果(192.168.0.3, 100)之前給(2.2.2.2)傳送過資料,則**, 這就是受限錐型(restricted cone)。

(3) 如果(192.168.0.3, 100)之前給(2.2.2.2, 2222)傳送過資料,則**, 這就是埠受限錐型(port restricted cone)。

(4)丟棄報文,拒絕**, 這就是對稱型nat。

從上面也描述也可以看出,安全性係數, 對稱型 > 埠受限錐型 > 受限錐型 > 全錐型

5、select.select(rlist, wlist, xlist[, timeout])引數相關:

「the first three arguments are sequences of 『waitable objects』: either integers representing file descriptors or objects with a parameterless

method named fileno() returning such an integer」

說說Socket的那些事兒 上

兩個計算機通訊的過程,就像兩個人打 一樣 socket 套接字 socket又稱 套接字 應用程式通常通過 套接字 向網路發出請求或者應答網路請求。為網路服務提供一種機制 網路通訊其實就是socket之間的通訊 資料在兩個socket之間通過io傳輸 socket是純c語言的,是跨平台的 http基...

程式語言那些事兒

開發工具 入門 c 初級開發師 基本資料型別 引用資料型別 常量 變數 表示式 運算子 順序 分支 迴圈 i oc 中級開發師 命名空間 程式設計思想 量化你的思維 流程圖 偽 功能劃分 模組劃分 db設計 sys設計 函式思想 重用 i o 重構 物件導向的思想 物件陣列 物件指標 友元函式和友元...

Java程式設計那些事兒 如何學好程式設計

俗話說 興趣是最好的老師 但是只靠興趣是遠遠不夠的,還需要付出艱辛的努力。程式設計是一種技能,需要在較短的時間內學會,就不能像學習漢語一樣,通過十幾年甚至更長的時間來學好,也不能像英語那樣進行業餘學習,以至很多大學畢業的人英語水平也不敢恭維,也達不到實用的程度。那麼如何學好程式設計呢?或者更現實一點...