最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Packetdrill的簡(jiǎn)明使用手冊(cè)

 更新時(shí)間:2018年11月20日 10:44:37   作者:五山小新新  
今天小編就為大家分享一篇關(guān)于Packetdrill的簡(jiǎn)明使用手冊(cè),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

1. Packetdrill 編譯與安裝

  1. 源碼鏈接 https://github.com/google/packetdrill.git
  2. 源碼編譯 注釋netdev.c
/* Set the offload flags to be like a typical ethernet device */
static void set_device_offload_flags(struct local_netdev *netdev)
{
#ifdef linux
// const u32 offload =
//   TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | TUN_F_TSO_ECN | TUN_F_UFO;
// if (ioctl(netdev->tun_fd, TUNSETOFFLOAD, offload) != 0)
//   die_perror("TUNSETOFFLOAD");
#endif
}

./configure && make

使用方法

./packetdrill test.pkt

test.pkt為按Packetdrill語(yǔ)法編寫(xiě)的測(cè)試腳本。

成功:無(wú)輸出,表示腳本正確,一切都符合預(yù)期。

失?。褐赋瞿_本的錯(cuò)誤地方,以及原因。

2. Packetdrill 執(zhí)行自帶測(cè)試用例

  1. 開(kāi)啟tcpdump -i any tcp port 8080抓包便于分析
  2. 這里測(cè)試快速重傳,測(cè)試環(huán)境centos7.2。
  3. 簡(jiǎn)單說(shuō)明< 表示輸入,packetdrill會(huì)構(gòu)造一個(gè)真實(shí)的數(shù)據(jù)包。>表示預(yù)期協(xié)議棧會(huì)響應(yīng)的數(shù)據(jù)包。(這個(gè)包不是由packetdrill構(gòu)造的,而是由協(xié)議棧發(fā)出的。)
// Test fast retransmit with 4 packets outstanding, receiver sending SACKs.
// In this variant the receiver supports SACK.
// Establish a connection.
0  socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
//三次握手
+0 < S 0:0(0) win 32792 <mss 1000,sackOK,nop,nop,nop,wscale 7>
+0 > S. 0:0(0) ack 1 <...>
+.1 < . 1:1(0) ack 1 win 257
+0 accept(3, ..., ...) = 4
//系統(tǒng)調(diào)用,讓協(xié)議棧發(fā)出100個(gè)字節(jié)
// Send 1 data segment and get an ACK, so cwnd is now 4.
+0 write(4, ..., 1000) = 1000
//預(yù)期協(xié)議棧會(huì)發(fā)出psh,ack,實(shí)際上發(fā)出了ack1
//+0 > P. 1:1001(1000) ack 2
//向協(xié)議棧注入 ack
+.1 < . 1:1(0) ack 1001 win 257
// Write 4 data segments.
//系統(tǒng)調(diào)用,讓協(xié)議棧發(fā)出4000個(gè)字節(jié)
+0 write(4, ..., 4000) = 4000
//預(yù)期協(xié)議棧會(huì)發(fā)出psh,ack,實(shí)際上發(fā)出了seq 1001:2001, ack 1;seq 2001:3001, ack 1;seq 3001:4001, ack 1;[P.], seq 4001:5001, ack 1
//+0 > P. 1001:5001(4000) ack 1
// Get 3 SACKs.
//向協(xié)議棧連續(xù)發(fā)出三個(gè)ack
+.1 < . 1:1(0) ack 1001 win 257 <sack 2001:3001,nop,nop>
+0 < . 1:1(0) ack 1001 win 257 <sack 2001:4001,nop,nop>
+0 < . 1:1(0) ack 1001 win 257 <sack 2001:5001,nop,nop>
// We've received 3 duplicate ACKs, so we do a fast retransmit.
//預(yù)期協(xié)議棧會(huì)發(fā)出一次快速重傳 Seq 1001:2001,ack 1
//+0 > . 1001:2001(1000) ack 1
// Receiver ACKs all data.
//向協(xié)議棧ack,響應(yīng)所有報(bào)文的ack。
+.1 < . 1:1(0) ack 6001 win 257
4. 將fr-4pkt-sack-linux.pkt 中的修改如下。
+0 > P. 1:1001(1000) ack 2    +0 > P. 1:1001(1000) ack 1
//+0 > P. 1001:5001(4000) ack 1  
+0 > . 1001:2001(1000) ack 1
+0 > . 2001:3001(1000) ack 1
+0 > . 3001:4001(1000) ack 1
+0 > P. 4001:5001(1000) ack 1

