1. 程式人生 > >windump 的一次實踐

windump 的一次實踐

windump -d

可以列出當前的裝置列表。

我在windows7 下有時候會出現只能列出一個的問題,這時候需要把不可見的裝置Disable後再次Enable

然後再次 windump -d 就可以看到了。

windump -i   x      x是第幾個裝置,注意是 1Base , 不是0Base

windump host 10.9.16.88 and(10.9.16.254)  可以監聽 10.9.16.88 和 10.9.16.254 之間的對話

其他連結:

重讀TCP



TCP 的資料流

       TCP的資料流大致可以分為兩類,互動資料流與成塊的資料流。互動資料流就是傳送控制命令的資料流,比如relogin

telnetftp命令等等;成塊資料流是用來發送資料的包,網路上大部分的TCP包都是這種包。

很明顯,TCP在傳輸這兩種型別的包時的效率是不一樣的,因此為了提高TCP的傳輸效率,應該對這兩種型別的包採用不同的演算法。

總之,TCP的傳輸原則是儘量減少小分組傳輸的數量。

TCP的互動式資料流

Ø經受時延的確認技術

TCP的互動式資料流通常使用“經過時延的確認”技術。通常Server在接收到從Client傳送過來的資料時,並不馬上傳送ACK,而是等一小段時間,看看本機是否有資料要反饋給Client,如果有,就將資料包含在此ACK包中,以前傳送給Client。一般情況下這個時延為200ms。需要注意的時這個200ms

的定時器時相對於核心的時鐘滴答的,也就是jeffs的。加入一個數據分組到達後,此定時器已經pass100ms,那麼再過100ms ACK才會被髮送,如果在這100ms內有資料要反饋,則在100msACK會和資料一起傳送。

ØNagle演算法分析。

Nagle演算法主要用來預防小分組的產生。在廣域網上,大量TCP小分組極有可能造成網路的擁塞。

       Nagle時針對每一個TCP連線的。它要求一個TCP連線上最多隻能有一個未被確認的小分組。在改分組的確認到達之前不能傳送其他小分組。TCP會蒐集這些小的分組,然後在之前小分組的確認到達後將剛才蒐集的小分組合併發送出去。

有時候我們必須要關閉Nagle演算法,特別是在一些對時延要求較高的互動式操作環境中,所有的小分組必須儘快傳送出去。

我們可以通過程式設計取消Nagle演算法,利用TCP_NODELAY選項來關閉Nagle演算法。

TCP成塊資料流

TCP成塊資料流相關的東西有很多,比如流量控制,緊急資料傳輸,資料視窗大小調整等等。

Ø正常資料流

TCP通常不會對每個到達的資料分段進行確認操作,通常一個ACK報文可以確認多個成塊資料段報文,通常情況下是兩個成塊資料報文段需要一個ACK報文確認。通常是由下面的原有造成的:當收到一個報文後,此TCP連線被標識未一個未完成的時延確認,當再次收到一個數據報文後,此連線有兩個未確認的報文段,TCP馬上傳送一個ACK,當第三個資料報文到達後,第四個報文到達前,通常此TCP連線已經經過了200ms延時,因此一個ACK被髮送,這樣的迴圈周而復始,從而出現了一個ACK確認兩個資料報文的情況。當然,ACK的產生很大程度上和其接收資料報文段的時間緊密相關,也就是和Client段傳送資料的頻率相關,和網路擁塞程度相關,和ClientServer兩端的處理能力相關,總是是一個多因素決定的結果。

ØTCP的滑動視窗協議

TCP使用滑動視窗協議來進行流量控制。特別需要注意的是,滑動視窗是一個抽象的概念,它是針對每一個TCP連線的,而且是有方向的,一個TCP連線應該有兩個滑動視窗,每個資料傳輸方向上有一個,而不是針對連線的每一端的。

視窗左邊沿向右邊滑動叫做視窗合攏,表示傳送方傳送了資料或者接收到了確認;視窗右邊沿向右邊滑動叫做視窗的張開,表示資料已經被使用者空間程序接收並且釋放了快取;視窗左邊沿向左移動則表明此ACK是重複ACK,應該丟棄;視窗右邊沿向左移動叫做視窗收縮,一般不會有人這樣做。

當左邊沿和右邊沿重合的時候表明視窗大小是0,此時傳送方不應該在傳送資料了,因為接收方的接收緩衝區已滿,使用者程序還沒以接收。當用戶程序接收完成後,接收方應該傳送一個ACK,表明此時的接收視窗已經恢復,此ACK的序號同前一個win0ACK相同。

同樣,在實現中,傳送方不必傳送一個全視窗的資料,但是它當然可以這樣做。ACK總是將視窗向右邊滑動,視窗的大小可以減小,接收方在傳送ACK之前不必等待視窗被填滿(即變為0),很多實現是收到兩個資料報文段後立刻傳送ACK

