相关学习资料
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的版本号,目前的最新版本为3 3. 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=270 http://www.rfc-editor.org/rfc/rfc958.txt http://wenku.baidu.com/view/4a7e73c308a1284ac85043a8.html http://wiki.wireshark.org/SampleCaptures http://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/NTP http://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. 类型 类型码为3 2. 代码 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. 类型 类型码为11 2. 代码 1) 0: 传输期间生存期为0 2) 1: 在数据报组装期间生存期为0 3. 校验和 4. 4字节的unused字段,置零 5. 原始IP数据报的头部+64bit的数据部分 当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节(64bit)。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来
Parameter Problem Message(参数错误)
1. 类型 类型码为12 2. 代码 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. 类型 类型码为4 2. 代码 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. 类型 类型码为5 2. 代码 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. 代码 0 3. 校验和 5. Identifier、Sequence Number 发送方用它们对每次的echo和reply进行匹配 6. 数据
Timestamp or Timestamp Reply Message(ICMP时间戳请求与应答)
ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)
1. 类型 1) 13: 发送时间戳 2) 14: 返回时间戳 2. 代码 0 3. 校验和 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: IPv6 2. 首部长度(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