首页 > 代码库 > TCP/IP Four Layer Protocol Format Learning(undone)

TCP/IP Four Layer Protocol Format Learning(undone)

相关学习资料

tcp-ip详解卷1:协议.pdf

 

目录

0. 引言1. 应用层3. 传输层4. 网络层

 

0. 引言 

协议中的网络字节序问题

在学习协议格式之前,有一点必须明白,否则我们在观察抓包数据的时候可能会产生疑惑:

1. 协议格式中的字段排布,最高位在左边,记为0bit;最低位在右边,记为31 bit。2. 4个字节的32bit值以下面的次序传输:    1) 首先是0~7bit    2) 其次8~15bit    3) 然后16~23bit    4) 最后是24~31bit这种传输次序称作"big endian字节序"3. 由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作"网络字节序"4. 以其他形式存储二进制整数的机器,如little endian格式,则必须在传输数据之前把首部转换成网络字节序

 

1. 应用层

0x1: NTP网络协议

NTP有两种不同类型的报文,一种是时钟同步报文,另一种是控制报文(用于网络管理),NTP基于UDP报文进行传输,使用的UDP端口号为123 

1. 时钟同步报文

1. LI(Leap Indicator)(2 bits)     1) 值为"11"时表示告警状态,时钟未被同步    2) 为其他值时NTP本身不做处理2. VN(Version Number)(3 bits): 表示NTP的版本号,目前的最新版本为33. Mode(3 bits): 表示NTP的工作模式。不同的值所表示的含义分别是:    1) 0: 未定义    2) 1: 主动对等体模式    3) 2: 表示被动对等体模式    4) 3: 表示客户模式    5) 4: 表示服务器模式    6) 5: 表示广播模式或组播模式    7) 6: 表示此报文为NTP控制报文(MODE_CONTROL)    8) 7: 预留给内部使用(MODE_PRIVATE)4. Stratum(8 bits): 系统时钟的层数,取值范围为1~16,它定义了时钟的准确度,这也表明了整个NTP的架构是一种层次型的架构    1) 层数为1的时钟准确度最高    2) 准确度从1到16依次递减    3) 层数为16的时钟处于未同步状态,不能作为参考时钟5. Poll(8 bits): 轮询时间,即两个连续NTP报文之间的时间间隔6. Precision(8 bits): 系统时钟的精度 7. Root Delay(32 bits): 本地到主参考时钟源的往返时间 8. Root Dispersion(32 bits): 系统时钟相对于主参考时钟的最大误差 9. Reference Identifier(32 bits): 参考时钟源的标识 10. Reference Timestamp(64 bits): 系统时钟最后一次被设定或更新的时间 11. Originate Timestamp(64 bits): NTP请求报文离开发送端时发送端的本地时间  12. Receive Timestamp(64 bits): NTP请求报文到达接收端时接收端的本地时间 13. Transmit Timestamp(64 bits): 应答报文离开应答者时应答者的本地时间 14. Authenticator((optional)96 bits): 验证信息 

Relevant Link:

http://bjtime.cn/info/view.asp?id=270http://www.rfc-editor.org/rfc/rfc958.txthttp://wenku.baidu.com/view/4a7e73c308a1284ac85043a8.htmlhttp://wiki.wireshark.org/SampleCaptureshttp://qgjie456.blog.163.com/blog/static/354513672010821241599/http://www.cnblogs.com/TianFang/archive/2011/12/20/2294603.html

2. 控制报文

控制报文和时钟同步报文的区别仅仅在于"Mode"字段的区别,

1. 常规NTP时间同步报文模式1~5 2. NTP控制报文模式6,由ntpq使用3. NTP mode 7 (MODE_PRIVATE)由ntpdc查询和控制工具使用

对于控制报文来说,"Mode"字段的值为6

Relevant Link:

http://wiki.wireshark.org/NTPhttp://wiki.wireshark.org/SampleCaptures

 

3. 传输层

0x1: ICMP Internet控制报文协议

尽管对于ICMP协议属于网络层还是传输层有很多争议,但是从学习协议的严谨性上来说,ICMP应该算是传输层协议,因为ICMP数据报需要被包装在IP数据报的数据部分进行发送,所以ICMP也应该算是IP协议的一个上层协议。

