⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.tcl

📁 跑leach需要的
💻 TCL
字号:
#!/usr/bin/tclshglobal pageIdxglobal serverglobal nSvrglobal clientglobal nClntglobal sessionIdxglobal PageThresholdglobal SessionThresholdglobal outpsource util.tclif { $argc != 2} {   puts "usage: main.tcl <tcpdump file> <log file>"   exit} else {  set arg [split $argv " " ]  set tfile [lindex $arg 0]  set logfile [lindex $arg 1]}set logf [open $logfile w ]set srcf [open server.log w ]set defaultInterval 100set PageThreshold 1set SessionThreshold 600set timezero 0.0set isrc ""set idst ""set t 0set nSvr 0set nClnt 0set d [exec date +%X ]puts $logf "Initialization $d"catch { exec /bin/rm -rf CLIENT*} rescatch { exec /bin/rm -rf *dat*} rescatch { exec /bin/rm -rf *.tmp} rescatch { exec tcpdump -S -n -r  $tfile src port 80 and tcp | awk -f util1.awk  | sort +0 > www1.dmp} rescatch { exec tcpdump -S -n -r  $tfile dst port 80 and tcp | awk -f util1.awk  > www-requestI.dmp} resset outp [open "config.log" w ]set d [exec date +%X ]puts $logf "Parsing tcpdump file $tfile $d"set oldClient ""set fi [open "www1.dmp" r ]while {[gets $fi line] >= 0} {  set startTime  [tcpdtimetosecs [lindex $line 1]]  set src [lindex $line 3]  set dst [lindex $line 0]  set port [lindex $line 2]  set flag [lindex $line 4]  set seqno [lindex $line 5]  if { $seqno =="ack"} {   set ack  [lindex $line 6]   set win  [lindex $line 7]   set seqno ""  } else {   set ack  [lindex $line 7]   set win  [lindex $line 9]  }   #calculate the number of client   set c $dst    set p 0   for {set i 0} {$i< $nClnt} {incr i} {      if { $c == $client($i)} {         set p 1      }   }   #a new client address   if { $p == 0 } {       set client($nClnt) $c     set nClnt [expr $nClnt + 1]     set clientDir [format "CLIENT%04d" $nClnt]     set t 0     set sessionIdx($nClnt) 0   }   #calculate the number of server   set p 0   for {set i 0} {$i< $nSvr} {incr i} {      if { $src == $server($i)} {         set p 1      }   }   if { $p == 0 } {     set server($nSvr) $src     set server_cnt($nSvr) 0     set nSvr [expr $nSvr + 1]     puts $srcf $src   }  set diff [expr $startTime - $t]  if { $diff > $SessionThreshold } {     if { $sessionIdx($nClnt) != 0 } {        puts $outp "INTERSESSION $diff"     }     set sessionIdx($nClnt) [expr $sessionIdx($nClnt) + 1]     set pageIdx($nClnt,$sessionIdx($nClnt)) 0  }  if { $diff > $PageThreshold } {     if { $diff < $SessionThreshold && $t != 0 } {         puts $outp "INTERPAGE $diff"     }     set pageIdx($nClnt,$sessionIdx($nClnt)) [expr $pageIdx($nClnt,$sessionIdx($nClnt)) + 1]     set sessDir [format "SESSION%04d" $sessionIdx($nClnt)]     set pageDir [format "PAGE%06d" $pageIdx($nClnt,$sessionIdx($nClnt))]     set pageName [format "page%06d" $pageIdx($nClnt,$sessionIdx($nClnt))]     catch {exec mkdir $clientDir} res     catch {exec mkdir $clientDir/$sessDir} res     catch {exec mkdir $clientDir/$sessDir/$pageDir} res     if [info exists fo] {        close $fo     }     set fo [open $clientDir/$sessDir/$pageDir/$pageName w ]  }  set dst_port [format "%s:%s" $dst $port]  if { $seqno ==""} {     puts $fo "$startTime $src $dst_port $flag ack $ack "  } else {     set s [split $seqno ":()"]  puts $fo "$startTime $src $dst_port $flag [lindex $s 0] [lindex $s 2] ack $ack "  }  set t $startTime}close $foclose $ficlose $srcfputs $logf "number of client = $nClnt"puts $outp "NUMSERVER $nSvr"puts $outp "NUMCLIENT $nClnt"puts $outp "NUMSESSION $sessionIdx($nClnt)"set objf [open object.startTime w]set svrf [open server.popularity.cdf w] for {set p 1} {$p<=$nClnt} {incr p} { set d [exec date +%X ]puts $logf "parsing client $p $d"for {set m 1} {$m<=$sessionIdx($p)} {incr m} {puts $logf "parsing session $m $d" puts $outp "NUMPAGE $pageIdx($p,$m)" for {set j 1} {$j<=$pageIdx($p,$m)} {incr j} {   set numObjPerPage 0   set clientDir [format "CLIENT%04d" $p]   set sessDir [format "SESSION%04d" $m]   set pageDir [format "PAGE%06d" $j]   set pageName [format "page%06d" $j]   set pageFile [format "%s" $clientDir/$sessDir/$pageDir/$pageName ]   set pageFileSorted [format "%s" $clientDir/$sessDir/$pageDir/$pageName.sort ]   catch { exec cat $pageFile | awk -f util2.awk | sort > $pageFileSorted } res   if [info exists fpi] {     close $fpi   }   set fpi [open $pageFileSorted r]    set isrc ""   set idst ""   set k 0   #number of TCP connection   while {[gets $fpi line] >= 0} {   set src [lindex $line 0]   set dst [lindex $line 1]   set startTime  [lindex $line 2]   set field3 [lindex $line 3]   set field4 [lindex $line 4]   set field5 [lindex $line 5]   set field6 [lindex $line 6]   set field7 [lindex $line 7]   set field8 [lindex $line 8]   if { $src != $isrc || $dst != $idst } {      if { $k != 0 } {         close $outf      }      set k [expr $k + 1]      set dumpFile [format "%04d.dmp" $k]      set outf [open $clientDir/$sessDir/$pageDir/$dumpFile w ]      set isrc $src      set idst $dst     }   puts $outf "$src $dst $startTime $field3 $field4 $field5 $field6 $field7 $field8"   }   puts $outp "NUMCONNECTION $k"   if [info exists outf] {      close $outf   }   #number of objects requested in each connection   for {set n 1} {$n<=$k} {incr n} {      set dumpFile [format "%04d.dmp" $n]      set inf [open $clientDir/$sessDir/$pageDir/$dumpFile r ]      set oldAck 0      set numObj 0      set objSize 0      while {[gets $inf line] >= 0} {         set src [lindex $line 0]         set startTime  [lindex $line 2]         set size [lindex $line 5]         set ackSeq [lindex $line 7]         if { $size > 0 && $size != "ack" } {           if { $ackSeq > $oldAck } {             if { $objSize > 0 } {                 puts $outp "OBJSIZE $objSize"                 set numObjPerPage [expr $numObjPerPage + 1]             }             puts $objf "$clientDir/$sessDir/$pageDir/$dumpFile $startTime"             set objSize $size             set numObj [expr $numObj + 1]             #counting the unique server             for {set t 0} {$t< $nSvr} {incr t} {                  if { $src == $server($t)} {                    set server_cnt($t) [expr $server_cnt($t) + 1]                  }             }           } else {             if { $ackSeq == $oldAck && $size > 0 } {                set objSize [expr $objSize + $size]             }           }           set oldAck $ackSeq         }      }      close $inf      if { $objSize > 0 } {          set numObjPerPage [expr $numObjPerPage + 1]          puts $outp "OBJSIZE $objSize"      }      if { $numObj > 1 } {          puts $outp "PERSISTCONN"      }   }   if { $numObjPerPage > 0 } {     puts $outp "NUMOBJPERPAGE $numObjPerPage"   }}}}#output CDF of server popularityset totalRef 0for {set t 0} {$t< $nSvr} {incr t} {    set totalRef [expr $totalRef + $server_cnt($t)] }set cumRef 0for {set t 0} {$t< $nSvr} {incr t} {    set cumRef [expr $cumRef + $server_cnt($t)]    puts $svrf "$t $cumRef [expr ($cumRef * 1.0) / ($totalRef * 1.0)]" }close $objf close $svrf set d [exec date +%X ]puts $logf "Calculate request size $d "##calculate request size for each connection#set timezero 0.0set fri [open "www-requestI.dmp" r ]set fro [open "www-requestO.dmp" w ]while {[gets $fri line] >= 0} {set startTime  [tcpdtimetosecs [lindex $line 1]]set src [lindex $line 3]set dst [lindex $line 0]set port [lindex $line 2]set flag [lindex $line 4]set seqno [lindex $line 5]if { $seqno =="ack"} { set ack  [lindex $line 6] set win  [lindex $line 8] set seqno ""} else { set ack  [lindex $line 7] set win  [lindex $line 9]}set dst_port [format "%s:%s" $dst $port]if { $seqno !=""  } {   set s [split $seqno ":()"]   if { [lindex $s 2] > 0  } {      puts $fro "$src $dst_port $ack $startTime $flag [lindex $s 0] [lindex $s 2]"   }}}close $outpclose $froclose $fricatch { exec sort www-requestO.dmp > www-request.sorted } resset fi [open www-request.sorted r]set fo [open request.size.dat w]set isrc ""set idst ""set iack 0set requestSize 0set maxREQUEST 0set cntREQUEST 0set minREQUEST 1000while {[gets $fi line] >= 0} {   set src [lindex $line 0]   set dst [lindex $line 1]   set size [lindex $line 6]   set ackNo [lindex $line 2]   if { $src != $isrc || $dst != $idst || $ackNo != $iack } {      if { $iack != 0 } {         puts $fo $requestSize         set cntREQUEST [expr $cntREQUEST + 1]         set maxREQUEST [max $maxREQUEST $requestSize]         set minREQUEST [expr floor([min $minREQUEST $requestSize])]      }      set requestSize $size   } else {      set requestSize [expr $requestSize + $size]   }   set isrc $src   set idst $dst   set iack $ackNo}puts $fo $requestSizeset maxREQUEST [max $maxREQUEST $requestSize]set minREQUEST [expr floor([min $minREQUEST $requestSize])]set d [exec date +%X ]puts $logf "Calculate object inter-arrival time $d"catch { exec sort +1 object.startTime -o object.start } res#calculate object inter-arrival timeclose $ficlose $foset fi [open "object.start" r ]set fo [open "obj.inter.dat" w ]set maxOBJINTER 0set cntOBJINTER 0set minOBJINTER $PageThresholdset iTime 0while {[gets $fi line] >= 0} {   set time  [lindex $line 1]   set diff [expr $time - $iTime]   if { $iTime != 0 && $diff < $PageThreshold && $diff > 0 } {      puts $fo $diff      set cntOBJINTER [expr $cntOBJINTER + 1]      set maxOBJINTER [max $maxOBJINTER $diff]      set minOBJINTER [min $minOBJINTER $diff]   }   set iTime $time}close $ficlose $foset d [exec date +%X ]puts $logf "Calculate CDF files $d"set fi [open "config.log" r ]set fo1 [open "page.per.session.dat" w ]set fo2 [open "object.size.dat" w ]set fo3 [open "page.inter.dat" w ]set fo4 [open "session.inter.dat" w ]set fo5 [open "persist.cdf" w ]set fo6 [open "obj.per.page.dat" w ]set numPer 0set numConn 0set cntNUMPAGE 0set cntOBJSIZE 0set cntINTERPAGE 0set cntINTERSESSION 0 set cntNUMOBJPERPAGE 0set maxNUMPAGE 0set maxOBJSIZE 0set maxINTERPAGE 0set maxINTERSESSION 0 set maxNUMOBJPERPAGE 0 set minNUMPAGE 100set minNUMOBJPERPAGE 100set minOBJSIZE 1000set minINTERPAGE $PageThresholdset minINTERSESSION $SessionThreshold while {[gets $fi line] >= 0} {   set keyword  [lindex $line 0]   set value  [lindex $line 1]   set svrRef  [lindex $line 2]   if { $keyword == "NUMPAGE" } {       puts $fo1 $value       set cntNUMPAGE [expr $cntNUMPAGE + 1]       set maxNUMPAGE [max $maxNUMPAGE $value]       set minNUMPAGE [expr floor([min $minNUMPAGE $value])]   }   if { $keyword == "PERSISTCONN" } {       set numPer [expr $numPer + 1]   }   if { $keyword == "NUMCONNECTION" } {       set numConn [expr $numConn + 1]   }   if { $keyword == "OBJSIZE" } {       puts $fo2 $value       set cntOBJSIZE [expr $cntOBJSIZE + 1]       set maxOBJSIZE [max $maxOBJSIZE $value]       set minOBJSIZE [expr floor([min $minOBJSIZE $value])]   }   if { $keyword == "INTERPAGE" } {       puts $fo3 $value       set cntINTERPAGE [expr $cntINTERPAGE + 1]       set maxINTERPAGE [max $maxINTERPAGE $value]   }   if { $keyword == "INTERSESSION" } {       puts $fo4 $value       set cntINTERSESSION [expr $cntINTERSESSION + 1]       set maxINTERSESSION [max $maxINTERSESSION $value]   }   if { $keyword == "NUMOBJPERPAGE" } {       puts $fo6 $value       set cntNUMOBJPERPAGE [expr $cntNUMOBJPERPAGE + 1]       set maxNUMOBJPERPAGE [max $maxNUMOBJPERPAGE $value]       set minNUMOBJPERPAGE [expr floor([min $minNUMOBJPERPAGE $value])]   }}set incrNUMPAGE [expr ([expr $maxNUMPAGE - $minNUMPAGE] * 1.0) / ($defaultInterval * 1.0)]set incrOBJSIZE [expr ([expr $maxOBJSIZE - $minOBJSIZE] * 1.0) / ($defaultInterval * 1.0)]set incrINTERPAGE [expr ([expr $maxINTERPAGE - $minINTERPAGE] * 1.0) / ($defaultInterval * 1.0)]set incrINTERSESSION [expr ([expr $maxINTERSESSION - $minINTERSESSION] * 1.0) / ($defaultInterval * 1.0)]set incrREQUEST [expr ([expr $maxREQUEST - $minREQUEST] * 1.0) / ($defaultInterval * 1.0)]set incrOBJINTER [expr ([expr $maxOBJINTER - $minOBJINTER] * 1.0) / ($defaultInterval * 1.0)]set incrNUMOBJPERPAGE [expr ([expr $maxNUMOBJPERPAGE - $minNUMOBJPERPAGE] * 1.0) / ($defaultInterval * 1.0)]set persistRatio [expr ( $numPer * 1.0) / ($numConn * 1.0) ]puts $fo5 "0 [expr $numConn - $numPer] [expr 1.0 - $persistRatio]"puts $fo5 "1 $numConn 1.0"close $ficlose $fo1close $fo2close $fo3close $fo4close $fo5close $fo6catch { exec sort -g page.per.session.dat -o page.per.session.dat.sorted } rescatch { exec sort -g object.size.dat -o object.size.dat.sorted } rescatch { exec sort -g page.inter.dat -o page.inter.dat.sorted } rescatch { exec sort -g session.inter.dat -o session.inter.dat.sorted  } rescatch { exec sort -g request.size.dat -o request.size.dat.sorted  } rescatch { exec sort -g obj.inter.dat -o obj.inter.dat.sorted  } rescatch { exec sort -g obj.per.page.dat -o obj.per.page.dat.sorted  } resoutputPDF $minNUMPAGE $incrNUMPAGE "page.per.session.dat" outputPDF $minOBJSIZE $incrOBJSIZE "object.size.dat" outputPDF $minINTERPAGE $incrINTERPAGE "page.inter.dat" outputPDF $minREQUEST $incrREQUEST "request.size.dat" outputPDF $minOBJINTER $incrOBJINTER "obj.inter.dat" outputPDF $minNUMOBJPERPAGE $incrNUMOBJPERPAGE "obj.per.page.dat" if { $cntINTERSESSION > 0 } {   outputPDF $minINTERSESSION $incrINTERSESSION "session.inter.dat"    outputCDF "session.inter.dat"} else {  puts "Warning: only one user session?"}outputCDF "page.per.session.dat"outputCDF "object.size.dat"outputCDF "page.inter.dat"outputCDF "request.size.dat"outputCDF "obj.inter.dat"outputCDF "obj.per.page.dat"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -