因特网协议(Internet Protocol, IP)是Internet的核心协议之一, 工作在网络层.IP协议提供节点间的寻址,路由以及顺序控制, 流量控制等服务.

IP协议分为IPv4和IPv6两个版本, 本文主要介绍目前被广泛应用的Ipv4协议.

路由器是网络层的重要设备, 它用于连接两个逻辑上独立的网络.在局域网的介绍中我讨论了使用交换机或集线器将多台主机连接起来的情况.两台交换机之间也可以连接, 但是连接到不同交换机的主机之间通信和连接到同一个交换机的两台主机之间的通信在逻辑上没有区别.

当使用路由器互联时情况就不同了.路由器A与路由器B互联, 路由器A上的主机试图与路由器B上的某台主机通信时, 路由器将拦截数据报并根据规则进行转发.

全球存在着各式各样的网络, 它们使用不同协议的硬件地址,要使这些异构网络能够使用硬件地址互相通信就必须进行非常复杂的硬件地址转换工作.

IP协议使用统一的IP地址标识网络和主机, 使得不同网路互联组成巨大的国际互联网.

IP的协议数据单元(PDU)称为数据报(packet), 一个 IP数据报由首部(header)和数据(data)两部分组成.

首部的前一部分是20bytes的固定首部, 其包含源IP地址, 目的IP地址等必须字段.首部的后半部分是长度可变的可选字段.

IP数据报的大小可能超过一个帧可能容纳的范围, 分片技术可以将IP数据报可以分成多个帧发送, 接收方根据数据报首部的信息重新进行排序.

IP协议的另一个重要功能是进行路由选择, 因为这一主题篇幅较长请移步路由协议一文

IP地址

IP地址是因特网为主机编址的方式, 由32位二进制码组成.

我们常见的是IP地址的点分十进制表示, 即8位二进制码变为一组转换为十进制数表示.

192.168.0.1 -> 11000000 10101000 00000000 00000001

8位二进制表示的最大整数为255, 所以点分十进制表示中每个数字的取值为[0,255]

IP地址由网络号和主机号两部分组成, 根据网络号和主机号所在的位不同IP地址可以分为5类.

每类地址都以一个特殊的序列开头, 用以识别地址的类型从而区分网络号和主机号.

类别 网络号 主机号 二进制标志 十进制范围
A类 前8位 后24位 0* 1.0.0.0 - 126.0.0.0
B类 前16位 后16位 10* 128.0.0.0-191.255.255.255
C类 前24位 后8位 110* 192.0.0.0 - 223.255.255.255
D类 - 多播地址 1110* -
E类 - 保留 1111* -

网络号有两个保留号码:

  • 全0: 表示本网络上的任意地址, 常用于表示默认地址等

  • 127: 环回测试, 用于本机进程之间的通信

主机号同样有两个保留号码:

  • 全0: 本主机所在网络上的任意地址

  • 全1: 广播地址, 表示网络中所有主机

特殊的IP地址:

  • 0.0.0.0代表任意的地址, 用来设置默认地址时使用

  • 127.0.0.1本地环回地址, 用于本机进程之间通信时使用

传统的分类IP地址使用不灵活, 无法应对局域网下拥有多个子网的情况, 且存在着地址空间的严重浪费.IPv4引入了子网概念试图改善这些问题.

IPv4的子网掩码(subnet mask)是一个32位的二进制序列, 子网掩码左侧为1右侧为0, 不存在0和1交叉的情况.

将子网掩码与IP地址进行位与运算, 即可得到IP地址的网络号.也就是说, "1"所在位对应的IP地址中的网络号部分, "0"对应主机号部分.

子网掩码也可以像IP地址一样采用点分十进制记法,更方便的是采用无类别域间路由(Classless Inter-Domain Routing, CIDR)表示法.

CIDR在IP地址后加上子网掩码中"1"的位数, 也即网络号位数:

192.168.1.1/24 => musk:255.255.255.0

从分类IP的角度来看, 它将IP地址的主机号分为了子网号和主机号两部分.

每个类别的IP地址有拥有默认的子网掩码, 默认的子网掩码表示没有划分子网,网络号位数与类别指定的相同.

类别 掩码 CIDR
A 255.0.0.0 8
B 255.255.0.0 16
A 255.255.255.0 24

