`
wosmvp
  • 浏览: 21767 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
最近访客 更多访客>>
社区版块
存档分类
最新评论

IPParse: IP 地址查询

阅读更多
1)在shell中:
$ ipparse 218.58.88.175 212.1.1.1 192.245.148.0 116.254.254.0
218.58.88.175 => 山东省青岛市开发区
212.1.1.1 => 意大利
192.245.148.0 => 阿尔及利亚
116.254.254.0 => 广东省广州市

2)程序中:
require ‘rubygems’
require ‘ipparse’
IPParse.parse(‘218.58.88.175’) # => 山东省青岛市开发区


有效代码30多行,使用了PHPWind的IP数据库(稍稍改了改格式,源码里提供了工具)
分析10000个随机IP 需要5秒左右的时间

地址:http://github.com/wosmvp/ipparse/tree/master
安装:(申请了RubyForge ipparse 目前还没有审核)
$ git clone git://github.com/wosmvp/ipparse.git
$ cd ipparse
$ rake install (可能需要安装 echoe )


------
http://www.zhangjinzhu.com
分享到:
评论
17 楼 orange0513 2009-02-19  
wosmvp 写道
QuakeWang 写道
JavaEye的IP解析也是用纯真IP数据库查询算法写的,它比较快,而且数据格式比较小,小于10M,可以一次性全部加载到内存。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。


用的二分
全部代码
class IPParse
  @@data ||= []
 
  def self.parse(ip)
    return false unless ip.to_s =~ /(\d+\.){3}\d+/ # 简单判断IP格式合法性(当然这样不能保证格式完全正确,实用中传入非法格式的可能性比较少,先这样吧)
    ip,addr = format(ip) , '' #格式化IP地址, 例: 1.4.45.123 格式化为 001.004.045.123
 
    [ip[0,3].to_i,0].each do |f| # 先从IP首位命名的文件中查找,没有则从0.txt文件中查找, IP文件命名格式为 data/123.txt ...

      file = "#{File.dirname(__FILE__)}/../data/#{f.to_s}.txt"
      @@data[f] ||= File.exist?(file) ? File.new(file).to_a : false  # 如果存在文件,缓存取出的文件
 
      if @@data[f]
        addr = dichotomizing(@@data[f],ip) # 二分法查找
        return addr if addr # 找到则返回此值
      end
    end
 
    return "UNKNOW"
  end
 
  protected
  def self.dichotomizing(arg,ip)
    cen = arg.size/2  # 长度取中 center
    cur = arg[cen]    # 中值 current,
       #格式类似 005.149.000.000 005.255.255.255 IANA
    
    #当只有一个元素时,(005.149.000.000..005.255.255.255) 是否包含IP
    return (cur[0,15]..cur[16,15]).include?(ip) ? cur[32...-1] : false if cen == 0
    # 005.149.000.000(前面的IP) > IP 时取前一半
    return dichotomizing(arg[0...cen],ip) if cur[0,15] > ip
    # 005.255.255.255(前面的IP) < IP 时取后一半
    return dichotomizing(arg[cen..-1],ip) if cur[16,15] < ip
    # 如果 此值的前IP < IP < 此值的后IP,则返回此值
    return arg[cen][32...-1]
  end
 
  def self.format(ip)
    ip.to_s.split('.').inject([]) do |s,x|
      s << x.rjust(3,'0')
    end.join('.')
  end
end


速度过会上。

我试了下你的这个puts IPParse.parse('222.222.222.222')怎么找不到。而且我不喜欢打开一个文件不自己关闭它。我改成这样了,用的ruby1.9.1所以有最上面那行。不知道有没有什么BUG!
Encoding.default_external='UTF-8'

require 'benchmark'

class IPParse
   @@data ||= [] 
   def self.parse(ip)
      raise 'WRONT IP ADDRESS' unless ip.to_s =~ /(\d+\.){3}\d+/
      ip.to_s.split('.').each{|i| raise 'WRONT IP ADDRESS' if i.to_i>255	}

      ip= format(ip)
      [ip[0,3].to_i,0].each do |n|
        file="#{File.dirname(__FILE__)}/../data/#{n.to_s}.txt"
        @@data[n] ||= File.exist?(file) ? File.open(file){|f|f.to_a} : false
        if @@data[n]
          addr=dichotomizing(@@data[n],n == 0 ? ip : ip[4,ip.length])
          return addr.strip if addr
        end
      end
      return "UNKNOW"
   end

 private
  def self.dichotomizing(arg,ip)
    size = arg.size
    cen  = size/2
    x=arg[cen].split(/\s+/,3)
    
    return dichotomizing(arg[0...cen],ip)           if size != 1 && x[0] > ip 
    return dichotomizing(arg[cen...size],ip)        if size != 1 && x[1] < ip
    return x[0] <= ip && x[1] >= ip  ? x[2] : false if size == 1
    return x[2]
  end

  def self.format(ip)
    ip.to_s.split('.').inject([]) do |s,x|
      s <<  x.rjust(3,'0')   
    end.join('.')
  end
end

def randip   
  4.times.inject([]) {|s,x| s << rand(255) }.join('.')   
end 

Benchmark.bm{|x|
  x.report{
    10000.times{
      IPParse.parse(randip)
    }
  }
}

16 楼 wosmvp 2009-02-19  
上面的结果是测试1万个随机IP,每个IP测试10次的结果
15 楼 wosmvp 2009-02-19  
结果:
~ $ ruby a.rb  (纯真)
131.656655311584
~ $ ruby a.rb  (IPParse)
28.8699994087219
14 楼 wosmvp 2009-02-19  
上测试:

纯真IP查询 使用了 orlaa 朋友的
http://gist.github.com/66248

测试环境:
Linux myhost 2.6.28.2 #1 SMP PREEMPT Fri Jan 30 16:03:57 CST 2009 i686 AMD Turion(tm) 64 Mobile Technology MK-38(2.2GHz) AuthenticAMD GNU/Linux,1.5G内存


代码如下
require 'rubygems'
require 'ipparse'

def search_ip_cz(ip)
  #IP数据文件路径
  #ip='202.38.64.10'
  dat_path = "/home/mvp/Desktop/QQWry.Dat"
   
  #检查IP地址
  # if not ip~=/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/
  #    return 'IP Address Error'
  # end
  fd = File.open(dat_path, "rb")
   
  ips = ip.split('.')
  ip_num = ips[0].to_i * 16777216 + ips[1].to_i * 65536 + ips[2].to_i * 256 + ips[3].to_i
  data_begin = fd.read(4)
  data_end = fd.read(4)
   
  ipbegin= data_begin.unpack('L').join('').to_i
   
  if ipbegin < 0
    ipbegin += 2**32
  end
   
  ipend= data_end.unpack('L').join('').to_i
   
  if ipend < 0
    ipend += 2**32
  end
   
  ip_allnum = (ipend - ipbegin) / 7 + 1
  begin_num = 0
  end_num = ip_allnum
  ip1_num=0
  ip2_num=0
  ip_addr1=""
  ip_addr2=""
  #使用二分查找法从索引记录中搜索匹配的IP记录
  while ip1_num>ip_num or ip2_num<ip_num
    middle= ((end_num + begin_num) / 2).to_i
     
    #偏移指针到索引位置读取4个字节
    fd.seek(ipbegin + 7 * middle)
    ip_data1 = fd.read(4)
    if ip_data1.length < 4
      fd.close
      return 'System Error'
    end
     
    #提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
    ip1_num = ip_data1.unpack('L').join('').to_i
    if ip1_num < 0
      ip1_num += 2**32
    end
     
    #提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
    if ip1_num > ip_num
      end_num = middle
      redo
    end
     
     
    #取完上一个索引后取下一个索引
    data_seek = fd.read(3)
    if data_seek.length < 3
      fd.close
      return 'System Error';
    end
     
    data_seek = (data_seek+0.chr).unpack('L').join('').to_i #data_seek = implode('', unpack('L', $data_seek.chr(0)));
     
    fd.seek(data_seek)
     
    ip_data2 = fd.read(4)
     
    if ip_data2.length<4
      fd.close
      return 'System Error'
    end
     
    ip2_num = ip_data2.unpack('L').join('').to_i
    if ip2_num < 0
      ip2_num += 2**32
    end
     
    #没找到提示未知
    if ip2_num < ip_num
    end
     
    if middle == begin_num
      fd.close
      return 'Unknown'
       
    end
     
    begin_num = middle
  end
    
  ip_flag = fd.read(1)
  if ip_flag == 1.chr
    ip_seek = fd.read(3)
    if ip_seek.length < 3
      fd.close
      return 'System Error'
    end
    ip_seek = (ip_seek+0.chr).unpack('L').join('').to_i #implode('', unpack('L', $ip_seek.chr(0)));
    fd.seek(ip_seek)
    ip_flag = fd.read(1)
  end
   
  if ip_flag == 2.chr
    addr_seek = fd.read(3)
    if addr_seek.length < 3
      fd.close
      return 'System Error'
    end
    ip_flag = fd.read(1)
    if ip_flag == 2.chr
      addr_seek2 = fd.read(3)
      if addr_seek2.length< 3
        fd.close
        return 'System Error'
      end
      addr_seek2 =(addr_seek2+0.chr).unpack('L').join('').to_i# implode('', unpack('L', $addr_seek2.chr(0)));
      fd.seek(addr_seek2)
    else
      fd.seek(-1, IO::SEEK_CUR)
    end
     
    while (char = fd.read(1)) != 0.chr
      ip_addr2 += char# ip_addr2 .= char
    end
     
    addr_seek =(addr_seek+0.chr).unpack('L').join('').to_i#$addr_seek = implode('', unpack('L', $addr_seek.chr(0)));
    fd.seek(addr_seek)
     
    while (char = fd.read(1)) != 0.chr
      ip_addr1 += char#$ip_addr1 .= $char;
    end
  else
    fd.seek(-1, IO::SEEK_CUR)
    while ( char = fd.read(1)) != 0.chr
      ip_addr1 += char#ip_addr1 .= char;
    end
     
    ip_flag = fd.read(1)
    if ip_flag == 2.chr
      addr_seek2 = fd.read(3)
      if addr_seek2.length < 3
        fd.close
        return 'System Error'
      end
      addr_seek2 = (addr_seek2+0.chr).unpack('L').join('').to_i#implode('', unpack('L', $addr_seek2.chr(0)));
      fd.seek(addr_seek2)
    else
      fd.seek(-1, IO::SEEK_CUR)
    end
    while (char = fd.read(1)) != 0.chr
      ip_addr2 += char# ip_addr2 .= char
    end
  end
# fd.close
   
  #最后做相应的替换操作后返回结果
  #if(preg_match('/http/i', $ip_addr2)) {
  # $ip_addr2 = '';
  #}
  if (ip_addr2=~/http(\s|\S)/)!=nil
    ip_addr2 = ''
  end
   
  ip_addr = "#{ip_addr1} #{ip_addr2}"
  ip_addr.gsub!(/(\S|\s)*CZ88.(NET|Net)(\S|\s)*/,'')#$ip_addr = preg_replace('/CZ88.Net/is', '', $ip_addr);
   
  #$ip_addr = preg_replace('/^s*/is', '', $ip_addr);
  #$ip_addr = preg_replace('/s*$/is', '', $ip_addr);
  if (ip_addr=~/http(\s|\S)/)!=nil or ip_addr==""
    ip_addr = 'Unknown'
  end
   
 # print ip_addr
  return ip_addr
end

def randip
  4.times.inject([]) {|s,x| s << rand(255) }.join('.')
end
a = []

10000.times { a << randip }
c = 0
a.map {|x|
  10.times{
    t = Time.now
    # search_ip_cz(x)
    IPParse.parse(x)
    c += Time.now.to_f - t.to_f
  }
}
puts c
13 楼 wosmvp 2009-02-19  
QuakeWang 写道
JavaEye的IP解析也是用纯真IP数据库查询算法写的,它比较快,而且数据格式比较小,小于10M,可以一次性全部加载到内存。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。


用的二分
全部代码
class IPParse
  @@data ||= []
 
  def self.parse(ip)
    return false unless ip.to_s =~ /(\d+\.){3}\d+/ # 简单判断IP格式合法性(当然这样不能保证格式完全正确,实用中传入非法格式的可能性比较少,先这样吧)
    ip,addr = format(ip) , '' #格式化IP地址, 例: 1.4.45.123 格式化为 001.004.045.123
 
    [ip[0,3].to_i,0].each do |f| # 先从IP首位命名的文件中查找,没有则从0.txt文件中查找, IP文件命名格式为 data/123.txt ...

      file = "#{File.dirname(__FILE__)}/../data/#{f.to_s}.txt"
      @@data[f] ||= File.exist?(file) ? File.new(file).to_a : false  # 如果存在文件,缓存取出的文件
 
      if @@data[f]
        addr = dichotomizing(@@data[f],ip) # 二分法查找
        return addr if addr # 找到则返回此值
      end
    end
 
    return "UNKNOW"
  end
 
  protected
  def self.dichotomizing(arg,ip)
    cen = arg.size/2  # 长度取中 center
    cur = arg[cen]    # 中值 current,
       #格式类似 005.149.000.000 005.255.255.255 IANA
    
    #当只有一个元素时,(005.149.000.000..005.255.255.255) 是否包含IP
    return (cur[0,15]..cur[16,15]).include?(ip) ? cur[32...-1] : false if cen == 0
    # 005.149.000.000(前面的IP) > IP 时取前一半
    return dichotomizing(arg[0...cen],ip) if cur[0,15] > ip
    # 005.255.255.255(前面的IP) < IP 时取后一半
    return dichotomizing(arg[cen..-1],ip) if cur[16,15] < ip
    # 如果 此值的前IP < IP < 此值的后IP,则返回此值
    return arg[cen][32...-1]
  end
 
  def self.format(ip)
    ip.to_s.split('.').inject([]) do |s,x|
      s << x.rjust(3,'0')
    end.join('.')
  end
end


速度过会上。
12 楼 wosmvp 2009-02-19  
欢迎一切符合自己应用的修改,
纯真版代码太长,这个版本30行代码都不到,也挺快挺好用
11 楼 QuakeWang 2009-02-19  
JavaEye的IP解析也是用纯真IP数据库查询算法写的,它比较快,而且数据格式比较小,小于10M,可以一次性全部加载到内存。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。
10 楼 wosmvp 2009-02-19  
orange0513 写道
二分查找代码return dichotomizing(arg[0...cen],ip)           if size != 1 && (arg[cen] > ip + '1')
这块好像有bug
IPParse.parse('59.1.32.220')到最后就死循环


这个版本早过时了 
9 楼 wosmvp 2009-02-19  
orlaa 写道
http://read.pudn.com/downloads74/sourcecode/windows/file/268981/ip_searcher.rb__.htm

IP数据库 纯真版 是能在linux中使用的,上面的地址是刚找到的一段测试代码,将
def search_ip_cz(ip) 剥离出来便能正常在linux系统下正常使用了,
http://lumaqq.linuxsir.org/article/qqwry_format_detail.html这篇文章是LumaQQ作者写的"纯真IP数据库格式详解"



非文本修改起来比较麻烦……呵呵
8 楼 orlaa 2009-02-18  
http://gist.github.com/66248

剥离出来的纯真IP数据库查询脚本,使用二分查找法.
7 楼 不见得 2009-02-18  
<p>嗯 , 是我使用的问题 , 我终端都是 gbk的, 还得转那么一下 :</p>
<p> </p>
<pre name="code" class="ruby">Iconv.conv('gbk','utf-8',IPParse.parse('218.58.88.175')) </pre>
<p> </p>
<p> </p>
<p>貌似纯真的库数据量很大  http://www.cz88.net/<br />有个ruby的版本 http://www.51dir.com/thread-203-1-1.html<br />但是有些问题 , 还有个对这个的hack版 , google  下就能找到 。</p>
<p> </p>
<p> </p>
<p>一个小建议:</p>
<p> </p>
<pre name="code" class="ruby"> def self.parse(ip , to = 'utf-8')</pre>
 
<p>haha , 这样我用着就更方便了</p>
<p> </p>
<p> </p>
<p> </p>
6 楼 orange0513 2009-02-18  
二分查找代码return dichotomizing(arg[0...cen],ip)           if size != 1 && (arg[cen] > ip + '1')
这块好像有bug
IPParse.parse('59.1.32.220')到最后就死循环
5 楼 orlaa 2009-02-18  
http://read.pudn.com/downloads74/sourcecode/windows/file/268981/ip_searcher.rb__.htm

IP数据库 纯真版 是能在linux中使用的,上面的地址是刚找到的一段测试代码,将
def search_ip_cz(ip) 剥离出来便能正常在linux系统下正常使用了,
http://lumaqq.linuxsir.org/article/qqwry_format_detail.html这篇文章是LumaQQ作者写的"纯真IP数据库格式详解"

4 楼 wosmvp 2009-02-18  
<div class="quote_title">不见得 写道</div>
<div class="quote_div">
<p>免费测试一下 ,编码似乎有些问题 ,都显示不出来,是不是要检查一下当前系统的编码呢 ?</p>
<p> </p>
<p> </p>
<p>windowsxp 和 linux 都是</p>
<p>而且 linux 的  LANG=en_US.UTF-8 或者 zh_CN.utf8 都不成哦, 上图 , 仅供参考 :)<br /><img src="/upload/attachment/76484/b645ee29-cfc7-3408-9bb5-339fa9ece863.jpg" alt="" /><br /> <br /><img src="/upload/attachment/76486/60a805a6-d299-3d34-ab48-d0626741b2da.jpg" alt="" /></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p>IP文本格式是UTF8的,GBK有乱码正常,</p>
<p>UTF-8 乱码? 上张 Linux . UTF-8 乱码截图看看?</p>
<p> </p>
<p>检查一下当前系统的编码,速度必然降低,写这个Gem开始是想用在web应用中,如果想用GBK编码,先下载PHPWind的GBK编码的ipdata文件,再使用lib目录下的convert_ip_format.rb转换格式(可能需要修改此文件,例如去掉dos2unix等),将它们复制到data目录就行</p>
<p> </p>
<p> </p>
<p>--------------</p>
<p>IP数据库 纯真版 ?     没试过,好像不可以在Linux中使用吧?</p>
3 楼 不见得 2009-02-18  
<p>免费测试一下 ,编码似乎有些问题 ,都显示不出来,是不是要检查一下当前系统的编码呢 ?</p>
<p> </p>
<p> </p>
<p>windowsxp 和 linux 都是</p>
<p>而且 linux 的  LANG=en_US.UTF-8 或者 zh_CN.utf8 都不成哦, 上图 , 仅供参考 :)<br /><img src="/upload/attachment/76484/b645ee29-cfc7-3408-9bb5-339fa9ece863.jpg" alt="" /><br /> <br /><img src="/upload/attachment/76486/60a805a6-d299-3d34-ab48-d0626741b2da.jpg" alt="" /></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
2 楼 orlaa 2009-02-18  
现在的IP数据库是文本的, 能否换成 "IP数据库 纯真版"的呢?
1 楼 wosmvp 2009-02-18  
昨天版本10万随机IP时间为 52.5233330726624 秒
今天版本10万随机IP时间为 28.3033330440521秒
速度提升 46.1 % !

安装:
$ sudo gem install ipparse

相关推荐

    超级纯真显ip查询很实用

    1. **IP地址输入**:用户可以直接输入IP地址进行查询。 2. **自动识别**:工具可能具备自动识别输入是否为IP地址的功能,避免用户输入错误。 3. **地理定位**:利用纯真IP数据库,将IP地址转换为具体的地理位置信息...

    java根据ip获取国家、地区名称,附带ip地址库

    总结来说,Java中根据IP获取国家和地区名称涉及的技术点包括:使用`InetAddress`处理IP地址、理解IP地址库的结构和查询机制、以及选择和使用合适的第三方库或服务进行IP定位。在实际应用中,应确保IP库的及时更新,...

    Java获取ip所在地区

    3. **查询IP地址**:在解析库的帮助下,我们可以输入一个IP地址,通过二分查找等高效算法,快速定位到该IP地址在数据库中的记录。记录通常包括起始IP、结束IP以及对应地理位置的信息。 4. **提取地理位置信息**:...

    ip协议的试题 对ip地址的解析

    试题中涉及的知识点主要集中在IP地址的解析、子网掩码的运用以及网络地址、主机地址、广播地址的计算。 1. IP地址结构:IP地址由32位二进制组成,通常分为四部分,每部分用点分十进制表示,如154.27.0.0。IP地址...

    通过ip确定所在城市和网路运营商

    2. **IP库查询**:使用预构建的IP地址数据库,如MaxMind的GeoLite,进行查询。这些数据库会定期更新以保持准确。 3. **API服务**:如Google Maps Geocoding API或OpenStreetMap Nominatim等,可以提供IP地址的地理...

    解析IP数据包 小程序(C++实现)

    本次设计的目标是捕获网络中...2)在标准输出和日志文件写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。

    解析IP数据包(设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题)

    在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容,当程序接收到键盘输入Ctrl+C时...

    计算机网络课程设计 解析IP数据包

    设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。 本实验的目标是捕获网络中的IP数据包,解析数据包的内容,见个结果显示在标准输出...

    IP数据包解析程序

    2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 3)能够解析不同协议...

    获取ip归属地

    通过这个数据库,我们可以快速查询到一个IP地址所属的地理位置。首先,你需要从互联网上下载最新版本的纯真IP数据库,通常以SQL或文本格式提供。 在Java中,我们可以创建一个类来处理IP解析。以下是一个简单的...

    c++代码解析IP数据包

    在`ipparse`函数中,代码首先通过`*(IP_HEADER*)buffer`将缓冲区中的数据转化为`IP_HEADER`结构体,然后依次调用上述函数来解析并打印出每个字段的值。这一步骤是实现IP数据包解析的核心。 ### 结论 通过上述分析...

    ip数据包抓取,分析ip数据报格式

    9. 源IP地址(Source IP Address)和目的IP地址(Destination IP Address):各32位,标识发送方和接收方的网络地址。 10. 可选字段(Options):根据首部长度字段,可能存在的可选字段,用于扩展功能。 在C语言中...

    ip-parse:获取IP及运营商信息

    这通常涉及到DNS反向查询,将IP地址映射回其对应的组织或运营商。这对于网站统计、网络安全分析、地理位置服务等应用非常有用。例如,你可以使用这个库来识别访问你网站的用户可能来自哪个网络服务提供商,或者在...

    IP数据包解析报告

    头部包含了控制信息,如版本号、头部长度、服务类型(TOS)、总长度、标识符、标志、片段偏移、生存时间(TTL)、协议类型、头部校验和以及源和目的IP地址。数据部分则携带上层协议(如TCP、UDP或ICMP)的数据。 2...

    计算机课程设计-IP数据包解析

    - 输出并记录IP包头的关键信息,包括版本、头长度、服务类型(TOS)、总长度、标识符、标志、片段偏移、生存时间(TTL)、上层协议类型、头校验和、源IP地址和目标IP地址等。 - 提供一个优雅的退出机制,例如在接收...

    计算机网络课程设计—解析IP数据包课程设计

    1. **了解IP数据包的基本结构**:包括版本号、头部长度、服务类型、总长度、标识、标志、片段偏移、生存时间(TTL)、协议类型、头部校验和、源IP地址、目的IP地址等。 2. **理解IP协议的工作原理**:包括IP数据包在...

    解析IP数据包课程设计

    - **源IP地址和目的IP地址**: 各32位,分别表示发送方和接收方的IP地址。 - **选项字段和填充字段**: 可选字段,用于携带额外的信息或对齐。 2. **IP协议**: - **功能**: IP协议负责在网络层将数据从源节点传递...

    计算机网络课程设计IP数据包解析.doc

    2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 3)当程序接收到键盘输入...

Global site tag (gtag.js) - Google Analytics