main.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #!/usr/bin/tclsh
  2. global pageIdx
  3. global server
  4. global nSvr
  5. global client
  6. global nClnt
  7. global sessionIdx
  8. global PageThreshold
  9. global SessionThreshold
  10. global outp
  11. source util.tcl
  12. if { $argc != 2} {
  13.    puts "usage: main.tcl <tcpdump file> <log file>"
  14.    exit
  15. } else {
  16.   set arg [split $argv " " ]
  17.   set tfile [lindex $arg 0]
  18.   set logfile [lindex $arg 1]
  19. }
  20. set logf [open $logfile w ]
  21. set srcf [open server.log w ]
  22. set defaultInterval 100
  23. set PageThreshold 1
  24. set SessionThreshold 600
  25. set timezero 0.0
  26. set isrc ""
  27. set idst ""
  28. set t 0
  29. set nSvr 0
  30. set nClnt 0
  31. set d [exec date +%X ]
  32. puts $logf "Initialization $d"
  33. catch { exec /bin/rm -rf CLIENT*} res
  34. catch { exec /bin/rm -rf *dat*} res
  35. catch { exec /bin/rm -rf *.tmp} res
  36. catch { exec tcpdump -S -n -r  $tfile src port 80 and tcp | awk -f util1.awk  | sort +0 > www1.dmp} res
  37. catch { exec tcpdump -S -n -r  $tfile dst port 80 and tcp | awk -f util1.awk  > www-requestI.dmp} res
  38. set outp [open "config.log" w ]
  39. set d [exec date +%X ]
  40. puts $logf "Parsing tcpdump file $tfile $d"
  41. set oldClient ""
  42. set fi [open "www1.dmp" r ]
  43. while {[gets $fi line] >= 0} {
  44.   set startTime  [tcpdtimetosecs [lindex $line 1]]
  45.   set src [lindex $line 3]
  46.   set dst [lindex $line 0]
  47.   set port [lindex $line 2]
  48.   set flag [lindex $line 4]
  49.   set seqno [lindex $line 5]
  50.   if { $seqno =="ack"} {
  51.    set ack  [lindex $line 6]
  52.    set win  [lindex $line 7]
  53.    set seqno ""
  54.   } else {
  55.    set ack  [lindex $line 7]
  56.    set win  [lindex $line 9]
  57.   }
  58.    #calculate the number of client
  59.    set c $dst 
  60.    set p 0
  61.    for {set i 0} {$i< $nClnt} {incr i} {
  62.       if { $c == $client($i)} {
  63.          set p 1
  64.       }
  65.    }
  66.    #a new client address
  67.    if { $p == 0 } {  
  68.      set client($nClnt) $c
  69.      set nClnt [expr $nClnt + 1]
  70.      set clientDir [format "CLIENT%04d" $nClnt]
  71.      set t 0
  72.      set sessionIdx($nClnt) 0
  73.    }
  74.    #calculate the number of server
  75.    set p 0
  76.    for {set i 0} {$i< $nSvr} {incr i} {
  77.       if { $src == $server($i)} {
  78.          set p 1
  79.       }
  80.    }
  81.    if { $p == 0 } {
  82.      set server($nSvr) $src
  83.      set server_cnt($nSvr) 0
  84.      set nSvr [expr $nSvr + 1]
  85.      puts $srcf $src
  86.    }
  87.   set diff [expr $startTime - $t]
  88.   if { $diff > $SessionThreshold } {
  89.      if { $sessionIdx($nClnt) != 0 } {
  90.         puts $outp "INTERSESSION $diff"
  91.      }
  92.      set sessionIdx($nClnt) [expr $sessionIdx($nClnt) + 1]
  93.      set pageIdx($nClnt,$sessionIdx($nClnt)) 0
  94.   }
  95.   if { $diff > $PageThreshold } {
  96.      if { $diff < $SessionThreshold && $t != 0 } {
  97.          puts $outp "INTERPAGE $diff"
  98.      }
  99.      set pageIdx($nClnt,$sessionIdx($nClnt)) [expr $pageIdx($nClnt,$sessionIdx($nClnt)) + 1]
  100.      set sessDir [format "SESSION%04d" $sessionIdx($nClnt)]
  101.      set pageDir [format "PAGE%06d" $pageIdx($nClnt,$sessionIdx($nClnt))]
  102.      set pageName [format "page%06d" $pageIdx($nClnt,$sessionIdx($nClnt))]
  103.      catch {exec mkdir $clientDir} res
  104.      catch {exec mkdir $clientDir/$sessDir} res
  105.      catch {exec mkdir $clientDir/$sessDir/$pageDir} res
  106.      if [info exists fo] {
  107.         close $fo
  108.      }
  109.      set fo [open $clientDir/$sessDir/$pageDir/$pageName w ]
  110.   }
  111.   set dst_port [format "%s:%s" $dst $port]
  112.   if { $seqno ==""} {
  113.      puts $fo "$startTime $src $dst_port $flag ack $ack "
  114.   } else {
  115.      set s [split $seqno ":()"]
  116.   puts $fo "$startTime $src $dst_port $flag [lindex $s 0] [lindex $s 2] ack $ack "
  117.   }
  118.   set t $startTime
  119. }
  120. close $fo
  121. close $fi
  122. close $srcf
  123. puts $logf "number of client = $nClnt"
  124. puts $outp "NUMSERVER $nSvr"
  125. puts $outp "NUMCLIENT $nClnt"
  126. puts $outp "NUMSESSION $sessionIdx($nClnt)"
  127. set objf [open object.startTime w]
  128. set svrf [open server.popularity.cdf w]
  129.  
  130. for {set p 1} {$p<=$nClnt} {incr p} {
  131.  
  132. set d [exec date +%X ]
  133. puts $logf "parsing client $p $d"
  134. for {set m 1} {$m<=$sessionIdx($p)} {incr m} {
  135. puts $logf "parsing session $m $d"
  136.  puts $outp "NUMPAGE $pageIdx($p,$m)"
  137.  for {set j 1} {$j<=$pageIdx($p,$m)} {incr j} {
  138.    set numObjPerPage 0
  139.    set clientDir [format "CLIENT%04d" $p]
  140.    set sessDir [format "SESSION%04d" $m]
  141.    set pageDir [format "PAGE%06d" $j]
  142.    set pageName [format "page%06d" $j]
  143.    set pageFile [format "%s" $clientDir/$sessDir/$pageDir/$pageName ]
  144.    set pageFileSorted [format "%s" $clientDir/$sessDir/$pageDir/$pageName.sort ]
  145.    catch { exec cat $pageFile | awk -f util2.awk | sort > $pageFileSorted } res
  146.    if [info exists fpi] {
  147.      close $fpi
  148.    }
  149.    set fpi [open $pageFileSorted r] 
  150.    set isrc ""
  151.    set idst ""
  152.    set k 0
  153.    #number of TCP connection
  154.    while {[gets $fpi line] >= 0} {
  155.    set src [lindex $line 0]
  156.    set dst [lindex $line 1]
  157.    set startTime  [lindex $line 2]
  158.    set field3 [lindex $line 3]
  159.    set field4 [lindex $line 4]
  160.    set field5 [lindex $line 5]
  161.    set field6 [lindex $line 6]
  162.    set field7 [lindex $line 7]
  163.    set field8 [lindex $line 8]
  164.    if { $src != $isrc || $dst != $idst } {
  165.       if { $k != 0 } {
  166.          close $outf
  167.       }
  168.       set k [expr $k + 1]
  169.       set dumpFile [format "%04d.dmp" $k]
  170.       set outf [open $clientDir/$sessDir/$pageDir/$dumpFile w ]
  171.       set isrc $src
  172.       set idst $dst
  173.      }
  174.    puts $outf "$src $dst $startTime $field3 $field4 $field5 $field6 $field7 $field8"
  175.    }
  176.    puts $outp "NUMCONNECTION $k"
  177.    if [info exists outf] {
  178.       close $outf
  179.    }
  180.    #number of objects requested in each connection
  181.    for {set n 1} {$n<=$k} {incr n} {
  182.       set dumpFile [format "%04d.dmp" $n]
  183.       set inf [open $clientDir/$sessDir/$pageDir/$dumpFile r ]
  184.       set oldAck 0
  185.       set numObj 0
  186.       set objSize 0
  187.       while {[gets $inf line] >= 0} {
  188.          set src [lindex $line 0]
  189.          set startTime  [lindex $line 2]
  190.          set size [lindex $line 5]
  191.          set ackSeq [lindex $line 7]
  192.          if { $size > 0 && $size != "ack" } {
  193.            if { $ackSeq > $oldAck } {
  194.              if { $objSize > 0 } {
  195.                  puts $outp "OBJSIZE $objSize"
  196.                  set numObjPerPage [expr $numObjPerPage + 1]
  197.              }
  198.              puts $objf "$clientDir/$sessDir/$pageDir/$dumpFile $startTime"
  199.              set objSize $size
  200.              set numObj [expr $numObj + 1]
  201.              #counting the unique server
  202.              for {set t 0} {$t< $nSvr} {incr t} {
  203.                   if { $src == $server($t)} {
  204.                     set server_cnt($t) [expr $server_cnt($t) + 1]
  205.                   }
  206.              }
  207.            } else {
  208.              if { $ackSeq == $oldAck && $size > 0 } {
  209.                 set objSize [expr $objSize + $size]
  210.              }
  211.            }
  212.            set oldAck $ackSeq
  213.          }
  214.       }
  215.       close $inf
  216.       if { $objSize > 0 } {
  217.           set numObjPerPage [expr $numObjPerPage + 1]
  218.           puts $outp "OBJSIZE $objSize"
  219.       }
  220.       if { $numObj > 1 } {
  221.           puts $outp "PERSISTCONN"
  222.       }
  223.    }
  224.    if { $numObjPerPage > 0 } {
  225.      puts $outp "NUMOBJPERPAGE $numObjPerPage"
  226.    }
  227. }
  228. }
  229. }
  230. #output CDF of server popularity
  231. set totalRef 0
  232. for {set t 0} {$t< $nSvr} {incr t} {
  233.     set totalRef [expr $totalRef + $server_cnt($t)] 
  234. }
  235. set cumRef 0
  236. for {set t 0} {$t< $nSvr} {incr t} {
  237.     set cumRef [expr $cumRef + $server_cnt($t)]
  238.     puts $svrf "$t $cumRef [expr ($cumRef * 1.0) / ($totalRef * 1.0)]" 
  239. }
  240. close $objf 
  241. close $svrf 
  242. set d [exec date +%X ]
  243. puts $logf "Calculate request size $d "
  244. #
  245. #calculate request size for each connection
  246. #
  247. set timezero 0.0
  248. set fri [open "www-requestI.dmp" r ]
  249. set fro [open "www-requestO.dmp" w ]
  250. while {[gets $fri line] >= 0} {
  251. set startTime  [tcpdtimetosecs [lindex $line 1]]
  252. set src [lindex $line 3]
  253. set dst [lindex $line 0]
  254. set port [lindex $line 2]
  255. set flag [lindex $line 4]
  256. set seqno [lindex $line 5]
  257. if { $seqno =="ack"} {
  258.  set ack  [lindex $line 6]
  259.  set win  [lindex $line 8]
  260.  set seqno ""
  261. } else {
  262.  set ack  [lindex $line 7]
  263.  set win  [lindex $line 9]
  264. }
  265. set dst_port [format "%s:%s" $dst $port]
  266. if { $seqno !=""  } {
  267.    set s [split $seqno ":()"]
  268.    if { [lindex $s 2] > 0  } {
  269.       puts $fro "$src $dst_port $ack $startTime $flag [lindex $s 0] [lindex $s 2]"
  270.    }
  271. }
  272. }
  273. close $outp
  274. close $fro
  275. close $fri
  276. catch { exec sort www-requestO.dmp > www-request.sorted } res
  277. set fi [open www-request.sorted r]
  278. set fo [open request.size.dat w]
  279. set isrc ""
  280. set idst ""
  281. set iack 0
  282. set requestSize 0
  283. set maxREQUEST 0
  284. set cntREQUEST 0
  285. set minREQUEST 1000
  286. while {[gets $fi line] >= 0} {
  287.    set src [lindex $line 0]
  288.    set dst [lindex $line 1]
  289.    set size [lindex $line 6]
  290.    set ackNo [lindex $line 2]
  291.    if { $src != $isrc || $dst != $idst || $ackNo != $iack } {
  292.       if { $iack != 0 } {
  293.          puts $fo $requestSize
  294.          set cntREQUEST [expr $cntREQUEST + 1]
  295.          set maxREQUEST [max $maxREQUEST $requestSize]
  296.          set minREQUEST [expr floor([min $minREQUEST $requestSize])]
  297.       }
  298.       set requestSize $size
  299.    } else {
  300.       set requestSize [expr $requestSize + $size]
  301.    }
  302.    set isrc $src
  303.    set idst $dst
  304.    set iack $ackNo
  305. }
  306. puts $fo $requestSize
  307. set maxREQUEST [max $maxREQUEST $requestSize]
  308. set minREQUEST [expr floor([min $minREQUEST $requestSize])]
  309. set d [exec date +%X ]
  310. puts $logf "Calculate object inter-arrival time $d"
  311. catch { exec sort +1 object.startTime -o object.start } res
  312. #calculate object inter-arrival time
  313. close $fi
  314. close $fo
  315. set fi [open "object.start" r ]
  316. set fo [open "obj.inter.dat" w ]
  317. set maxOBJINTER 0
  318. set cntOBJINTER 0
  319. set minOBJINTER $PageThreshold
  320. set iTime 0
  321. while {[gets $fi line] >= 0} {
  322.    set time  [lindex $line 1]
  323.    set diff [expr $time - $iTime]
  324.    if { $iTime != 0 && $diff < $PageThreshold && $diff > 0 } {
  325.       puts $fo $diff
  326.       set cntOBJINTER [expr $cntOBJINTER + 1]
  327.       set maxOBJINTER [max $maxOBJINTER $diff]
  328.       set minOBJINTER [min $minOBJINTER $diff]
  329.    }
  330.    set iTime $time
  331. }
  332. close $fi
  333. close $fo
  334. set d [exec date +%X ]
  335. puts $logf "Calculate CDF files $d"
  336. set fi [open "config.log" r ]
  337. set fo1 [open "page.per.session.dat" w ]
  338. set fo2 [open "object.size.dat" w ]
  339. set fo3 [open "page.inter.dat" w ]
  340. set fo4 [open "session.inter.dat" w ]
  341. set fo5 [open "persist.cdf" w ]
  342. set fo6 [open "obj.per.page.dat" w ]
  343. set numPer 0
  344. set numConn 0
  345. set cntNUMPAGE 0
  346. set cntOBJSIZE 0
  347. set cntINTERPAGE 0
  348. set cntINTERSESSION 0 
  349. set cntNUMOBJPERPAGE 0
  350. set maxNUMPAGE 0
  351. set maxOBJSIZE 0
  352. set maxINTERPAGE 0
  353. set maxINTERSESSION 0 
  354. set maxNUMOBJPERPAGE 0 
  355. set minNUMPAGE 100
  356. set minNUMOBJPERPAGE 100
  357. set minOBJSIZE 1000
  358. set minINTERPAGE $PageThreshold
  359. set minINTERSESSION $SessionThreshold 
  360. while {[gets $fi line] >= 0} {
  361.    set keyword  [lindex $line 0]
  362.    set value  [lindex $line 1]
  363.    set svrRef  [lindex $line 2]
  364.    if { $keyword == "NUMPAGE" } {
  365.        puts $fo1 $value
  366.        set cntNUMPAGE [expr $cntNUMPAGE + 1]
  367.        set maxNUMPAGE [max $maxNUMPAGE $value]
  368.        set minNUMPAGE [expr floor([min $minNUMPAGE $value])]
  369.    }
  370.    if { $keyword == "PERSISTCONN" } {
  371.        set numPer [expr $numPer + 1]
  372.    }
  373.    if { $keyword == "NUMCONNECTION" } {
  374.        set numConn [expr $numConn + 1]
  375.    }
  376.    if { $keyword == "OBJSIZE" } {
  377.        puts $fo2 $value
  378.        set cntOBJSIZE [expr $cntOBJSIZE + 1]
  379.        set maxOBJSIZE [max $maxOBJSIZE $value]
  380.        set minOBJSIZE [expr floor([min $minOBJSIZE $value])]
  381.    }
  382.    if { $keyword == "INTERPAGE" } {
  383.        puts $fo3 $value
  384.        set cntINTERPAGE [expr $cntINTERPAGE + 1]
  385.        set maxINTERPAGE [max $maxINTERPAGE $value]
  386.    }
  387.    if { $keyword == "INTERSESSION" } {
  388.        puts $fo4 $value
  389.        set cntINTERSESSION [expr $cntINTERSESSION + 1]
  390.        set maxINTERSESSION [max $maxINTERSESSION $value]
  391.    }
  392.    if { $keyword == "NUMOBJPERPAGE" } {
  393.        puts $fo6 $value
  394.        set cntNUMOBJPERPAGE [expr $cntNUMOBJPERPAGE + 1]
  395.        set maxNUMOBJPERPAGE [max $maxNUMOBJPERPAGE $value]
  396.        set minNUMOBJPERPAGE [expr floor([min $minNUMOBJPERPAGE $value])]
  397.    }
  398. }
  399. set incrNUMPAGE [expr ([expr $maxNUMPAGE - $minNUMPAGE] * 1.0) / ($defaultInterval * 1.0)]
  400. set incrOBJSIZE [expr ([expr $maxOBJSIZE - $minOBJSIZE] * 1.0) / ($defaultInterval * 1.0)]
  401. set incrINTERPAGE [expr ([expr $maxINTERPAGE - $minINTERPAGE] * 1.0) / ($defaultInterval * 1.0)]
  402. set incrINTERSESSION [expr ([expr $maxINTERSESSION - $minINTERSESSION] * 1.0) / ($defaultInterval * 1.0)]
  403. set incrREQUEST [expr ([expr $maxREQUEST - $minREQUEST] * 1.0) / ($defaultInterval * 1.0)]
  404. set incrOBJINTER [expr ([expr $maxOBJINTER - $minOBJINTER] * 1.0) / ($defaultInterval * 1.0)]
  405. set incrNUMOBJPERPAGE [expr ([expr $maxNUMOBJPERPAGE - $minNUMOBJPERPAGE] * 1.0) / ($defaultInterval * 1.0)]
  406. set persistRatio [expr ( $numPer * 1.0) / ($numConn * 1.0) ]
  407. puts $fo5 "0 [expr $numConn - $numPer] [expr 1.0 - $persistRatio]"
  408. puts $fo5 "1 $numConn 1.0"
  409. close $fi
  410. close $fo1
  411. close $fo2
  412. close $fo3
  413. close $fo4
  414. close $fo5
  415. close $fo6
  416. catch { exec sort -g page.per.session.dat -o page.per.session.dat.sorted } res
  417. catch { exec sort -g object.size.dat -o object.size.dat.sorted } res
  418. catch { exec sort -g page.inter.dat -o page.inter.dat.sorted } res
  419. catch { exec sort -g session.inter.dat -o session.inter.dat.sorted  } res
  420. catch { exec sort -g request.size.dat -o request.size.dat.sorted  } res
  421. catch { exec sort -g obj.inter.dat -o obj.inter.dat.sorted  } res
  422. catch { exec sort -g obj.per.page.dat -o obj.per.page.dat.sorted  } res
  423. outputPDF $minNUMPAGE $incrNUMPAGE "page.per.session.dat" 
  424. outputPDF $minOBJSIZE $incrOBJSIZE "object.size.dat" 
  425. outputPDF $minINTERPAGE $incrINTERPAGE "page.inter.dat" 
  426. outputPDF $minREQUEST $incrREQUEST "request.size.dat" 
  427. outputPDF $minOBJINTER $incrOBJINTER "obj.inter.dat" 
  428. outputPDF $minNUMOBJPERPAGE $incrNUMOBJPERPAGE "obj.per.page.dat" 
  429. if { $cntINTERSESSION > 0 } {
  430.    outputPDF $minINTERSESSION $incrINTERSESSION "session.inter.dat" 
  431.    outputCDF "session.inter.dat"
  432. } else {
  433.   puts "Warning: only one user session?"
  434. }
  435. outputCDF "page.per.session.dat"
  436. outputCDF "object.size.dat"
  437. outputCDF "page.inter.dat"
  438. outputCDF "request.size.dat"
  439. outputCDF "obj.inter.dat"
  440. outputCDF "obj.per.page.dat"