再来看一下CIDR的全名"无类别域间路由", 所谓"无类别"是指子网掩码可以脱离分类IP定义的网络号和主机号独立指示网络号.

没有了分类IP的限制, 我们可以更充分的利用IP地址资源.传统的A类IP地址只有8位网络号和24位主机号(约1.6亿个), 但几乎不存在拥有这么多主机的网络.使用CIDR可以设置更常用首位为0(传统A类地址), 24位网络号8位主机号的IP地址.

在多层网络中, 每一层都可以独立设置子网掩码将主机号分为子网号和主机号两部分, 子网划分更加自由.

CIDR的另一个好处就是可以进行前缀路由聚合, 16个前20位都相同的"/24"网络可以聚合成一个"/20"网络, 即所谓超网降低了路由和广播的开销.

ARP协议

不管网络层使用的什么协议, 在传送数据帧时必须使用硬件地址(MAC地址).地址解析协议(Address Resolution Protocol, ARP)协议的功能就是通过主机IP地址来寻找对应的MAC地址.

每个主机都设有一个ARP高速缓存(ARP cache), 里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表.

当主机A欲向本局域网上的某个主机B发送IP数据报时, 就先在其ARP高速缓存中查看有无主机B的IP地址.如有, 就可查出其对应的硬件地址, 将MAC帧发往该硬件地址.

当找不到对应的MAC地址时, 主机A将会广播ARP请求帧(ARP request), 只有IP对应的主机B收到该帧时才会发出响应(ARP response).

当主机A试图向不在本局域网的主机发送IP数据报时, ARP请求返回的通常是出口路由器的MAC地址, 数据报由路由器转发.

实际上,现在办公室局域网中一般为多台主机直接和路由器连接, 不使用交换机.主机发出ARP请求得到总是得到路由器的MAC地址, 局域网内的数据报也都由路由器转发,这种功能成为ARP代理.

ICMP协议

互联网控制消息协议(Internet Control Message Protocol, ICMP)用于为主机和路由器提供有关差错控制报告的支持, 是网络层的重要协议.

ICMP报文作为数据段加上IP报头,作为IP数据报进行传输. 因为使用IP数据报进行传输, ICMP报文的交付不是可靠的.

ICMP报文分为ICMP差错报告报文和ICMP询问报文.ICMP报文前4个字节的字段是固定的: 类型, 代码和校验和.

ICMP差错报告报文拥有8个字节的固定字段, 其后装载了出错IP数据报的首部和数据的前8个字节.

ICMP差错控制报文可以报告错误包括:

  • 目标不可达: 如果在IP数据报的传送过程中, 路由器发现网络出现拥塞, 则路由器将向源主机发出“目标不可到达”的ICMP报文

  • 源点抑制(Source quench): 若路由器或目的主机缓冲资源耗尽或即将耗尽而必须丢弃数据报, 则每丢弃一个数据报就向源主机发送一个ICMP源抑制报文

  • TTL超时: 一个IP包从源节点出发时, 其TTL值被设定一个初始值, 经过一跳一跳的传输, 如果这个IP包的TTL降低到零, 路由器就会丢弃此包并发出"TTL超时"差错报告报文

  • 分片重组超时

  • 路由重定向(redirect): 当一台主机向自己的缺省网关发送一个需要转发的数据包时, 如果该网关路由器查找路由表发现有更好的路由, 就会向源主机发出“重定向”的ICMP报文

  • 参数错误

除了下列的例外情况外, 其它错误情况都将发送差错报告报文:

  • 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文.

  • 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文.

  • 对具有多播地址的数据报都不发送 ICMP 差错报告报文

  • 对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文

回送请求(echo)是最著名的ICMP询问报文之一, 它被程序ping(Packet InterNet Groper)所使用用于检测两主机之间是否联通.

除此之外ICMP询问报文还有时间戳请求, 掩码请求等.

组播与IGMP协议

前文提及了两种通信方式:

  • 单播(unicast): 端对端通信

  • 广播(broadcast): 一台主机对网络中所有主机发送消息

组播(multicast)又称多播是一台主机向一个多播组内所有主机发送数据报的通信方式.同一个多播组成员共享一个多播地址, 它们可以分布在不同的子网上.多播组成员是动态的, 一台主机可以随时加入或退出某个多播组.