ICMP属于传输层协议。ICMP 的正式规范参见RFC 792 [Posterl 1981b]

和其他大多数协议一样,ICMP有很多种数据报类型,它们的协议格式也不尽相同,我们按照类型的大分类来逐一学习

在ICMP数据报中,头部的类型(8bit)、和代码(8bit)字段决定了这个ICMP数据报的准确类型。类型和代码各占8bit,先决定类型,然后看代码,它们共同决定了这个ICMP数据报的类型

Destination Unreachable Message(目的不可达)

1. 类型类型码为32. 代码    1) 0: 网络不可达    2) 1: 主机不可达    3) 2: 协议不可达    4) 3: 端口不可达    5) 4: 需要进行分片但设置了不分片bit    6) 5: 源站路由失败    7) 6: 目的网络不认识    8) 7: 目的主机不认识    9) 8: 源主机被隔离(作废不用)    10) 9: 目的网络被强制禁止    11) 10: 目的主机被强制禁止    12) 11: 由于服务类型TOS,网络不可达    13) 12: 由于服务类型TOS,主机不可达    14) 13: 由于过滤,通信被强制禁止    15) 14: 主机越权    16) 15: 优先权中止生效3. 校验和4. 4字节的unused字段,置零5. 原始IP数据报的头部+64bit的数据部分
当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节(64bit)。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的
协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来

Time Exceeded Message(超时)

1. 类型类型码为112. 代码    1) 0: 传输期间生存期为0    2) 1: 在数据报组装期间生存期为03. 校验和4. 4字节的unused字段,置零5. 原始IP数据报的头部+64bit的数据部分当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节(64bit)。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的
协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来

Parameter Problem Message(参数错误)

1. 类型类型码为122. 代码    1) 0: 错误信息的指针3. 校验和4. 4字节的unused字段,置零5. 原始IP数据报的头部+64bit的数据部分当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节(64bit)。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的
协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来

Source Quench Message(源站被抑制)

1. 类型类型码为42. 代码    1) 0: 源站被抑制3. 校验和4. 4字节的unused字段,置零5. 原始IP数据报的头部+64bit的数据部分当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节(64bit)。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的
协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来

Redirect Message(重定向)

1. 类型类型码为52. 代码    1) 0: 对网络重定向    2) 1: 对主机重定向    3) 2: 对服务类型和网络重定向    4) 3: 对服务类型和主机重定向3. 校验和4. Gateway Internet Address 指明重定向后的IP地址5. 原始IP数据报的头部+64bit的数据部分当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节(64bit)。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的
协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来

对于ICMP Redirect重定向数据报,我们需要注意的,攻击者可以针对指定主机或者路由器发送ICMP Redirect数据报,来强制更新目标主机或路由器的"网关设置",从而劫持目标主机的原始流量。

http://insecure.org/sploits/arp.games.html

Echo or Echo Reply Message(ping)

1. 类型    1) 0: 回显应答    2) 8: 回显请求2. 代码03. 校验和5. Identifier、Sequence Number   发送方用它们对每次的echo和reply进行匹配6. 数据

Timestamp or Timestamp Reply Message(ICMP时间戳请求与应答)

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)

1. 类型    1) 13: 发送时间戳    2) 14: 返回时间戳2. 代码03. 校验和5. Identifier、Sequence Number   发送方用它们对每次的echo和reply进行匹配6. Originate Timestamp请求端填写发起时间戳,然后发送报文7. Receive Timestamp应答系统收到请求报文时填写接收时间戳8. Transmit Timestamp    在发送应答时填写发送时间戳

 

4. 网络层

本章节介绍网络层的各种协议、以及格式规范。

(这里给一张网络层总体架构图,尽量包含完整的网络层协议)

0x1: IP 网际协议

IP是TCP/IP协议族中最为核心的协议。RFC 791[Postel 1981a]是IP的正式规范文件: http://www.rfc-editor.org/rfc/rfc791.txt

