I P封包

從一直以來討論至今﹐我們都不斷地接觸到“封包”這個詞﹐相信您也很有興趣想知道這個“封包”究竟是個什麼樣的東東吧﹗下面就讓我們一起看看一個IP封包究竟包含了那些內容。

擷取IP封包

如果您的機器上面裝有 netxray 等封包擷取軟體﹐或使用NT的“網路監視器”﹐我們就可以擷取那些進出本機的封包了。

當我們打開擷取功能之後﹐然後使用ping命令隨便ping一個地址﹐如﹕www.hinet.net。我們可以擷取到如下這些封包﹕

正如我們所見到的﹐我們擷取到DNS和ICMP的封包了﹐因為www.hinet.net需要到DNS解釋﹐而ping是一個ICMP協定。您或許知道ICMP封包的type為“Echo Request”和“Echo Reply”分別代表什麼意思吧﹖

讓我們再深入一點﹐看看DNS封包裡面有些什麼東東﹕

如果您往上卷回有關“DNS”的文章﹐看看我們用 nslookup 的 debug 模式查找 www.hinet.ne t這個網址時候﹐引證一下那裡的內容﹐您就知道這個封包說些什麼了。

下面讓我們再看看ICMP封包裡面的內容﹕

其實我們真正擷取到的封包內容應該是紅圈的範圍﹐在上面和右邊的欄目裡面的資料是經過程式整理出來的結果。在第一行裡面﹐我們看到“00 80 c7 47 8c 9a 48 54 e8 27 75 77”這串數字﹐所代表的分別是目的地和來源地的MAC地址﹔然後“08 00”代表的是一個Ethernet II的IP協定類型。Ethernet II可以說是IEEE802.3的改進版本。(還記得“網路概論”裡面關於“邏輯形態”的敘述麼﹖)。這裡可以說是Datalink網路層所要追蹤的資料。

然後﹐接下來的是屬於IP封包的內容﹕

請先記著上圖的內容﹐我打算在下一節裡面在詳細討論每一行的意思。

IP封包格式

首先﹐讓我們看看IP封包的格式是怎樣的﹐和其組成部份﹐以及各部份的長度如何﹕

Version (4) Internet Header Length (4) Type of Service (8) Total Length (16)
Identification (16) Flags (3) Fragment Offset (13)
Time To Live (8) Protocol (8) Header checksum (16)
Source Address (32)
Destination Address (32)
Options (Variable) Padding (0-24)
  
Data
.... 

在上圖中﹐括號之內的數字就是各部件的長度(bit)﹐如果您夠細心﹐就會計算得出每一列的總長度都是32bit。下面我們分別對各部件名稱解釋一下﹕

Version
版本(VER)。表示的是IP規格版本﹐目前的IP規格多為版本4(version 4)﹐所以這裡的數值通常為 0x4 (注意﹕封包使用的數字通常都是十六進位的)。
Internet Header Length
標頭長度(IHL)。我們從IP封包規格中看到前面的6列為header﹐如果Options和Padding沒有設定的話﹐也就只有5列的長度﹐所以這裡的長度為“5”﹔我們知道每列有32bit﹐也就是4byte﹔那麼5列就是20byte了﹐20這個數值換成16進位就成了0x14﹐所以﹐當封包標頭長度為最短的時候﹐這裡數值最終會被換算為 0x14 。

讓我們看看我們擷取的ICMP封包﹐其中屬於IP部份的開頭﹕

在這裡﹕我們看到的數值是“45”﹐前面的“4”就是版本號數﹐而後面的“5”則是標頭長度。

Type of Service
服務類型(TOS)。這裡指的是IP封包在傳送過程中要求的服務類型﹐其中一共由8個bit組成﹐其中每個bit的組合分別代表不同的意思﹕

000..... Routine 設定IP順序﹐預設為0﹐否則﹐數值越高越優先
...0.... Delay 延遲要求﹐0是正常值﹐1為低要求
....0... Throughput 通訊量要求﹐0為正常值﹐1為高要求
.....0.. Reliability 可靠性要求﹐0為正常值﹐1為高要求
......00 Not Used 未使用

在下例中﹐我們可以看到TOS的值為0﹐也就是全部設置為正常值﹕

Total Length
封包總長(TL)。通常以byte做單位來表示該封包的總長度﹐此數值包括標頭和數據的總和。

從上圖我們看到的十六進位數值是“003C”﹐換成十進位就是“60”了。

Identification
識別碼(ID)。每一個IP封包都有一個16bit的唯一識別碼。我們從OSI的網路層級知識裡面知道﹕當程式產生的數據要通過網路傳送時﹐都會被拆散成封包形式發送﹐當封包要進行重組的時候﹐這個ID就是依據了。

