TCP/IP学习笔记(三)——IP,ARP,RARP

参考文献:

* 《TCP/IP详解 卷一:协议》;

1. IP网际协议

1.1 特点:

不可靠:不能保证IP数据报能成功到达目的地;

无连接:不维护任何关于后续数据报状态信息,即没有握手的环节,比如UDP也是无连接的;

1.2 IP首部

普通IPv4首部长度20字节(除非含有选项字段);

网络字节序:Big-endian;

服务类性(TOS):共8位,实际有效位4bit,最小时延,最大吞吐量,最高可靠性,最小费用;

不同的协议有不同的要求:Telnet和Rlogin用于少量交互数据要求最小传输时延;FTP要求最大吞吐量;SNMP(网络管理)和路由选择协议要求最高可靠性;

总长度:共16位,因此IP数据报最长65535,注意大多数链路层会对它进行分片,主机并不要求接收超过576字节的数据报;使用UDP的应用(RIP,TFTP,BOOTP,DNS,SNMP)限制用户数据报长度为512字节。但是事实上大多数的实现允许超过8192字节的数据报;总长度很重要,因为一些数据链路需要填充以达到最小长度;

标识字段:每发一份报文它的值就会加1,用于分片和重组;

片偏移字段:用于分片和重组;

TTL(time-to-live):8位,设置了数据报可以经过的最多路由器数,初始值由源主机设置(通常为32或64),经过一个处理它的路由器,减1,为0时就被丢弃,并发送ICMP通知源主机。

校验和

IP校验和(ICMP,IGMP,UDP,TCP算法相同)的计算方法。

发送方:

(1)首先把检验和字段置为0;

(2)首部每16bit进行二进制反码求和;

(3)结果保存到检验和字段中;

接收方:

(1)首部每16bit进行二进制反码求和,包括校验和;

(2)如果首部没有差错,计算结果应该全为1,否则丢弃由上层发现丢失数据报进行重传;

固定位数的二进制数和自己的反码相加,当然全为1了。

路由器经常只修改TTL字段,因此转发时增加校验和即可。

任选项:可变长的可选信息,包括安全和处理限制,记录路径时间戳等等;

1.3 IP路由选择

大多数主机采用的简单路由机制:如果目的主机与源主机在同一个共享网络中,那么IP数据报直接送到目的主机,否则,主机把数据报发往一默认的路由器上,由路由器转发该数据报。

路由表

路由表条目格式:

(1)目的IP地址:可以是完整主机地址或者网络地址,网络地址指定网络中所有的主机;

(2)next-hop router的ip地址;

(3)标志:

一个标志指明目的IP地址是网络地址还是主机地址;

另一个标志指明下一站路由器是否为真正的下一站路由器还是一个直接相连的接口;

(4)为数据报传输指定一个网络接口;

IP路由的选择的搜索顺序

(1)寻找能与目的IP地址完全匹配的表目;

(2)寻找能与目的网络号想匹配的表目;

(3)寻找“默认表目”;

(4)上述都为找到,不发送,返回主机不可达或者网络不可达;

在(1)或(2)不成功的时,使用“默认”表目;

为一个网络指定一个路由器,而不必为每个主机指定一个路由器,可以极大地缩小路由表的规模;

1.4 IP子网寻址

原因是A类,B类网络下主机数目太大,需要进行进一步划分,当然C类网络也可以划分。

子网编址:把主机号再分成一个子网号和一个主机号。

划分子网的作用

(1)对外隐藏了内部网络组织(对内显然需要进一步的路由);

(2)缩小Internet路由表的规模;

1.5 子网掩码

由于确定IP地址中的网络号和主机号;

1.6 特殊的IP地址

(1)0.0.0.0:可以为源端,表示所有不清楚的主机和目的网络;

(2)127.xxx.xxx.xxx:回环地址;

(3)网络号+全1主机号或者网络号+子网号+全1主机号:以网络/子网为目的的广播地址;

(4)255.255.255.255:限制广播地址,这个地址不能被路由器转发;

主机可以同时存在与多个子网,因此可能会有多个ip地址及其子网掩码。

1.7 命令

ifconfig命令

查看,配置,启用或禁用网络接口。

语法:

ifconfig [网络设备][down up -allmulti -arp -promisc][add<地址>][del<地址>]等等;

使用:

ifconfig -a:显示全部接口信息;

ifconfig eth0:显示eth0接口网卡信息;

ifconfig down eth0:关闭eth0网卡;

ifconfig up eth0:开启eth0网卡;

ifconfig eth0 add 33ffe:3240:800:1005::2/ 64:为eth0网卡添加IPV6地址;

ifconfig eth0 192.168.1.56:给eth0网卡配置ip地址;

等等;

参考:ifconfig命令

netstat命令

显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组;

用法:

netstat -a | more:列出所有端口;

netstat -at:列出所有TCP所有端口;

netstat -au:UDP;

netstat -r:显示核心路由信息;

netstat -i:列出所有网络接口;

参考:netstat命令

2. ARP