多播消息在每条网络链路上只需传递一次, 而且只有在链路分叉的时候, 消息才会被复制.相对于多次单播多播极大节省了带宽资源, 又避免了广播无法向分布在多个网络中的特定主机发送消息的弊端.

多播地址使用D类IP地址224.0.0.0~239.255.255.255:

  • 局部链接多播地址: 224.0.0.0~224.0.0.255, 这是为路由协议和其它用途保留的地址, 路由器并不转发属于此范围的IP包;

  • 预留多播地址: 224.0.1.0~238.255.255.255, 可用于全球范围(如Internet)或网络协议;

  • 管理权限多播地址: 239.0.0.0~239.255.255.255, 可供组织内部使用, 类似于私有IP地址, 不能用于Internet, 可限制多播范围.

多播地址只能被用于目的地址, 不能被用作源地址.

因特网组管理协议(Internet Group Management Protocol, IGMP)是多播的管理协议, 相当于ICMP协议在单播中的作用.

目前常用的为IGMPv3协议, 在IGMPv1中主机可以加入多播组, 路由器使用定时器对组员取消预定.IGMPv2协议则允许多播组内的主机主动退出多播组.

这两个版本的协议都要求接收者必须加入多播组, 发送者不必加入多播组, 任何主机都可以向任意多播组发送信息.IGMPv3协议则允许接受者管理发送者, 仅接受特定发送者的消息或者屏蔽特定发送者.

IGMPv3协议定义了两种报文: 成员关系查询和成员关系报告.成员关系查询报文一般由多播路由器发送, 有3个子类型:

  • 一般查询: 查询与路由器相连的网络上有哪些组, 每个组在当前网络上有哪些成员

  • 指定组查询: 查询与路由器相连的网络上有哪些主机属于指定组

  • 指定组和源的查询: 查询与路由器相连的网络上有哪些主机属于指定组, 且允许接受指定源的信息

查询报文中字段包括:

  • 类型(Type)

  • 最长响应时间(MRT)

  • 校验和

  • 组地址

  • S标志

  • 查询者稳健型变量(QRV)

  • 查询者查询间隙码(QQIC)

  • 源地址

报告报文中包括字段:

  • 类型

  • 校验和

  • 组记录数量

  • 组记录

DHCP协议

动态主机配置协议(Dynamic Host Configuration Protocol, DHCP) 用于为局域网内的主机分配IP地址.DHCP协议用UDP协议通信, 服务器默认使用67端口, 客户端默认使用68端口.

DHCP有三种机制分配IP地址:

  • 自动分配方式(Automatic Allocation), DHCP服务器为主机指定一个永久性的IP地址, 一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后, 就可以永久性的使用该地址.

  • 动态分配方式(Dynamic Allocation), DHCP服务器给主机指定一个具有时间限制的IP地址, 时间到期或主机明确表示放弃该地址时, 该地址可以被其他主机使用.

  • 手工分配方式(Manual Allocation), 客户端的IP地址是由网络管理员指定的, DHCP服务器只是将指定的IP地址告诉客户端主机.

当DHCP客户端与服务器不在同一个子网上, 就必须有DHCP中继代理来转发DHCP请求和应答消息.

DHCP中继代理接收到DHCP消息后, 重新生成一个DHCP消息, 然后转发出去.在DHCP客户端看来, DHCP中继代理就像DHCP服务器;在DHCP服务器看来, DHCP中继代理就像DHCP客户端.

VPN

虚拟专用网络(Virtual Private Network, VPN)是一种在公网上加密数据报进行通信, 实现逻辑上的专用网络.

VPN常用的应用场景有:

  • 内联网: 部门A和B的私有网络在公司内网上建立虚拟专网连接

  • 外联网: 在两个地点的部门A和部门B通过VPN在公网上建立连接

  • 远程接入: 出差的员工使用在国际互联网上建立的VPN登录公司内网

VPN将内网数据报带首部加密, 加上新的公网数据报头组成新的数据报在公网传输.接收方接到公网去掉数据报首部, 取出原内网数据报在内网上传输.

NAT协议

网络地址转换(Network Address Translation, NAT)技术是在内网中使用内部地址通信, 在内部主机需要和外部主机通信时由网关(一般为出口路由器)将IP报头中的内部源地址转换为公网地址, 在收到外部IP数据报时则对目标地址进行相应转换.

