測試的一些基本概念知識(TCP )

2022-04-11 13:40:49 字數 3164 閱讀 7167

ack : tcp協議規定,只有ack=1時有效,也規定連線建立後所有傳送的報文的ack必須為1。

syn(synchronization) : 在連線建立時用來同步序號。當syn=1而ack=0時,表明這是乙個連線請求報文。對方若同意建立連線,則應在響應報文中使syn=1和ack=1. 因此,  syn置1就表示這是乙個連線請求或連線接受報文。 

fin (finis)即完,終結的意思, 用來釋放乙個連線。當 fin = 1 時,表明此報文段的傳送方的資料已經傳送完畢,並要求釋放連線。

syn_recv表示正在等待處理的請求數;established表示正常資料傳輸狀態;time_wait表示處理完畢,等待超時結束的請求數。

狀態:描述

closed:無連線是活動的或正在進行

listen:伺服器在等待進入呼叫

syn_recv:乙個連線請求已經到達,等待確認

syn_sent:應用已經開始,開啟乙個連線

established:正常資料傳輸狀態

fin_wait1:應用說它已經完成

fin_wait2:另一邊已同意釋放

itmed_wait:等待所有分組死掉

closing:兩邊同時嘗試關閉

time_wait:另一邊已初始化乙個釋放

last_ack:等待所有分組死掉

tcp協議是作用是用來進行端對端資料傳送的,那麼就會有傳送端和接收端,上篇部落格講了socket預設是阻塞式的,在作業系統有兩個空間即user space和kernal space。

每個tcp socket連線在核心中都有乙個傳送緩衝區和接收緩衝區,tcp的全雙工的工作模式以及tcp的流量(擁塞)控制便是依賴於這兩個獨立的buffer以及buffer的填充狀態。

單工:只允許甲方向乙方傳送資訊,而乙方不能向甲方傳送 ,如汽車單行道。

半雙工:半雙工就是指乙個時間段內只有乙個動作發生,甲方可以向乙方傳送資料,乙方也可以向甲方傳送資料,但不能同時進行,如一條窄馬路同一時間只能允許乙個車通行。

全雙工:同時允許資料在兩個方向上同時傳輸,它在能力上相當於兩個單工通訊方式的結合。

乙個socket的兩端,都會有send和recv兩個方法,如client傳送資料到server,那麼就是客戶端程序呼叫send傳送資料,而send的作用是將資料拷貝進入socket的核心傳送緩衝區之中,然後send便會在上層返回。

也就是說send()方法返回之時,資料不一定會傳送到對端即伺服器上去(和write寫檔案有點類似),send()僅僅是把應用層buffer的資料拷貝進socket的核心傳送buffer中,傳送是tcp的事情,和send其實沒有太大關係。

接收緩衝區把資料快取入核心,等待recv()讀取,recv()所做的工作,就是把核心緩衝區中的資料拷貝到應用層使用者的buffer裡面,並返回。若應用程序一直沒有呼叫recv()進行讀取的話,此資料會一直快取在相應socket的接收緩衝區內。對於tcp,如果應用程序一直沒有讀取,接收緩衝區滿了之後,發生的動作是:收端通知發端,接收視窗關閉(win=0)。這個便是滑動視窗的實現。保證tcp套介面接收緩衝區不會溢位,從而保證了tcp是可靠傳輸。因為對方不允許發出超過所通告視窗大小的資料。 這就是tcp的流量控制,如果對方無視視窗大小而發出了超過視窗大小的資料,則接收方tcp將丟棄它。

檢視socket傳送緩衝區大小,cat /proc/sys/net/ipv4/tcp_wmem

系統埠限制

linux系統埠為short型別表示,數值上限為65535。假設分配壓測業務可用埠範圍為1024 - 65535,不考慮可能還執行著其它對外連線的服務,真正可用埠也就是64000左右(實際上,一般為了方便計算,一般直接設定為50000)。換言之,即在一台機器上乙個ip,可用同時對外建立64000網路連線。

若是n個可用ip,理論上64000*n,實際上還需要滿足:

tcp接收/傳送緩衝區不要設定太大,tsung預設分配32k(可以修改成16k,一般夠用了)

乙個粗略估算假設乙個使用者占用記憶體50k,1w使用者占用500m記憶體,假設需要100w使用者

100w/6w = 17個ip位址;500m * 100w/1024 = 50g記憶體;伺服器單一ip 承載100萬使用者:1臺主機+17臺從機;若單機64g記憶體+17個ip可用ip位址就一台就能搞定。

linux系統開啟檔案控制代碼限制

系統開啟檔案控制代碼,直接決定了可以同時開啟的網路連線數量,這個需要設定大一些,否則,你可能會在[email protected]

檔案中看到error_connect_emfile類似檔案控制代碼不夠使用的警告,建議此值要大 n * 64000。

修改linux系統引數。vi /etc/security/limits.conf 新增

修改以後儲存,登出當前使用者,重新登入,執行ulimit -a ,ok ,引數生效了:

注:nofile是代表最大檔案開啟數

nproc是作業系統級別對每個使用者建立的程序數的限制

記憶體的影響:

乙個網路socket連線占用不多,但上萬個或數十萬等就不容小覷了,設定不當會導致記憶體直接成為屏障。

tcp接收、傳送快取

tsung預設設定的網路socket傳送接收緩衝區為16kb,一般夠用了。

[root@bogon ~]# cat /proc/sys/net/ipv4/tcp_rmem

此值會覆蓋linux系統設定接收、傳送緩衝大小。

粗略的預設值計算,乙個網路連線傳送緩衝區+ 接收緩衝區,再加上程序處理連線堆疊占用,約40多k記憶體,為即計算方便,設定建立乙個網路連線消費50k記憶體。

先不考慮其它因素,若我們想要從機模擬10w個使用者,那麼當前可用記憶體至少要剩餘:50k * 100000 / 1000k = 5000m = 5g記憶體。針對一般伺服器來講,完全可滿足要求(剩下事情就是要有兩個可用ip了)。

命令:ss  -tan|awk 'nr>1end』

通過上述命令可以統計出tcp連線中處於各個狀態的連線數,在經過ng**之後需要真實的連線數需要除以2,因為client——nginx——mqtt其實算是兩個tcp連線。

單元測試的一些基本概念

我們 程式設計師 多多少少都寫過單元測試,有的可能幾年前寫的幾行 比如我 姑且也算寫過吧,但是有些東西還是不是很清楚,比如什麼是單元測試?怎麼才算是好的單元測試?等等很多,查了些資料,總結一下。1 什麼是單元測試 單元測試是一段 通常是乙個方法 呼叫另外一段 隨後檢驗一些假設的正確性。如果假設的結果...

C 一些基本概念

建構函式的作用是對物件本身做初始化工作,也就是給使用者提供初始化類中成員變數的一種方式。析構函式是釋放物件執行期間所申請的資源。函式的過載,過載構成的條件 函式的引數型別不同 引數個數不同,才能構成函式的過載 在乙個類中 注意,只有函式的返回型別不同是不能構成函式的過載。在函式過載時,要注意函式帶有...

linux OS一些基本概念

1.什麼是os?好簡單好x的問題,可是如果真的要自己用稍微官方稍微正規的語言或文本來回答,我真的能回答清楚嗎?好吧,我先來用自己的語言來回答。再去找點官方的定義。我自己的回答 os就是乙個可以管理並且相對合理分配計算機資源的軟體。官方回答 作業系統 英語 operating system,簡稱os ...