[注解:如果執(zhí)行packetdrill自帶的用例出錯(cuò),一般是協(xié)議棧發(fā)出的包沒(méi)有達(dá)到預(yù)期的包,先將預(yù)期>那部分干掉,然后再執(zhí)行測(cè)試用例,然后通過(guò)抓包分析預(yù)期結(jié)果。通常是因?yàn)槿挝帐謒ss 的限制]

  1. 執(zhí)行: ../../../packetdrill fr-4pkt-sack-linux.pkt,無(wú)出錯(cuò)。
  2. 抓包可以看到一下結(jié)果:三次重復(fù)ack,則實(shí)施快速重傳。達(dá)到預(yù)期效果。
// 自己構(gòu)造包實(shí)現(xiàn)三次重復(fù)的ack 1001.
07:57:36.469280 IP 192.0.2.1.36840 > TENCENT64.site.webcache: Flags [.], ack 1001, win 257, options [sack 1 {2001:3001},nop,nop], length 0
07:57:36.469836 IP 192.0.2.1.36840 > TENCENT64.site.webcache: Flags [.], ack 1001, win 257, options [sack 1 {2001:4001},nop,nop], length 0
07:57:36.470349 IP 192.0.2.1.36840 > TENCENT64.site.webcache: Flags [.], ack 1001, win 257, options [sack 1 {2001:5001},nop,nop], length 0
// 協(xié)議棧發(fā)起快速重傳。Seq 1001:2001,ack 1,1000
07:57:36.470376 IP TENCENT64.site.webcache > 192.0.2.1.36840: Flags [.], seq 1001:2001, ack 1, win 229, length 1000

3. Packetdrill 解讀自帶測(cè)試用例說(shuō)明

這里主要說(shuō)明packetdrill的基本語(yǔ)法。

腳本中可以包含四種語(yǔ)句:數(shù)據(jù)包、系統(tǒng)調(diào)用、shell命令、python語(yǔ)句。
每條語(yǔ)句都必須以時(shí)間戳開(kāi)頭,指明它的執(zhí)行時(shí)間。

  • Packets

數(shù)據(jù)包分為:輸入的數(shù)據(jù)包、輸出的數(shù)據(jù)包,格式類(lèi)似于tcpdump的,
支持TCP、UDP、ICMP,以及TCP的大部分選項(xiàng)。

輸入數(shù)據(jù)包(<表示輸入):packetdrill會(huì)構(gòu)造一個(gè)真實(shí)的數(shù)據(jù)包,然后注入?yún)f(xié)議棧。

例子:

0.100 < S 0:0(0) win 32792 <mss 1000, nop, nop, sackOK, nop, wscale 7>
0.250 < [1:1461(1460)] icmp unreachable frag_needed mtu 1200

輸出數(shù)據(jù)包(>表示輸出):packetdrill會(huì)檢查協(xié)議棧是不是真的發(fā)出了這樣一個(gè)包。

+0 > udp (1472)
  • System Calls

系統(tǒng)調(diào)用的格式類(lèi)似于strace。
對(duì)于每個(gè)系統(tǒng)調(diào)用,packetdrill會(huì)在指定的時(shí)間給予執(zhí)行,并檢查返回值是否和預(yù)期的一樣。系統(tǒng)調(diào)用的主要是應(yīng)用于場(chǎng)景構(gòu)造,已經(jīng)非測(cè)試端的數(shù)據(jù)發(fā)送和接收。

常見(jiàn)的系統(tǒng)調(diào)用例子:
系統(tǒng)調(diào)用

connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)  //客戶端連接服務(wù)器
getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0  //獲取scoketopt
fcntl(3, F_SETFL, O_RDWR) = 0  //Fcntl設(shè)置
ioctl(4, SIOCINQ, [1000]) = 0  //Ioctl設(shè)置
read(3, ..., 1024) = 785  //讀取數(shù)據(jù)
write(3, ..., 57) = 57 //寫(xiě)入數(shù)據(jù)
close(3) = 0  //關(guān)閉連接
socket(..., SOCK_STREAM, IPPROTO_TCP) = 3  //Tcp socket
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 //設(shè)置地址復(fù)用
bind(3, ..., ...) = 0  //綁定端口
listen(3, 1) = 0  //監(jiān)聽(tīng)端口
accept(3, ..., ...) = 4 //接受連接
  • shell腳本用法

