Linux 高性能服务器编程——IP协议详解
2 IPV4头部结构

- 4位版本号:指定IP协议的版本,值为4。
- 4位头部长度:标识该IP头部有多少个32bit(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。
- 8位服务类型(TOS):包括3位优先权字段(现在已经被忽略),4位TOS字段(只有一位能置1,分别表示最小延迟、最大吞吐量、最高可靠性、最小费用),和1位保留字段(必须置0)。
- 16位总长度:指整个IP数据报的长度,以字节为单位,因此IP数据包的最大长度为65535字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。
- 16位标识:唯一地标识主机发送的每一个数据报。其初始值由系统随机生成;每发送一个数据报,其值就加1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。
- 3位标志字段:第一位保留,第二位"禁止分片",如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模块将丢弃数据报并返回一个ICMP差错报文。第三位"更多分片",除了数据包的最后一个分片外,其他分片都要把它置1。
- 13位分片偏移:分片相对原始IP数据报开始处的偏移。实际的偏移值是该值左移3位(乘8)后得到的,由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍。
- 8位生存时间(TTL):是数据报到达目的地之前允许经过的路由器跳数。发送端设置,经过一个路由器,该值就被减一,减为0则丢弃,返回一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
- 8位协议:用来区分上层协议。/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。其中 ICMP:1;TCP:6;UDP:17。
- 16位头部检验和:发送端填充,接收端对其使用CRC算法以检验IP数据报头部在传输过程中是否损坏。
- 32位源端IP地址和目的端IP地址:标识数据报的发送端和接收端。
- 可选字段:最长40字节,因此IP头部最长是60字节。可用的IP选项包括:记录路由、时间戳、松散源路由选择、严格源路由选择。

十六机制数 | 十进制表示 | IP头部信息 |
0x4 | 4 | IP版本号 |
0x5 | 5 | 头部长度为5个4字节,即20字节 |
0x10 | TOS字段分别为1000,表示最小延迟开启 | |
0x003c | 60 | IP数据报总长度为60 |
0xa5d5 | 数据报的唯一标识 | |
0x4 | 禁止分片 | |
0x000 | 分片位移 | |
0x40 | 64 | 生存时间为64跳 |
0x06 | 6 | 协议类型:TCP协议 |
0x96cf | 头部校验和 | |
0x7f000001 | 两个:分别表示源主机地址和目的主机地址 |
这个报是使用telnet远程登陆时抓去的,由此可见,telnet使用的是最小延时服务,默认使用传输层协议是TCP协议。IP数据报没有分片,因为没有携带任何应用程序数据。


- IP模块接收到来自数据链路层的IP数据报
- 对数据报头部做CRC校验
- 查看是否是发给本机
- 如果是发给本机则转交给上层应用
- 如果不是则转交给"数据报转发子模块"
- 如果不允许转发,则丢弃;允许转发则一些操作后交给"IP数据报输出子模块"
- 更新路由表,"计算下一跳路由"子模块计算下一跳路由
- 交给IP输出队列
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 1 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

字段 | 含义 |
Destination | 目标网络或主机 |
Gateway | 网关地址,*表示目标和本机在同一个网络,不需要路由 |
Genmask | 网络掩码 |
Flags | 路由项状态标志: U: 活动的 H:目标是一台主机 G:目标是网关 D:重定向生成的 M:重定向修改过 |
Metric | 路由距离,即达到指定网络所需的中转数 |
Ref | 路由项被引用的次数 |
Use | 被使用的次数 |
Iface | 该路由项对应的输出网卡接口 |
- 查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没有找到则转步骤2。
- 查找路由表中和数据报的目标IP地址具有相同网络ID的网络IP地址,如果找到,则使用该路由项,没有找到则转步骤3。
- 选择默认路由项,这通常意味着数据报的下一跳路由是网关。
#echo 1 > /proc/sys/net/ipv4/ip_forward
- 检查数据报头部的TTL值,如果TTL值已经是0,则丢弃该数据报。
- 查看数据报头部的严格源路由选择项。如果该选项被设置,则检测数据报的目标IP地址是否是本机的某个IP地址,如果不是,则发送一个ICMP源站选路失败报文给发送端。
- 如果有必要,则给源端发送一个ICMP重定向报文,以告诉它一个更合理的下一跳路由器。
- 将TTL值减1。
- 处理IP头部选项。
- 如果有必要,则执行IP分片操作。


Linux 高性能服务器编程——IP协议详解的更多相关文章
- Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
- linux高性能服务器编程 (二) --IP协议详解
第二章 IP协议详解 什么是IP协议:IP 协议是TCP/IP协议族的动力,它为上层提供了无状态.无连接.不可靠的服务. IP 头部信息:头部信息会出现在每一个IP数据报上,便于记录IP通信的源端IP ...
- linux高性能服务器编程 (三) --TCP协议详解
第三章 IP协议详解 TCP协议是TCP/IP协议族中的另外一个重要的协议,与IP协议相比,TCP协议更高进应用层.一些重要的socket选项都和TCP协议相关.这一章主要从如下方面学习: 1)TCP ...
- Linux 高性能服务器编程——TCP/IP协议族
1 TCP/IP协议族体系结构 数据链路层: 职责:实现网卡接口的网络驱动程序,一处理数据在物理媒介(如以太网.令牌环等)上的传输. 常用协议:ARP协议(地址解析协议),RARP协议 ...
- 服务器编程入门(2)IP协议详解
问题聚焦: IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一.这里从两个方面较为深入地探讨IP协议: 1,IP头部信息(指定IP通信的源端IP地址,目的端IP ...
- linux高性能服务器编程 (一) --Tcp/Ip协议族
前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...
- linux高性能服务器编程
<Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...
- 第二章 IP协议详解
第二章 IP协议详解 2.1 IP服务的特点 它为上层协议提供了无状态,无连接,不可靠的服务 名称 简介 优点 缺点 对付缺点的方法 无状态 IP通信双方不同步传输数据的状态信息 无须为保持通信的状态 ...
- 【转载】TCP /IP协议详解
首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...
随机推荐
- [ABP]浅谈工作单元 在整个 ABP 框架当中的应用
ABP在其内部实现了工作单元模式,统一地进行事务与连接管理. 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of ...
- python2.7-巡风源码阅读
推荐个脚本示例网站:https://www.programcreek.com/python/example/404/thread.start_new_thread,里面可以搜索函数在代码中的写法,只有 ...
- [BZOJ 4361]isn
Description 题库链接 给出一个长度为 \(n\) 的序列 \(A\) .如果序列 \(A\) 不是非降的,你必须从中删去一个数,这一操作,直到 \(A\) 非降为止.求有多少种不同的操作方 ...
- bzoj 5248: [2018多省省队联测]一双木棋
Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...
- bzoj 3751: [NOIP2014]解方程
Description 已知多项式方程: a0+a1x+a2x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). 解题报告: 这题比较诡,看到高精度做不了,就要想到 ...
- 【SDOI2009】学校食堂
Description 小F的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用 ...
- [BZOJ]3243 向量内积(Noi2013)
小C做了之后很有感觉的题目之一,但因为姿势不对调了很久. Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即 ...
- bzoj1877
1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2660 Solved: 1424[Submit][Status][ ...
- MQ(消息队列)常见的应用场景解析
前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...
- Python中的条件和循环语句
条件和循环语句 1. 条件语句 if单用 格式:if 条件表达式 例如:if 5 > 3: print('True') >>> 'True' #当条件满足时才会执行上述操作. ...