《Linux高性能服务器编程》——2.2 IPv4头部结构-阿里云开发者社区

开发者社区> 华章计算机> 正文

《Linux高性能服务器编程》——2.2 IPv4头部结构

简介: 本节书摘来自华章计算机《Linux高性能服务器编程》一书中的第2章,第2.2节,作者 游双,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
+关注继续查看

2.2 IPv4头部结构

2.2.1 IPv4头部结构

IPv4的头部结构如图2-1所示。其长度通常为20字节,除非含有可变长的选项部分。

image

4位版本号(version)指定IP协议的版本。对IPv4来说,其值是4。其他IPv4协议的扩展版本(如SIP协议和PIP协议),则具有不同的版本号(它们的头部结构也和图2-1不同)。

4位头部长度(header length)标识该IP头部有多少个32?bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。

8位服务类型(Type Of Service,TOS)包括一个3位的优先权字段(现在已经被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登录程序需要的是最小延时的服务,而文件传输程序ftp则需要最大吞吐量的服务。

16位总长度(total length)是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65?535(216-1)字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。接下来的3个字段则描述了如何实现分片。

16位标识(identification)唯一地标识主机发送的每一个数据报。其初始值由系统随机生成;每发送一个数据报,其值就加1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。

3位标志字段的第一位保留。第二位(Don’t Fragment,DF)表示“禁止分片”。如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模块将丢弃该数据报并返回一个ICMP差错报文。第三位(More Fragment,MF)表示“更多分片”。除了数据报的最后一个分片外,其他分片都要把它置1。

13位分片偏移(fragmentation offset)是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值)。

8位生存时间(Time To Live,TTL)是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。

8位协议(protocol)用来区分上层协议,我们在第1章讨论过。/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。其中,ICMP是1,TCP是6,UDP是17。/etc/protocols文件是RFC 1700的一个子集。

16位头部校验和(header checksum)由发送端填充,接收端对其使用CRC算法以检验IP数据报头部(注意,仅检验头部)在传输过程中是否损坏。

32位的源端IP地址和目的端IP地址用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。关于这一点,我们将在第4章进一步讨论。

IPv4最后一个选项字段(option)是可变长的可选信息。这部分最多包含40字节,因为IP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。可用的IP选项包括:

image
image

关于IP头部选项字段更详细的信息,请参考IP协议的标准文档RFC 791。不过这些选项字段很少被使用,使用松散源路由选择和严格源路由选择选项的例子大概仅有traceroute程序。此外,作为记录路由IP选项的替代品,traceroute程序使用UDP报文和ICMP报文实现了更可靠的记录路由功能,详情请参考文档RFC 1393。

2.2.2 使用tcpdump观察IPv4头部结构

为了深入理解IPv4头部中每个字段的含义,我们从测试机器ernest-laptop上执行telnet命令登录本机,并用tcpdump抓取这个过程中telnet客户端程序和telnet服务器程序之间交换的数据包。具体的操作过程如下:

$ sudo tcpdump -ntx -i lo            #抓取本地回路上的数据包
$ telnet 127.0.0.1            #开启另一个终端执行telnet命令登录本机
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Ubuntu 9.10
ernest-laptop login: ernest        #输入用户名并回车
Password:                    #输入密码并回车

此时观察tcpdump输出的第一个数据包,其内容如代码清单2-1所示。

image

该数据包描述的是一个IP数据报。由于我们是使用telnet登录本机的,所以IP数据报的源端IP地址和目的端IP地址都是“127.0.0.1”。telnet服务器程序使用的端口号是23(参见/etc/services文件),而telnet客户端程序使用临时端口号41621与服务器通信。关于临时端口号,我们将在第3章讨论。“Flags”、“seq”、“win”和“options”描述的都是TCP头部信息,这也将在第3章讨论。“length”指出该IP数据报所携带的应用程序数据的长度。

这次抓包我们开启了tcpdump的-x选项,使之输出数据包的二进制码。此数据包共包含60字节,其中前20字节是IP头部,后40字节是TCP头部,不包含应用程序数据(length值为0)。现在我们分析IP头部的每个字节,如表2-1所示。

image

由表2-1可见,telnet服务选择使用具有最小延时的服务,并且默认使用的传输层协议是TCP协议(回顾第1章讨论的分用)。这些都符合我们通常的理解。这个IP数据报没有被分片,因为它没有携带任何应用程序数据。接下来我们将抓取并讨论被分片的IP数据报。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
因云而生 阿里云发布云服务器操作系统Alinux3:性能最高提升40%
阿里云正式推出第三代云服务器操作系统Alibaba Cloud Linux 3(以下简称Alinux3),基于“因云而生”的云原生技术理念,Alinux3进一步提升了云上客户的安全性、稳定性和运行时性能,并深度融合自研软件生态,全面兼容 RHEL/CentOS 8生态,优化后主流应用性能提升10%~40%;同时提供长达8年的免费软件维护和技术支持,保障开发者最佳云上操作体验。
3447 0
使用WCF实现SOA面向服务编程—— 架构设计
本文转载:http://kb.cnblogs.com/page/96479/  SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就是一种进行系统开发的新的体系架构,在基于SOA架构的系统中,具体应用程序的功 能是由 一些松耦合并且具有统一接口定义方式的组件(也就是service)组合构建起来的。
735 0
《高性能Linux服务器构建实战》——1.4节Nginx的安装与配置
本节书摘来自华章社区《高性能Linux服务器构建实战》一书中的第1章,第1.4节Nginx的安装与配置,作者:高俊峰,更多章节内容可以访问云栖社区“华章社区”公众号查看
1524 0
“.NET技术”使用WCF实现SOA面向服务编程—— 架构设计
  SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就是一种进行系统开发的新的体系架构,在基于SOA架构的系统中,具体应用程序的功能是由 一些松耦合并且具有统一接口定义方式的组件(也就是service)组合构建起来的。
718 0
Java性能优化之编程技巧总结
1、慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性能而言是非常糟糕的。
862 0
使用W“.NET技术”CF实现SOA面向服务编程——简单的WCF开发实例
  前面为大家介绍过WCF的特点,现在再讲解一下WCF基础概念。   在WCF里,各个Application之间的通信是由EndPoint来实现的,EndPoint是WCF实现通信的核心要素。一个WCF Service可由多个EndPoint集合组成,每个EndPoint只能有一种绑定,就是说EndPoint就是通信的入口,客户端和服务端通过 EndPoint交换信息。
690 0
使用WCF实现SOA面向服务编程——使用AJAX+WCF服务“.NET技术”页面开发
  在上一篇讲到,如果将BLL层的每一个类都转化为*.svc,这是一个不实在的想法。它会使服务变化复杂,难于管理。   这时候,我们第一时间想到的是23个简单开发模式中的Factory,在这里,Factory正好派上用场。
869 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载