從上圖我們可以看到此封包的ID為﹕40973 (將 a00d 換成十進制就知道了)。

Flag
標記(FL)。這是當封包在傳輸過程中進行最佳組合時使用的3個bit的識別記號。請參考下表﹕

000. 當此值為0的時候﹐表示目前未被使用。
.0.. 當此值為0的時候﹐表示封包可以被分割﹐如果為1則不能被分割。
..0. 當上一個值為0時﹐此值為0就示該封包是最後一個封包﹐如果為1則表示其後還有被分割的封包。

在下例中﹐我們看到這個封包的標記為“0”﹐也就是目前並未使用。

Fragment Offset
分割定位(FO)。當封包被切開之後﹐由於網路情況或其它因素影響﹐其抵達順序並不會和當初切割順序一至的。所以當封包進行切割的時候﹐會為各片段做好定位記錄﹐所以在重組的時候﹐就能夠依號入座了。

因為我們剛才擷取到的封包並沒有被切割﹐所以﹐暫時找不到例子參考﹔在上例中我們看到的FO為“0”。

Time To Live
延續時間(TTL)。這個TTL我們在許多網路設定上都會碰到﹐當一個物件﹐被賦予TTL值(以秒為單位)之後﹐就會進行計時﹐如果物件在到達TTL值的時候還沒被處理的話﹐就會被遺棄。 不過﹐並不是所有的 TTL 都以時間為單位﹐例如 ICMP 協定的 TTL﹐則以封包路由過程中的跳站數目(Hop Count)做單位。TTL 值每經過一個跳站(或被一個 router 處理)之後﹐就會被減低一個數值 。這樣當封包在傳遞過程中由於某些原因而未能抵達目的地的時候﹐就可以避免其一直充斥在網路上面。

上圖中我們看到的數值﹐可不是 20 哦﹐因為這是個十六進位數字﹐要換成十進位才知道 TTL 原來是 32 個跳站。

Protocol
協定(PROT)。這裡指的是該封包所使用的網路協定類型﹐例如﹕ICMP﹑DNS等。要注意的是﹕這裡使用的協定是網路層的協定﹐這和上層的程式協定(如﹕FTP﹑POP等)是不同的。您可以從Linux的/etc/protocol這個檔案中找到這些協定和其代號﹔此檔案也存放於NT的\winnt\system32\drivers\etc目錄裡面。其內容如下﹕
  1. ------------------------------------------------------
  2. ip 0 IP # internet protocol, pseudo protocol number
  3. icmp 1 ICMP # internet control message protocol
  4. igmp 2 IGMP # Internet Group Management
  5. ggp 3 GGP # gateway-gateway protocol
  6. ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'')
  7. st 5 ST # ST datagram mode
  8. tcp 6 TCP # transmission control protocol
  9. egp 8 EGP # exterior gateway protocol
  10. pup 12 PUP # PARC universal packet protocol
  11. udp 17 UDP # user datagram protocol
  12. hmp 20 HMP # host monitoring protocol
  13. xns-idp 22 XNS-IDP # Xerox NS IDP
  14. rdp 27 RDP # "reliable datagram" protocol
  15. iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4
  16. xtp 36 XTP # Xpress Tranfer Protocol
  17. ddp 37 DDP # Datagram Delivery Protocol
  18. idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport
  19. rspf 73 RSPF #Radio Shortest Path First.
  20. vmtp 81 VMTP # Versatile Message Transport
  21. ospf 89 OSPFIGP # Open Shortest Path First IGP
  22. ipip 94 IPIP # Yet Another IP encapsulation
  23. encap 98 ENCAP # Yet Another IP encapsulation
  24. ------------------------------------------------------

在我們這個例子中﹐可以看得出PROT的號碼為“01”﹐對照/etc/protocol檔案﹐我們可以知道這是一個ICMP協定。

Header Checksum
標頭檢驗值(HC)。這個數值主要用來檢錯用的﹐用以確保封包被正確無誤的接收到。當封包開始進行傳送後﹐接收端主機會利用這個檢驗值會來檢驗餘下的封包﹐如果一切看來無誤﹐就會發出確認信息﹐表示接收正常。

上圖中我們看到的封包之HC為﹕“9049”。

Source IP Address
來源地址(SA)。相信這個不用多解釋了﹐就是發送端的IP地址是也。

我們將“c0.a8.00.0f”換成十進位﹐就可以得出“192.168.0.15”這個地址了。

Destination IP Address
目的地址(DA)。也就是接收端的IP地址啦。

看看﹐你能不能將“a8.5f.01.54”換成“168.95.1.84”﹖

Options & Padding
這兩個選項甚少使用﹐只有某些特殊的封包需要特定的控制﹐才會利用到。這裡也不作細表啦。