常見(jiàn)用法是用shell腳本設(shè)置內(nèi)核參數(shù)或者調(diào)用shell命令統(tǒng)計(jì)tcp信息。設(shè)置

例子:

+0 `sysctl -q net.ipv4.tcp_timestamps=0`
+0 `ss -4 -n state SYN-RECV | grep 192.168.0.1:8080 > /dev/null`
  • python腳本的用法

常見(jiàn)用法是使用python的assert斷言tcp_info的里面的信息,是否符合預(yù)期。

例子:

0.310 %{
assert tcpi_reordering == 3
assert tcpi_unacked == 10
assert tcpi_sacked == 6
assert tcpi_ca_state == TCP_CA_Recovery
}%
  • 時(shí)間戳

每條語(yǔ)句都必須以時(shí)間戳開(kāi)頭,指明它的執(zhí)行時(shí)間,或者預(yù)期事件的發(fā)生時(shí)間。測(cè)試case有可能是timing的問(wèn)題導(dǎo)致測(cè)試case無(wú)法通過(guò)。

時(shí)間戳可以使用多種格式:

Absolute(絕對(duì)時(shí)間):0.75
Relative(相對(duì)時(shí)間):+0.2
Wildcard(任意時(shí)間):*
Range(絕對(duì)時(shí)間區(qū)間):0.750~0.900
Relative Range(相對(duì)時(shí)間區(qū)間):+0.1~+0.2
Loose(允許誤差值):--tolerance_usecs=800
Blocking(阻塞時(shí)間區(qū)間):0.750...0.900

如果在規(guī)定的時(shí)間戳,對(duì)應(yīng)的事件并沒(méi)有發(fā)生就會(huì)報(bào)錯(cuò),并告知該事件的實(shí)際發(fā)生時(shí)間。

+1.0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 6>

預(yù)期在1s以后TCP應(yīng)該發(fā)送一個(gè)SYNACK包。

在實(shí)際的使用中,一般指定–tolerance_usecs=405000,也就是允許4ms的時(shí)間誤差。

4. Packetdrill 實(shí)現(xiàn)基本場(chǎng)景構(gòu)造測(cè)試

場(chǎng)景的場(chǎng)景構(gòu)造是客戶端場(chǎng)景或者是服務(wù)器場(chǎng)景。具體包怎么構(gòu)造,具體看packetdrill的自帶的測(cè)試用例。

1.服務(wù)端場(chǎng)景

構(gòu)造服務(wù)器端場(chǎng)景:數(shù)據(jù)包輸入端是客戶端。數(shù)據(jù)包輸出端是系統(tǒng)調(diào)用,充當(dāng)服務(wù)端。

// Establish a connection.
0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
0.000 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
0.000 bind(3, ..., ...) = 0
0.000 listen(3, 1) = 0
0.000...0.200 accept(3, ..., ...) = 4
0.100 < S 0:0(0) win 32792 <mss 1000,nop,wscale 7>
0.100 > S. 0:0(0) ack 1 <mss 1460,nop,wscale 6>
0.200 < . 1:1(0) ack 1 win 257
//服務(wù)器端調(diào)用系統(tǒng)調(diào)用,預(yù)期發(fā)出2段數(shù)據(jù)包。
0.300 write(4, ..., 2000) = 2000
//0.300 > P. 1:2001(2000) ack 1
0.300 > . 1:1001(1000) ack 1
0.300 > P. 1001:2001(1000) ack 1

1.客戶端場(chǎng)景構(gòu)造

構(gòu)造服務(wù)器端場(chǎng)景:數(shù)據(jù)包輸入端是服務(wù)端。數(shù)據(jù)包輸出端是系統(tǒng)調(diào)用,充當(dāng)客戶端。

