// // Copyright (c) 2018 Michael Tuexen // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. // --ip_version=ipv4 --mtu=576 0.00 `sysctl -w net.inet.tcp.hostcache.purgenow=1` +0.00 `sysctl -w net.inet.tcp.syncookies_only=0` +0.00 `sysctl -w net.inet.tcp.syncookies=1` +0.00 `sysctl -w net.inet.tcp.rfc1323=1` +0.00 `sysctl -w net.inet.tcp.sack.enable=1` +0.00 `sysctl -w net.inet.tcp.ecn.enable=2` // Ensure we have a limit of 83 segments and only a single CPU +0.00 `sysctl -n net.inet.tcp.reass.maxsegments | grep ^83$` +0.00 `sysctl -n hw.ncpu | grep ^1$` // Create a listening TCP socket +0.00 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 +0.00 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 +0.00 bind(3, ..., ...) = 0 +0.00 listen(3, 2) = 0 // Establish the connection +0.10 < S 0:0(0) win 65535 +0.00 > S. 0:0(0) ack 1 win 65535 +0.10 < . 1:1(0) ack 1 win 65535 +0.00 accept(3, ..., ...) = 4 +0.00 close(3) = 0 // Inject packets +0.00 < . 100:101(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^1$` +0.10 < . 110:111(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^2$` +0.10 < . 120:121(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^3$` +0.10 < . 130:131(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^4$` +0.10 < . 140:141(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^5$` +0.10 < . 150:151(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^6$` +0.10 < . 160:161(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^7$` +0.10 < . 170:171(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^8$` +0.10 < . 180:181(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^9$` +0.10 < . 190:191(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^10$` +0.10 < . 200:201(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^11$` +0.10 < . 210:211(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^12$` +0.10 < . 220:221(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^13$` +0.10 < . 230:231(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^14$` +0.10 < . 240:241(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^15$` +0.10 < . 250:251(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^16$` +0.10 < . 260:261(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^17$` +0.10 < . 270:271(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^18$` +0.10 < . 280:281(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^19$` +0.10 < . 290:291(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^20$` +0.10 < . 300:301(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^21$` +0.10 < . 310:311(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^22$` +0.10 < . 320:321(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^23$` +0.10 < . 330:331(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^24$` +0.10 < . 340:341(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^25$` +0.10 < . 350:351(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^26$` +0.10 < . 360:361(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^27$` +0.10 < . 370:371(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^28$` +0.10 < . 380:381(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^29$` +0.10 < . 390:391(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^30$` +0.10 < . 400:401(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^31$` +0.10 < . 410:411(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^32$` +0.10 < . 420:421(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^33$` +0.10 < . 430:431(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^34$` +0.10 < . 440:441(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^35$` +0.10 < . 450:451(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^36$` +0.10 < . 460:461(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^37$` +0.10 < . 470:471(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^38$` +0.10 < . 480:481(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^39$` +0.10 < . 490:491(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^40$` +0.10 < . 500:501(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^41$` +0.10 < . 510:511(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^42$` +0.10 < . 520:521(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^43$` +0.10 < . 530:531(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^44$` +0.10 < . 540:541(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^45$` +0.10 < . 550:551(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^46$` +0.10 < . 560:561(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^47$` +0.10 < . 570:571(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^48$` +0.10 < . 580:581(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^49$` +0.10 < . 590:591(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^50$` +0.10 < . 600:601(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^51$` +0.10 < . 610:611(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^52$` +0.10 < . 620:621(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^53$` +0.10 < . 630:631(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^54$` +0.10 < . 640:641(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^55$` +0.10 < . 650:651(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^56$` +0.10 < . 660:661(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^57$` +0.10 < . 670:671(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^58$` +0.10 < . 680:681(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^59$` +0.10 < . 690:691(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^60$` +0.10 < . 700:701(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^61$` +0.10 < . 710:711(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^62$` +0.10 < . 720:721(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^63$` +0.10 < . 730:731(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^64$` +0.10 < . 740:741(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^65$` +0.10 < . 750:751(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^66$` +0.10 < . 760:761(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^67$` +0.10 < . 770:771(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^68$` +0.10 < . 780:781(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^69$` +0.10 < . 790:791(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^70$` +0.10 < . 800:801(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^71$` +0.10 < . 810:811(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^72$` +0.10 < . 820:821(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^73$` +0.10 < . 830:831(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^74$` +0.10 < . 840:841(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^75$` +0.10 < . 850:851(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^76$` +0.10 < . 860:861(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^77$` +0.10 < . 870:871(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^78$` +0.10 < . 880:881(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^79$` +0.10 < . 890:891(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^80$` +0.10 < . 900:901(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^81$` +0.10 < . 910:911(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^82$` +0.10 < . 920:921(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^83$` +0.10 < . 930:931(1) ack 1 win 65535 +0.00 > . 1:1(0) ack 1 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^83$` +0.10 < . 1:51(50) ack 1 win 65535 +0.00 > . 1:1(0) ack 51 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^83$` +0.10 recv(4, ..., 1000, MSG_PEEK) = 50 +0.10 < . 51:100(49) ack 1 win 65535 +0.00 > . 1:1(0) ack 101 win 65535 +0.00 `sysctl -n net.inet.tcp.reass.cursegments | grep ^82$` +0.10 recv(4, ..., 1000, MSG_PEEK) = 100 // Tear it down. +0.10 setsockopt(4, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0 +0.00 close(4) = 0 +0.00 > R. 1:1(0) ack 101