NAT协议有3种实现:

  • 静态NAT(Static NAT): 内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址

  • 动态NAT(Pooled NAT): 在出现内部主机与外网建立TCP连接等需要时为其分配一个公网地址, 完成后回收地址

  • 端口转换(Network Address Port Translation, NAPT): 将多个内部设备映射到同一个公网IP地址的不同TCP或UDP端口上.

内部地址仅需要保证在内网中唯一, 也就是说在不同的网络中允许使用重复的内网地址.结合动态NAT或端口转换NAT机制允许较多主机共享较少的公网IP地址缓解了IP地址不足的问题.

NAT协议同时隐藏了内网的细节, 提高内网安全性.通过NAT路由器的通信必须由内网主机发起, 因此内网主机不能作为服务器, 因为因特网上的用户无法请求专用网内的服务器提供服务.

IP协议的更多相关文章

  1. 门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结

    门面模式的一个典型应用:Socket 套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息: 连接使用的 ...

  2. OSI七层模型详解 TCP/IP协议

      总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...

  3. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

  4. TCP/IP协议(一)网络基础知识

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  5. TCP/IP协议详解——邮差与邮局

    信号的传输总要符合一定的协议.比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了“敌人入侵”这一抽象信号.这样一个“狼烟=敌人入侵”就是一个简单的协议. 信号的传输总要符合一定的协议( ...

  6. TCP/IP协议三次握手与四次握手流程解析

    原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...

  7. 【原创】技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)

    1.前言 作为应用层开发人员,接触最多的网络协议通常都是传输层的TCP(与之同处一层的另一个重要协议是UDP协议),但对于IP协议,对于应用程序员来说更多的印象还是IP地址这个东西,再往深一点也就很难 ...

  8. TCP/IP协议

    1.为什么有了IP地址还需要MAC地址? 首先,数据或者信息在网络上的传输需要两个地址:目的地址和下一跳地址.其中IP地址就是目的地址,而MAC地址则是下一跳地址.目的地址在经过路由器转发的时候是不会 ...

  9. HTTP协议—— 简单认识TCP/IP协议

    大学没读计算机专业,所以很多的专业知识都不知道.既然已经从事了IT这个行业,就势必要去了解下网络底层,虽然实际工作中这些东西用不到.高楼大厦,起于平川.不积跬步,无以至千里,不积小流,无以成江海.我现 ...

  10. Http TCP/IP 协议的关系

    转自:http://www.cnblogs.com/ymy124/archive/2012/03/18/2404958.html 项目要求Web服务是高安全级别,在选择.net remoting,we ...

随机推荐

  1. C++ dll调用

    HINSTANCE PH=LoadLibrary(_T("APlayerCaller.dll")); HWND hwnd = AfxGetMainWnd()->m_hWnd; ...

  2. Android菜鸟成长记3-activity类

    Activity 一.什么是activity Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能.它是 android 应用程序的基本功能单元.Activity 本身是没有界面 ...

  3. A 浪哥的烦恼 完全背包dp

    https://biancheng.love/contest-ng/index.html#/131/problems 首先,去到n点的最小时间是所有数加起来. 然后,如果我1 --- 2,然后再2-- ...

  4. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    [Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...

  5. SQL性能优化(Oracle)

    首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录, ...

  6. HttpURLConnection请求网络数据

    //使用线程 new Thread(){            public void run() {                try {                    //先创建出了一 ...

  7. Scrum Meeting (Oct. 27 2014)

    软件工程是一门十分有意思的课程,它不仅锻炼了我们开发软件的能力,更是给了我们结队作业的机会,在团队协作中,我们学会了欣赏别人,学会了品鉴自己,学会了如何集思广益凝聚成一个锐意进取的集体.继单人单词查询 ...

  8. 关于Plupload结合上传插件jquery.plupload.queue的使用

    之前使用过很多的上传组件,但对各种浏览器的兼容性太差,不得不放弃!! plupload 是款很强大的上传组件,不得不推荐.plupload 前端根据浏览器不同选择使用Html5. Gears, Sil ...

  9. spring 源码下载地址

    1, github: https://github.com/spring-projects/spring-framework SVN: https://github.com/spring-projec ...

  10. javascript 常用方法

    1. 判断某个object中是否包含某个属性: params.hasOwnProperty($scope.dataObj[i].alias) //true 包含 2.删除object中指定属性 del ...