ØTCP視窗大小的調整

TCP視窗的大小通常由接收端來確認,也就是在TCP建立連線的第二個SYN+ACK報文的Win欄位來確認。

當然,程式可以隨時改變這個視窗(快取)的大小。預設的視窗大小是4096位元組,但是對於檔案傳輸來說這並不是一個理想的數字,如果程式的主要目的是傳輸檔案,那麼最好將這個快取設定到最大,但是這樣可能會造成傳送端連續傳送多個數據報文段後,接收方才反饋一個ACK的情況,當然,這也沒有什麼不可以的,只要不超時,就不算錯。

ØTCPPUSH

PUSHTCP報頭中的一個標誌位,傳送方在傳送資料的時候可以設定這個標誌位。該標誌通知接收方將接收到的資料全部提交給接收程序。這裡所說的資料包括與此PUSH包一起傳輸的資料以及之前就為該程序傳輸過來的資料。

Server端收到這些資料後,它需要立刻將這些資料提交給應用層程序,而不再等待是否還有額外的資料到達。

那麼應該合適設定PUSH標誌呢?實際上現在的TCP協議棧基本上都可以自行處理這個問題,而不是交給應用層處理。如果待發送的資料會清空傳送快取,那麼棧就會自動為此包設定PUSH標誌,源於BSD的棧一般都會這麼做,而且,BSD TCP STACK也從來不會將收到的資料推遲提交給應用程式,因此,在BSD TCP STACK中,PUSH位是被忽略的,因為根本就沒有用。

ØTCP的慢啟動(擁塞視窗)

TCP在區域網環境中的效率是很高的,但是到了廣域網的環境中情況就不同了,在傳送方和接收方之間可能存在多個Router以及一些速率比較慢的鏈路,而且一些中繼路由器必須快取分組,還可能分片,所以在廣域網的環境中,TCP的效率可能出現問題。

為了解決這個問題,現在的TCP棧都支援“慢啟動”演算法,即擁塞視窗控制演算法。該演算法通過觀察到新分組進入網路的速率與另一端返回ACK的速率相同而工作。其實,擁塞視窗是傳送方使用的一種流量控制演算法。

慢啟動為TCP

相關推薦

windump實踐

windump -d可以列出當前的裝置列表。我在windows7 下有時候會出現只能列出一個的問題,這時候需要把不可見的裝置Disable後再次Enable然後再次 windump -d 就可以看到了。windump -i   x      x是第幾個裝置,注意是 1Base

CSS3混合模式的實踐

相關介紹連結: CSS3中的mix-blend-mode和background-blend-mode css mix-blend-mode 混合模式 <!doctype html> <html lang="en"> <head> <meta c

Css in Js 實踐

最近需要做一個表格元件,元件需求: 指定行、列 可以跨行、跨列 行和行之間有分割線 最終採用grid實現需求。實現的時候遇到一個問題,如果css和js分開寫,css只能是定值,沒有靈活性。所以考慮採用css in js的形式。關於css in js相關的概念介紹可以參考阮一峰老師的文章:

基於openapi3.0的yaml檔案生成java程式碼的實踐

