参考文献:
* 《TCP/IP详解 卷一:协议》;
不可靠:不能保证IP数据报能成功到达目的地;
无连接:不维护任何关于后续数据报状态信息,即没有握手的环节,比如UDP也是无连接的;
普通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字段,因此转发时增加校验和即可。
任选项:可变长的可选信息,包括安全和处理限制,记录路径时间戳等等;
大多数主机采用的简单路由机制:如果目的主机与源主机在同一个共享网络中,那么IP数据报直接送到目的主机,否则,主机把数据报发往一默认的路由器上,由路由器转发该数据报。
路由表:
路由表条目格式:
(1)目的IP地址:可以是完整主机地址或者网络地址,网络地址指定网络中所有的主机;
(2)next-hop router的ip地址;
(3)标志:
一个标志指明目的IP地址是网络地址还是主机地址;
另一个标志指明下一站路由器是否为真正的下一站路由器还是一个直接相连的接口;
(4)为数据报传输指定一个网络接口;
IP路由的选择的搜索顺序:
(1)寻找能与目的IP地址完全匹配的表目;
(2)寻找能与目的网络号想匹配的表目;
(3)寻找“默认表目”;
(4)上述都为找到,不发送,返回主机不可达或者网络不可达;
在(1)或(2)不成功的时,使用“默认”表目;
为一个网络指定一个路由器,而不必为每个主机指定一个路由器,可以极大地缩小路由表的规模;
原因是A类,B类网络下主机数目太大,需要进行进一步划分,当然C类网络也可以划分。
子网编址:把主机号再分成一个子网号和一个主机号。
划分子网的作用:
(1)对外隐藏了内部网络组织(对内显然需要进一步的路由);
(2)缩小Internet路由表的规模;
由于确定IP地址中的网络号和主机号;
(1)0.0.0.0:可以为源端,表示所有不清楚的主机和目的网络;
(2)127.xxx.xxx.xxx:回环地址;
(3)网络号+全1主机号或者网络号+子网号+全1主机号:以网络/子网为目的的广播地址;
(4)255.255.255.255:限制广播地址,这个地址不能被路由器转发;
主机可以同时存在与多个子网,因此可能会有多个ip地址及其子网掩码。
查看,配置,启用或禁用网络接口。
语法:
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 -a | more:列出所有端口;
netstat -at:列出所有TCP所有端口;
netstat -au:UDP;
netstat -r:显示核心路由信息;
netstat -i:列出所有网络接口;
参考:netstat命令;
ARP为IP地址到对应的硬件地址之间提供动态映射。动态指的是这个过程是自动完成的,程序用户和系统管理员不必关心。
我的几个问题:
* ARP的解析的过程;
* APR得到IP地址对应硬件地址后交给谁了,怎么保存,更新;
以一个FTP请求过程为例:
ftp bsdi
ftp是应用层协议,bsdi是主机名,按照计算机网络的层次,自定向下的解释这个过程:
1. 主机名到IP地址:DNS;
2. 用得到IP地址建立TCP连接:TCP;
3. TCP发送IP数据报给远端主机:两种情况,位于同一本地网络(直接送到目的主机)/远程网络(IP选路函数确定下一站路由),注意两种情况都是将IP数据报发送到本地网络上的主机或者路由器;
这时,如果发送端不知道(缓存中没有)对方的硬件地址,这个IP数据报的发送行为就将触发ARP的过程。我们已经知道了要将数据发送到网络层的哪个地方了(IP以及IP路由)。但是数据链路层要求知道目的地的硬件地址,这时开始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应答;
环境:基于学校内网,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
ARP代理:若ARP请求是发向另一个网络的,连接这两个网络的路由器可以回答这个请求。
ARP代理(一般是路由器)知道要将IP数据报转发到子网中的那个主机(在这个子网中再进行必要的ARP)
子网划分的好处在网络层中我们有说过有:(1)隐藏内部的网络组织结构;(2)减小路由表的大小。
我觉得这种逐跳的方式类似于设计模式中的组合模式或者职责链模式,减少了耦合(路由表的大小减少了)。同样对于ARP层也有类似的作用,不用向主机数量庞大的网络广播ARP请求,同时可以隐藏物理网络的细节。
主机发送ARP查找自己的IP地址。
作用:
1. 确定是否有其他主机设置了相同的IP地址;
2. 发送免费ARP的主机如果更改了IP地址(更换了网卡等),其他收到广播的主机可以用新的发送者IP和硬件地址的映射更新自己的ARP高速缓存(如果存在的话)。
重要参数:
arp -a:显示高速缓存的所有内容;
arp -n:显示点分十进制IP而不是主机名;
arp -s:手动添加高速缓存项,这个被添加项是默认没有超时间的,除非在结尾添加上temp;
无盘机,X终端或无盘工作站,获得自IP的过程。具有本地磁盘的主机在系统引导是从磁盘上的配置文件中读取IP地址。
请求是链路层广播,应答是单播。
分组格式和ARP基本一直,不同的是帧类型是0x8035,并且操作代码是3和4;