www.study-area.org © 2001 Netman 網中人
Last Updated: April 26, 2001

ip封包的更多相关文章

  1. IP封包的封装 - 首部内容

    IP 封包的封装 目前因特网社会的 IP 有两种版本,一种是目前使用最广泛的 IPv4 (Internet Protocol version 4, 因特网协定第四版), 一种则是预期未来会热门的 IP ...

  2. IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式

    IP协议头IP包头格式: 1.版本号:4个bit,用来标识IP版本号.这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6.目前使用的IP协议版本号是4. 2.首部长度:4个 ...

  3. 【linux】虚拟机安装centos后ping ip地址出现错误:Network is unreachable

    来源:https://my.oschina.net/stonezing/blog/515480 方案一: 进入/etc/sysconfig/network-scripts/ 查看这下面的文件 每个人的 ...

  4. 2.1.5 计算机网络协议: TCP/IP

    应用程序阶段:妳打开浏览器,在浏览器上面输入网址列,按下 [Enter].此时网址列与相关数据会被浏览器包成一个数据, 并向下传给 TCP/IP 的应用层: 应用层:由应用层提供的 HTTP 通讯协议 ...

  5. 如何在 Linux 终端中知道你的公有 IP

    导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...

  6. IP的种类与获取方式

    IP 的种类与取得方式 接下来要跟大家谈一谈也是很容易造成大家困扰的一个部分,那就是 IP 的种类!很多朋友常常听到什么『真实IP, 实体 IP, 虚拟 IP, 假的 IP....』烦都烦死了-其实不 ...

  7. 初识TCP/IP协议

    初识TCP/IP协议 TCP/IP 全称是(Transmission Control Protocol / Internet Protocol),传输控制协议/网际协议.TCP/IP定义了电子设备(比 ...

  8. 在Linux终端中查看公有IP的方法详解

    首先回顾一下一般的查看IP的命令: ifconfigLinux查看IP地址的命令--ifconfigifconfig命令用于查看和更改网络接口的地址和参数 $ifconfig -a  lo0: fla ...

  9. 【TCP/IP】【网络基础】网页访问流程

    引用自 <鸟哥的linux私房菜> http://cn.linux.vbird.org/linux_server/0110network_basic_1.php#ps7 那 TCP/IP ...

随机推荐

  1. Android 解析Json_fastJson

    FastJSON是一个很好的java开源json工具类库,相比其他同类的json类库,它的速度的确是fast,最快!但是文档做得不好,在应用前不得不亲测一些功能.   实际上其他的json处理工具都和 ...

  2. installing mysql,this may take a few minutes,hold on plz wdcp卡住解决办法

    centos6安装wdcp时make in progress卡住的解决办法 今天在一台centos6的vps上安装wdcp出现的这个问题,到安装程序滚动至下面这里时出现"卡死". ...

  3. haproxy para config

    .. from http://www.cnblogs.com/dkblog/archive/2012/03/13/2393321.html 常用配置选项: OPTION 选项: option http ...

  4. Python 的安装与配置(Windows)

    Python2.7安装配置 python的官网地址:https://www.python.org/ 我这里下载的是python2.7.12版本的 下载后点击安装文件,直接点击下一步知道finally完 ...

  5. VS2010中汉字拷贝到Word出现乱码问题解决

    VS2010中的汉字拷贝到Word时出现乱码,有三种解决方法: 一.粘贴时,选择“仅保留文本”.如图: 二.先拷贝粘贴到记事本文件内,此时会自动过滤格式信息,再从记事本拷贝到Word. 三.使用转换软 ...

  6. [Struts2] Action Implements SessionAware

    struts2 的Action中若希望访问Session对象,可采用两种方式: 1.从ActionContext中获取: 2.实现SessionAware接口. 1.从ActionContext中获取 ...

  7. DataList删除操作

    <asp:DataList ID="fileList" runat="server" RepeatColumns="1" Repeat ...

  8. 国内外从事CV相关的企业

    提示:本文为笔者原创,转载请注明出处:blog.csdn.net/carson2005 经常碰到朋友问我国内从事计算机视觉(CV)领域的公司的发展情况,产品情况,甚至找工作等问题,这里,我给出自己收集 ...

  9. 安卓版App开发心得

    从2016年4月到6月主要做的工作是网站的开发,而6月到现在2016年8月初,主要做的工作是Android和IOS两种App的开发,又以Android为主. 将这段时间的Android开发心得记录如下 ...

  10. [转载] 不查资料确定int型整数的最大值和最小值

    原文地址:http://blog.csdn.net/zhanghuoding/article/details/42719213 想法来自于书中的习题. Java的话直接输出 Integer.MAX_V ...