在github上看了swagger-api專案(https://github.com/swagger-api/swagger-codegen)中的一些文件以及swagger-codegen的使用說明,還是覺得有些麻煩,該專案中有提到使用swagger-codeg

MVVM架構的實踐

         github地址:https://github.com/shenAlexy/MVVM,喜歡就star一個! 說明:本專案採用MVVM架構,重寫iOS頭條客戶端。轉載請註明出處! 前言: 本例基於AFN封裝了網路請求系列庫,以滿足自己需求,後期易於擴充套件;使用JSO

Nginx做代理的實踐

背景 所在專案Go服務之前部署在測試機器上,最近再把Go的配置遷移到etcd,但是因為etcd沒有對應的測試環境,而公司裡面網段是隔離的,導致了原本的Go服務再接入etcd之後跑不起來。 讓Go服務正常啟動, 其他依賴方,比如前端、閘道器少做修改

實踐:spark查詢hive速度緩慢原因分析並以此看到spark基礎架構

前一段時間資料探勘組的同學向我返回說自己的一段pyspark程式碼執行非常緩慢,而程式碼本身非常簡單,就是查詢hive 一個檢視中的資料,而且通過limit 10限制了資料量。 不說別的,先貼我的程式碼吧: from pyspark.sql import

運用卡內基消除憂慮的實踐

把所有憂慮的東西都列出來: 1.年底兩篇專利難寫,不想寫 2.驕陽計劃上線和使用有風險 3.年底接下來的KPI 4.新員工培訓成本高 5.自己未來的定位與方向 6.缺錢 7.牙齒一直沒去治 8.骨幹員工離職 然後給每個憂慮標記權重: 1.年底兩篇專利難寫,不想寫   

非同步併發利器:實際專案中使用CompletionService提升系統性能的實踐

場景 隨著網際網路應用的深入,很多傳統行業也都需要接入到網際網路。我們公司也是這樣,保險核心需要和很多保險中介對接,比如阿里、京東等等。這些公司對於介面服務的效能有些比較高的要求,傳統的核心無法滿足要求,所以資訊科技部領導高瞻遠矚,決定開發網際網路接入服務,滿足來自效能的需求。 概念 CompletionSe

在廣播(BroadcastReceiver)或服務(Service)裏彈窗的“完美”實踐

dac target 百度 define key 捕獲 只有一個 show 一個 事情是這樣的,目前在做一個醫療項目,需要定時在某個時間段比如午休時間和晚上讓我們的App休眠,那麽這個時候在休眠時間段如果用戶按了電源鍵點亮屏幕了,我們就需要彈出一個全屏的窗口去做一個人性化

在BroadcastReceiver或Service裏彈窗的“完美”實踐

.net 電源 屬性 amp nsa troy 界面 lag turn   事情是這樣的,目前在做一個醫療項目,需要定時在某個時間段比如午休時間和晚上讓我們的App休眠,那麽這個時候在休眠時間段如果用戶按了電源鍵點亮屏幕了,我們就需要彈出一個全屏的窗口去做一個人性化的提示

敏捷軟件開發:原則、模式與實踐 編程實踐 保齡球記分代碼

spa ack ext frame owin its else int 記分 //類Score package com.java.bowlingscore; public class Scorer { public void addThrow(int pins){ itsT

基於vue的spa多頁簽實踐經驗

ofo ace 加載 名稱 mman date 頁簽 一鍵安裝 route 前言 最近收到一個這樣的需求,要求做一個基於 vue 和 element-ui 的通用後臺框架頁,具體要求如下: 要求通用性高,需要在後期四十多個子項目中使用,所以大部分地方都做成可配置的.

[專案實踐] 在專案實戰中提升程式碼效率的的應用實踐-----使用列表解析式輸出當前android裝置的CPU核數

1、先按照初學者思維程式碼應該是這樣的 1 #coding:utf-8 2 import os 3 text = os.popen("adb shell command cat /proc/cpuinfo",'r').read().split("\n") 4 i = 0 5 for j i

VUE 專案優化實踐

愛康體檢寶 PC(www.tijianbao.com/) 算是一個“老”專案,為什麼說“老”呢,因為在前端技術日新月異,每天都有新知識、新概念,甚至新框架的今天,它還是基於vue-cli 2.x、webpack 3.x構建,顯然有些老了。其次,在早期開始這個專案的時候,由於倉促上線,也沒有過多的考慮效能及載入

軟工實踐 - 第十作業 Alpha 衝刺 (3/10)

隊名:起床一起肝活隊 組長部落格:https://www.cnblogs.com/dawnduck/p/9972061.html 作業部落格:班級部落格本次作業的連結 組員情況 組員1(隊長):白晨曦 過去兩天完成了哪些任務 描述: 很胖,剛學,照貓畫虎做了登入與註冊介面。 展示GitHub當日程式

軟工實踐 - 第十作業 Alpha 沖刺 (3/10)

and 後臺 單元 bubuko 團隊 工具 .html 功能實現 頁面 隊名:起床一起肝活隊 組長博客:https://www.cnblogs.com/dawnduck/p/9972061.html 作業博客:班級博客本次作業的鏈接 組員情況 組員1(隊長):白晨曦 過去

20181113_大學最後集中實踐

       實踐的時間很短,感覺還沒學夠就結束了,但是在這短暫的時間裡卻讓我發現了許多值得學習的東西。        首先,這次的實踐是由公司的老師指導的,工作經驗很豐富,主導的實踐內容是設計一個智慧監控系統,但因時間有限,所

ES節點擴容、資料遷移實踐

記一次ES節點擴容、資料遷移實踐 背景 之前ES叢集裡的資料越來越大,日增500G日誌資料,需要做一波擴容。 節點資訊 目前叢集中的節點資訊如下: 節點 CPU、MEM DISK 磁碟使用率 節點角色 es01

Minecraft遊戲伺服器搭建實踐經歷

Minecraft簡介 Minecraft是一款沙盒遊戲,整個遊戲沒有劇情,玩家在遊戲中自由建設和破壞,透過像積木一樣來對元素進行組合與拼湊,輕而易舉的就能製作出小木屋、城堡甚至城市,玩家可以通過自己創造的作品來體驗上帝一般的感覺。在這款遊戲裡,不僅可以單人娛樂,還可以多人聯機,玩家也可以安裝一些模組來增加