1. 版本(4bit)    1) 版本号4: IPv4    2) 版本号6: IPv62. 首部长度(4bit)首部占32bit(4字节)字的数目(所以首部长度为这个字段值*4),包括任何选项。普通IP数据报(没有任何选择项)字段的值是5(20字节)3. 服务类型(TOS)(8bit)    1) 优先权子字段(3bit): 现在已被忽略    2) TOS子字段(4bit)        2.1)  Bit 0: 最小时延        2.2)  Bit 1: 最大吞吐量        2.3)  Bit 2: 最高可靠性        2.4)  Bit 3: 最小费用    3) 未用置0字段(1bit)在单个IP数据报中,TOS子字段4bit中只能置其中1 bit。如果所有4bit均为0,那么就意味着是一般服务。RFC 1340、RFC 1349详细地描述了TOS的特性:    1) Domain Name Service        1.1) UDP Query: 1000: 最小时延        1.2) TCP Query: 0000: 一般服务        1.3) Zone Transfer: 0100: 最大吞吐量         2) NNTP: 0001: 最小费用    3) ICMP        3.1) Errors: 0000: 一般服务        3.2) Requests: 0000: 一般服务          3.3) Responses: 0000: 一般服务      4) Any IGP: 0010: 最高可靠性     5) EGP: 0000: 一般服务      6) TELNET: 1000: 最小时延    Telnet要求最小的传输时延,因为人们主要用它们来传输少量的交互数据    7) FTP         7.1) Control: 1000: 最小时延        7.2) Data: 0100: 最大吞吐量     FTP文件传输则要求有最大的吞吐量        8) TFTP: 0100: 最大吞吐量     9) SMTP         9.1) Command phase: 1000: 最小时延        9.2) DATA phase: 0100: 最大吞吐量      10) BOOTP: 0000: 一般服务 对于IP数据报中的TOS字段,我们需要明白的是: 现在大多数的TCP/IP实现都不支持TOS特性,但是在很多Unix系统上对它提供了设置。另外,路由协议如OSPF和IS-IS都能根据这些字段的值进
行路由决策。所以,研究TOS还是很有现实意义的
4. 总长度(16bit)总长度字段是指整个IP数据报的长度(以字节为单位)。利用总长度字段-首部长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65535
字节。当数据报被分片时,该字段的值也随着变化(关于数据报分片,我们之后会详细学习)总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网的最小帧长为46字节,但是I P数据可能会更短(IP的头部只有20字节,数据部
分可以为0)。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容,有多少是padding的内容
5. 标识(16bit)标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。在分片和重组时会使用到6. 标志(3bit) 1) Bit 0: 保留,必须置为0 2) Bit 1: 2.1) 0: 可以分组 2.2) 1: 不可以分组 3) Bit 2: 3.1) 0: 已经是最后一个分组了 3.2) 1: 还有更多分组7. 片偏移(13bit)当前分片在完整数据报中的偏移8. 生存时间TTL(8bit)TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就
减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
9. 协议(8bit)该IP数据包携带的的上层协议,这个字段的作用为了实现"分用",所谓分用,即当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每
层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing)
10. 首部检验和(16bit)首部检验和字段是根据"IP首部"计算的检验和码(注意,只是首部),它不对首部后面的数据进行计算。为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数
据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果
应该为全1。如果结果不是全1(即检验和错误),那么I P就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传
11. 源IP地址(32bit)每一份IP数据报都包含源IP地址和目的I P地址,它们都是32 bit的值12. 目的IP地址(32bit)每一份IP数据报都包含源IP地址和目的I P地址,它们都是32 bit的值13. 选项OPTION选项数据报中的一个"可变长""可选信息"1) 安全和处理限制(用于军事领域,详细内容参见RFC 1108[Kent 1991]) 2) 记录路径(让每个路由器都记下它的IP地址) 3) 时间戳(让每个路由器都记下它的IP地址和时间) 4) 宽松的源站选路(loose source route)(为数据报指定一系列必须经过的IP地址) http://en.wikipedia.org/wiki/Loose_Source_Routing 5) 严格的源站选路(strict source route)(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)
   可以使用: loose: ping –j <hosts>、strict: ping –k <hosts>进行测试
14. Padding填充:选项字段一直都是以32 bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍(这是首部长度字段所要求的,因为它是以2为基底的)14. 数据IP数据包携带的上层数据

 

Copyright (c) 2014 LittleHann All rights reserved

 

 

TCP/IP Four Layer Protocol Format Learning(undone)