// Create a socket and set it to non-blocking.
0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
0.000 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
0.000 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
// Establish connection and verify that there was no error.
0.100 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
0.100 > S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 6>
0.200 < S. 0:0(0) ack 1 win 5792 <mss 1460,sackOK,TS val 700 ecr 100,nop,wscale 7>
0.200 > . 1:1(0) ack 1 <nop,nop,TS val 200 ecr 700>
//客戶端調(diào)用系統(tǒng)調(diào)用,預(yù)期發(fā)出http請(qǐng)求。
// Send the HTTP request.
0.200 write(3, ..., 57) = 57
0.200 > P. 1:58(57) ack 1 <nop,nop,TS val 200 ecr 700>
0.300 < . 1:1(0) ack 58 win 92 <nop,nop,TS val 800 ecr 200>

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • centos中文件與權(quán)限的基本操作教程

    centos中文件與權(quán)限的基本操作教程

    這篇文章主要給大家介紹了關(guān)于centos文件與權(quán)限的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 詳解linux下查看系統(tǒng)版本號(hào)信息的方法(總結(jié))

    詳解linux下查看系統(tǒng)版本號(hào)信息的方法(總結(jié))

    本篇文章主要介紹了詳解CentOS下查看系統(tǒng)版本號(hào)信息的方法(總結(jié)),具有一定的參考價(jià)值,有興趣的可以來(lái)了解一下
    2017-07-07
  • Linux gzip命令壓縮文件實(shí)現(xiàn)原理及代碼實(shí)例

    Linux gzip命令壓縮文件實(shí)現(xiàn)原理及代碼實(shí)例

    這篇文章主要介紹了Linux gzip命令壓縮文件實(shí)現(xiàn)原理及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 在Centos部署nodejs的步驟

    在Centos部署nodejs的步驟

    本篇文章主要介紹了在Centos部署nodejs的步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 詳解Linux下調(diào)試器GDB的基本使用方法

    詳解Linux下調(diào)試器GDB的基本使用方法

    GDB是GNU開(kāi)源組織發(fā)布的一個(gè)強(qiáng)大的UNIX下的程序調(diào)試工具。不管是調(diào)試Linux內(nèi)核空間的驅(qū)動(dòng)還是調(diào)試用戶空間的應(yīng)用程序,掌握gdb的用法都是必須。而且,調(diào)試內(nèi)核和調(diào)試應(yīng)用程序時(shí)使用的gdb命令是完全相同的
    2021-06-06
  • centos7 無(wú)線網(wǎng)卡驅(qū)動(dòng)的安裝及無(wú)線網(wǎng)絡(luò)的配置詳解

    centos7 無(wú)線網(wǎng)卡驅(qū)動(dòng)的安裝及無(wú)線網(wǎng)絡(luò)的配置詳解

    本篇文章主要介紹了centos7 無(wú)線網(wǎng)卡驅(qū)動(dòng)的安裝及無(wú)線網(wǎng)絡(luò)的配置詳解,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-03-03
  • Apache負(fù)載均衡設(shè)置方法 mod_proxy使用介紹

    Apache負(fù)載均衡設(shè)置方法 mod_proxy使用介紹

    本文主要講解了Apache負(fù)載均衡功能的代碼配置,首先我們通過(guò)幾個(gè)模塊的功能進(jìn)行配置,之后就會(huì)發(fā)現(xiàn)其中的奧秘了,那么我們還是來(lái)具體看文章吧
    2012-10-10
  • 常用Linux發(fā)行版鏡像源配置小結(jié)

    常用Linux發(fā)行版鏡像源配置小結(jié)

    這篇文章主要介紹了常用Linux發(fā)行版鏡像源配置小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 高性能HTTP加速器Varnish-3.0.3搭建、配置及優(yōu)化步驟

    高性能HTTP加速器Varnish-3.0.3搭建、配置及優(yōu)化步驟

    這篇文章主要介紹了高性能HTTP加速器Varnish-3.0.3搭建、配置及優(yōu)化步驟,需要的朋友可以參考下
    2016-02-02
  • linux 下隱藏進(jìn)程的一種方法及遇到的坑

    linux 下隱藏進(jìn)程的一種方法及遇到的坑

    這篇文章主要介紹了linux 下隱藏進(jìn)程的一種方法,主要實(shí)現(xiàn)思路就是利用 LD_PRELOAD 來(lái)實(shí)現(xiàn)系統(tǒng)函數(shù)的劫持,具體實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2018-09-09

最新評(píng)論

锦屏县| 大港区| 出国| 钟山县| 大竹县| 辽中县| 松溪县| 固始县| 兰坪| 遵化市| 梁河县| 邹平县| 濮阳市| 桦川县| 剑川县| 田林县| 五华县| 永泰县| 海口市| 交口县| 凤庆县| 扶余县| 肥东县| 阿克| 苍南县| 南溪县| 二连浩特市| 育儿| 囊谦县| 芜湖市| 普陀区| 陇西县| 凤凰县| 太湖县| 辽宁省| 德化县| 南部县| 延庆县| 彰武县| 铜陵市| 益阳市|