ARP为IP地址到对应的硬件地址之间提供动态映射。动态指的是这个过程是自动完成的,程序用户和系统管理员不必关心。

我的几个问题:

* ARP的解析的过程;

* APR得到IP地址对应硬件地址后交给谁了,怎么保存,更新;

2.1 ARP的基本概念

  1. 网络接口有一个硬件地址(比如48bit的硬件地址,标识不同的以太网或令牌环网络接口),硬件层次通信必须要有正确的接口地址;
  2. TCP/IP有自己的地址,32bit的IP地址,只知道IP地址不能让内核发送一帧数据主机;
  3. ARP的功能就在于两者之间的动态映射;
  4. 点对点链路不使用ARP,因为在设置链路时必须告知内核另一端的IP地址,不存在以太网那样的硬件地址;

2.2 ARP的基本过程

以一个FTP请求过程为例:

ftp bsdi

ftp是应用层协议,bsdi是主机名,按照计算机网络的层次,自定向下的解释这个过程:

1. 主机名到IP地址:DNS;

2. 用得到IP地址建立TCP连接:TCP;

3. TCP发送IP数据报给远端主机:两种情况,位于同一本地网络(直接送到目的主机)/远程网络(IP选路函数确定下一站路由),注意两种情况都是将IP数据报发送到本地网络上的主机或者路由器;

这时,如果发送端不知道(缓存中没有)对方的硬件地址,这个IP数据报的发送行为就将触发ARP的过程。我们已经知道了要将数据发送到网络层的哪个地方了(IP以及IP路由)。但是数据链路层要求知道目的地的硬件地址,这时开始ARP的过程(以太网为例):

  1. 广播发送ARP请求(这是一个以太网数据数据帧),要求该网络主机返回自己的IP地址。
  2. 目的主机的ARP层,返回APR应答(包含IP地址及对应的硬件地址);
  3. 收到ARP应答,之前那个IP数据可以发送了;

2.3 ARP的存储和格式

ARP高速缓存

和DNS类似,ARP的作用也在于映射,实际上就是一个key是IP地址的map。和DNS的不同层次有自己的缓存以及TTL一样,每个主机有自己的ARP高速缓存,生存时间一般为20分钟

arp命令查询到缓存项

Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.43.1             ether   0c:1d:af:d6:ab:bb   C                     wlan0

分组格式

从ARP的ARP的分组格式,我们可以看出:

* ARP可以用于不同类型的网络(除IP协议意外的地址也可以解析);

* ARP可以用于不同硬件类型的网络,不限于以太网;

* 分组包含一个操作字段,它的值表示不同的ARP操作类型:1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答;

2.4 ARP试验

环境:基于学校内网,Ubuntu 15;

需要的命令:

* 抓包:tcpdump,参数:过滤(比如tcp,arp),-e(查看链路层头部信息),-i(指定接口);

* ifconfig,查看自己的hw地址和ip地址;

* 请求,telnet,触发arp过程;

* arp:查看arp高速缓存;

试验一:一般的例子:请求同一本地网络的主机

(1)ifconfig 查看自己的ip地址:

得到一个私有地址以及子网掩码:

inet addr:172.28.185.203  Bcast:172.28.191.255  Mask:255.255.192.0

并且可以看到由于我当前使用的无线网,网络接口为:wlan0;

(2)查看已有的ARP缓存:

arp -a
? (172.28.128.1) at ac:85:3d:b2:c0:b4 [ether] on wlan0

这是所在子网的路由器的地址;

(3)请求一个同网络的主机地址,IP:172.28.185.203,同时使用抓包程序查看

tcpdump arp -e -i wlan0

查看wlan0上arp请求和应答;

telnet 172.28.185.136
Trying 172.28.185.136...

当然,这里不一定能连上,对方不一定开启了telnet,但是还是可以触发ARP请求的,tcpdump返回如下:

listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:11:37.230876 9c:4e:36:c6:e8:88 (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 172.28.185.136 tell 172.28.185.203, length 28
15:11:37.278147 ac:85:3d:b2:c0:b4 (oui Unknown) > 9c:4e:36:c6:e8:88 (oui Unknown), ethertype ARP (0x0806), length 56: Reply 172.28.185.136 is-at ac:85:3d:b2:c0:b4 (oui Unknown), length 42

2.5 ARP代理

ARP代理:若ARP请求是发向另一个网络的,连接这两个网络的路由器可以回答这个请求。

ARP代理(一般是路由器)知道要将IP数据报转发到子网中的那个主机(在这个子网中再进行必要的ARP)

子网划分的好处在网络层中我们有说过有:(1)隐藏内部的网络组织结构;(2)减小路由表的大小。

我觉得这种逐跳的方式类似于设计模式中的组合模式或者职责链模式,减少了耦合(路由表的大小减少了)。同样对于ARP层也有类似的作用,不用向主机数量庞大的网络广播ARP请求,同时可以隐藏物理网络的细节。

2.6 免费ARP

主机发送ARP查找自己的IP地址。

作用:

1. 确定是否有其他主机设置了相同的IP地址;

2. 发送免费ARP的主机如果更改了IP地址(更换了网卡等),其他收到广播的主机可以用新的发送者IP和硬件地址的映射更新自己的ARP高速缓存(如果存在的话)。

2.7 ARP命令

重要参数:

arp -a:显示高速缓存的所有内容;

arp -n:显示点分十进制IP而不是主机名;

arp -s:手动添加高速缓存项,这个被添加项是默认没有超时间的,除非在结尾添加上temp;

3. RARP:逆地址解析协议

无盘机,X终端或无盘工作站,获得自IP的过程。具有本地磁盘的主机在系统引导是从磁盘上的配置文件中读取IP地址。

请求是链路层广播,应答是单播。

3.1 RARP分组格式

分组格式和ARP基本一直,不同的是帧类型是0x8035,并且操作代码是3和4;

3.2 RARP的一些特点

  1. 带阈值的递增超时时间方法:RARP可以进行重发,超时间是递增的,但是当到达某个阈值时会减小;
  2. RARP服务器是用户进程:因为RARP服务器需要读取磁盘配置文件(内核进程一般不干这事);
  3. 每个网络上有多个RARP服务器:防止一台关机,无盘系统一般采用最先收到的RARP应答;
  4. RARP的实现是和系统相关的;

问题

  1. 如何处理多个RARP服务器的响应冲突?

    答:(1)服务器在发送响应之前可以设置一个随机延迟时间;

    (2)设置主RARP;

时间: 2024-12-24 01:44:39

TCP/IP学习笔记(三)——IP,ARP,RARP的相关文章

CCNA学习笔记五——ip地址子网划分

ip地址作用:用来标识一个节点的网络地址 ip地址的分类: A类:0NNNNNNN(1-126)  私有地址:10.0.0.0-10.255.255.255 B类:10NNNNNN(128-191)  私有地址:172.16.0.0-172.31.255.255 C类:110NNNNN(192-223)  私有地址:192.168.0.0-192.168.255.255 D类:1110NNNN(224-239) 子网掩码中1对应的为ip地址位为网络位,0对应的为主机位 划分子网:通过将子网掩码变

CCNA 学习笔记(三)--路由选择协议(静态路由协议)

CCNA 学习笔记(三)--路由选择协议(静态路由协议) 上一章,我们对CISCO的设备有了一定的了解,那现在我们开始去学习下路由选择协议. 静态路由: 1.什么时候是路由? 答:A.路由就是数据包从一端传输到另一端所选择的一条路径.B.数据包的转发. 2.路由器的工作内容? 答:A.路由器首先要知道要到达的目标地址. B.能发现到达目标地址所有可能经过的路由或者节点. C.选择最佳路径. D.维护路由表. 3.查看路由表的命令:show ip route 由上面我们可以看到当前的路由器只是有一

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

NFC学习笔记——三(在windows操作系统上安装libnfc)

本篇翻译文章: 这篇文章主要是说明如何在windows操作系统上安装.配置和使用libnfc. 一.基本信息 1.操作系统: Windows Vista Home Premium SP 2 2.硬件信息: System: Dell Inspiron 1720 Processor: Intel Core 2 Duo CPU T9300 @ 2.5GHz 2.5GHz System type: 32-bit Operating System 3.所需软件: 在windows操作系统上安装软件需要下列

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

加壳学习笔记(三)-简单的脱壳思路&amp;调试思路

首先一些windows的常用API: GetWindowTextA:以ASCII的形式的输入框 GetWindowTextW:以Unicaode宽字符的输入框 GetDlgItemTextA:以ASCII的形式的输入框 GetDlgItemTextW:以Unicaode宽字符的输入框 这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目.还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能

【Unity 3D】学习笔记三十四:游戏元素——常用编辑器组件

常用编辑器组件 unity的特色之一就是编辑器可视化,很多常用的功能都可以在编辑器中完成.常用的编辑器可分为两种:原有组件和拓展组件.原有组件是编辑器原生的一些功能,拓展组件是编辑器智商通过脚本拓展的新功能. 摄像机 摄像机是unity最为核心组件之一,游戏界面中显示的一切内容都得需要摄像机来照射才能显示.摄像机组件的参数如下: clear flags:背景显示内容,默认的是skybox.前提是必须在render settings 中设置天空盒子材质. background:背景显示颜色,如果没

马哥学习笔记三十二——计算机及操作系统原理

缓存方式: 直接映射 N路关联 缓存策略: write through:通写 write back:回写 进程类别: 交互式进程(IO密集型) 批处理进程(CPU密集型) 实时进程(Real-time) CPU: 时间片长,优先级低IO:时间片短,优先级高 Linux优先级:priority 实时优先级: 1-99,数字越小,优先级越低 静态优先级:100-139,数据越小,优先级越高 实时优先级比静态优先级高 nice值:调整静态优先级   -20,19:100,139   0:120 ps

lucene学习笔记(三)

好几天没更新了.更新一下,方便自己和大家学习. 这是最基本的代码 package index; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document;