网络协议通常通过不同的层次进行开发,每一层分别负责不同的通信功能。一个协议簇,如TCP/IP通常是一组不同层次上的协议的组合。TCP/IP通常被认为是一个四层的协议系统,如下图所示。
每一层负责不同的功能:
(1)链路层:有时也被称为数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。他们一起处理与电缆的物理接口细节。
(2)网络层:也被称为互联层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议中,网络层协议包括IP,ICMP(网络控制报文协议),IGMP(网络组管理协议)
(3)传输层:主要为主机上的应用程序提供端到端的通信。包括TCP,UDP.
(4)应用层:负责处理特定应用程序细节。不同的TCP/IP协议都会实现如下几种应用协议:Telnet,FTP,SMTP,SNMP协议。
通过路由器连接的两个网络中主机的通信:
域名系统DNS是一个分布的数据库,提供IP地址和主机名之间的映射。具体的信息在后面描述。
当应用程序用TCP传输数据时,数据被送入协议栈中,然后逐个通过每层直到当被做一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还需要增加尾部信息)。该过程如下图所示。
其中TCP传给IP的数据单元被成为tcp报文段或TCP段。IP传给网络接口层的数据包成为IP数据报。通过以太网传输的比特流成为帧。
当目的主机收到一个以太网数据帧时,数据就要开始从协议栈中从底向上上升,同时去掉各个协议加上的报文首部。每层协议都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程成为分用。
tcp,udp采用16bit的端口号来识别应用程序。在/etc/services文件中声明了常用服务的端口号。
dan@ubuntu:~$ vi /etc/services
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, officially ports have two entries
# even if the protocol doesn't support UDP operations.
#
# Updated from http://www.iana.org/assignments/port-numbers and other
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
ftp 21/tcp
fsp 21/udp fspd
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp
telnet 23/tcp
smtp 25/tcp mail
time 37/tcp timserver
time 37/udp timserver
rlp 39/udp resource # resource location
nameserver 42/tcp name # IEN 116
whois 43/tcp nicname
tacacs 49/tcp # Login Host Protocol (TACACS)
tacacs 49/udp
re-mail-ck 50/tcp # Remote Mail Checking Protocol
re-mail-ck 50/udp
domain 53/tcp # Domain Name Server
domain 53/udp
mtp 57/tcp # deprecated
tacacs-ds 65/tcp # TACACS-Database Service
......
既成事实标准的tcp/ip协议软件实现来自伯克利的加利福利亚大学的计算机系统研究小组。
使用TCP/IP协议的应用程序通常采用两种应用编程接口API: Socket(有时称为Berkeley socket,表明是从伯克利版发展而来的) 和 TLI(运输层接口:transport layer interface)。
链路层主要有三个目的:1)为IP模块发送和接收IP数据包;2)为ARP 协议发送请求和接收应答;3)为RARP 协议发送请求和接收应答
TCP/IP协议支持多种不同的数据链路层协议,包括:以太网(csma/cd:带冲突检测的载波真听多路接入)、令牌环网、FDDI(光纤分布式数据接口)
IP提供的是不可靠、无连接的数据报传输服务。其不可靠的意思是它不能保证IP数据报能成功到达目的地。如果发生某种错误,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息给信源端(谁发送ICMP发?)
四字节32bit的值以下次序传输:首先0 ~ 7bit, 然后8 ~ 15bit, 然后16 ~ 23bit,最后24 ~ 31 bit。这种传输次序叫做big endian字节序。由于TCP/IP首部中的所有的二进制整数在网络中传输时都要求以这种次序,因此,它又称为网络字节序。以其他形式存储的二进制整数的机器,如littler endian格式,则必须在传输数据前将首部转换成网络字节序。
(1)服务类型TOS字段:包括3bit的优先权子字段,4bit的tos子字段和1bit的未用位但必须置零。 4bit的tos分别表示:最小时延、最大吞吐量、最高可靠性、最小费用。 4bit中只能设置其中的一位。如果4为都为0,则表示一般服务。如telnet 和rlogin这两个交互性的应用,则要求最小时延;对应ftp则要求最大吞吐量。
TOS常用来做QOS,用于在数据传输过程中的质量保证。说通俗一点,路窄、车多,所以对车标出优先级,有些车先走,有些车后走,有些车不让走。路由器跟交警一样,指挥交通,如何操作,取决事先确定的策略。对于终端而言(比如电脑),已经收到报文,所以就不会关心这个字段。
(2)总长度:指整个ip数据报的长度,以字节为单位。总长度是ip首部中必要的长度,应用一些数据链路需要填充一些数据以达到最小长度,可通过总长度字段区分出真正的报文和填充内容。
(3)标识字段:唯一标识主机发送的每一分数据。通常每发送一份报文它的值就会加1.
(4)TTL: 生存时间字段,表示可以经过的路由器数。当ttl=0时,数据报就会被丢弃,并发送ICMP报文通知源主机。
IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息。
路由表是TCP/IP通信的基础,本地计算机上的任何TCP/IP通信都受到路由表的控制。
dan@ubuntu:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 * 255.255.255.0 U 1 0 0 eth0
dan@ubuntu:~$
路由表中的每一个路由项都具有五个类型。分为四大部分
网络地址(networkdestination)、网络掩码(netmask):网络地址和网络掩码相“与”的结果用于定义本地计算机可以到达的网络目的地址范围。
主机地址:某个特定主机的网络地址
子网地址:某个特定子网的网络地址
网络地址:某个特定网络的网络地址
默认路由:所有未在路由表中指定的网络地址
注意:在添加路由时,Windows要求输入的网络地址和网络掩码相“与”后的结果必须等于网络地址,否则路由添加会失败。
网关(gateway,又称为下一跳服务器):在发送IP数据包时,网关定义了针对特定的网络目的地址,数据包发送的下一跳服务器。
如果是本地计算机直接连接到的网络,网关通常是本地计算机对应的网络接口,但是此时接口必须和网关一致
如果是远程网络或默认路由,网关通常是本地计算机所连接到的网络上的某个服务器或路由器
接口(interface):接口定义了针对特定的网络目的地址,本地计算机用于发送数据包的网络接口。网关必须位于和接口相同的子网(默认网关除外),否则造成在使用此路由项时需调用其他路由项,从而可能导致路由死锁
跃点数(metric):跃点数用于指出路由的成本,通常情况下代表到达目标地址所需要经过的跃点数量,一个跃点代表经过一个路由器。跃点数越低,代表路由器成本越低;跃点数越高,代表路由成本越高。当具有多条到达相同目的网络的路由项时,TCP/IP会选择具有更低跃点数的路由项。(一个路由一个跃点)
路由表的基本查找方法是:
这是最基本的情况,但实际使用时的情况更加复杂,比如当一个目标地址被多个目标网络所覆盖以及一个目标网络的多种路由协议的多条路径共同存在的时候,或者是同一目标网络同一路由器的多条路径共同存在的时候,路由器的转发原则是什么?
想要从多条可选路由表项中选择最优的路径,必须有一个衡量标准,管理距离AD就是所有衡量标准中的一个。
管理距离(AD): 管理距离是指提供路由可信度的一个参考值,如果管理距离越小,路由条目越可靠。这就是说,较小管理距离的路由条目优先于较大的条目。管理距离的取值范围为0-255,0最可信,255最不可信。假如一台路由器收到同一网络的两条路由更新,路由器会选择管理距离最小的那条,放入路由表
路由选路原则:
先进行最长匹配原则,满足后进行管理距离最小优先,依旧满足进行度量值最小优先
A: 最长匹配原则:最长匹配原则是CISCO IOS路由器默认的路由查找方式。当路由器收到一个IP数据包时,会将数据包的目的IP地址与自己本地路由表中的表项进行bit by bit的逐位查找,直到找到匹配度最长的条目,这叫最长匹配原则。
B: 管理距离AD最小优先:可以是多种路由协议的比较;也可以是同种路由协议的比较,比如双线出口所配置的两条默认浮动路由比较
C:度量值metric最小优先:路由协议不同则度量值不能做比较,比如rip度量值为跳数;ospf度量值为带宽;eigrp度量值为带宽+延迟等。所以在不同种协议之间先比较管理距离
ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。
在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。
一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。
ARP原理:广播请求单播回应,ARP协议通过"一问一答"实现交互,但是"问"和"答"都有讲究,"问"是通过广播形式实现,"答"是通过单播形式。
每个主机或者路由器都有一个ARP高速缓存表。它用来存放最近Internet地址到硬件地址之间的映射记录。高速缓存表中每一项的生存时间都是有限的,起始时间从被创建时开始计算的。
dan@ubuntu:~$ arp
Address HWtype HWaddress Flags Mask Iface
192.168.1.1 ether dc:fe:18:f6:68:81 C eth0
当ARP请求目标跨网段时,网关设备收到此ARP请求,会用自己的MAC地址返回给请求者,这便是代理ARP(Proxy ARP)。
代理ARP本质是一个"善意的欺骗",是一个"错位"的映射。从图中我们看到服务器地址的正常映射是<8.8.8.8-MAC2>,而路由器返回给电脑的,却是 <8.8.8.8-MAC254>。不管是不是"欺骗",至少最终电脑可以与外网的服务器实现通信。
通过以上对比,总结出以下信息。
①电脑没有网关时,ARP直接询问目标IP对应的MAC地址(跨网段),采用代理ARP;
②电脑有网关时,ARP只需询问网关IP对应的MAC地址(同网段),采用正常ARP;
③无论是正常ARP还是代理ARP,电脑最终都拿到同一个目标MAC地址:网关MAC。
免费ARP是指主机发送ARP查找自己的IP地址。
免费ARP的作用,目前免费ARP的作用有两种。
(1)第一种就是刚才上面所说的宣告广播的作用,以告诉整个广播域,目前这个IP所对应的MAC地址是什么。
(2)第二种是看看广播域内有没有别的主机使用自己的IP,如果使用了,则在界面上弹出“IP冲突”字样。
普通ARP和免费ARP的区别:
普通ARP请求报文(查找别人的IP地址,比如:我需要10.1.1.2的MAC地址,10.1.1.2是别人的IP)广播发送出去,广播域内所有主机都 接收到,计算机系统判断ARP请求报文中的目的IP地址字段,如果发现和本机的IP地址相同,则将自己的MAC地址填写到该报文的目的MAC地址字段,并 将该报文发回给源主机。所以只要发送普通ARP请求的主机接收到报文,则证明广播域内有别的主机使用自己要访问的这个IP地址(这里不考虑路由器的ARP代理问 题)。
免费ARP的报文发(查找自己的IP地址,比如:我需要10.1.1.1的MAC地址,而10.1.1.1就是自己的IP)出去是不希望收到回应的,只希望是起宣告作用;如果收到回应,则证明对方也使用自己目前使用的IP地址。在所有网络设备(包括计 算机网卡)up的时候,都会发送这样的免费ARP广播(多长时间发一次呢????),以宣告并确认有没有冲突。
逆地址解析协议 RARP 使只知道自己硬件地址的主机能够知道其 IP 地址。
这种主机往往是无盘工作站。 因此 RARP协议目前已很少使用。
icmp 报文是在ip数据报内部被传输的,主要用户传输差错报文及其他需要注意的信息。
各种类型的icmp报文如下图所示。不同类型由报文中的类型字段和代码字段共同决定。
ICMP 询问报文有两种:
差错报告报文共有 5 种
ICMP时间戳请求 允许系统向另一个系统查询当前的时间,返回的值是自午夜开始计算的毫秒数,提供了毫秒级的分辨率。
请求端填写发起时间戳,接收时间戳、传送时间戳置0
应答端填写接收时间戳、传送时间戳,发起时间戳与请求报文中一致
ping 程序用于测试另一台主机是否可达。该程序发送一份icmp 回显请求报文给主机,并等待返回icmp回显报文
ping程序提供了查看ip记录路由(RR)选项的机会。它使ping程序发送出去的ip数据报中设置IP RR选项。这样,每个处理该数据的路由器都把它的ip地址放入选项地址中。大数据报达到目的端时,ip地址清单应该复制到icmp回显应答中,这样返回途中经过的路由器机制也被加入到目的端中。当ping程序收到回显应答时,它就会打印出这份清单。
通过此参数就可以设定你想探测经过的路由的个数,不过限制在了9个,也就是说你只能跟踪到9个路由
traceroute 程序可以让我们看到ip数据包从一台主机传到另一台主机所经过的路由。
ping 需要路由器的支持,且最大支持9个ip地址(往返)
Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。
首先,tracert送出一个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1。此时,TTL变为0,所以该路由器会将此数据包丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),tracert 收到这个消息后,便知道这个路由器存在于这个路径上,接着tracert 再送出另一个TTL是2 的数据包,发现第2 个路由器… tracert 每次将送出的数据包的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个数据包 抵达目的地。当数据包到达目的地后,该主机则不会送回ICMP time exceeded消息,一旦到达目的地,由于tracert通过UDP数据包向不常见端口(30000以上)发送数据包,因此会收到「ICMP port unreachable」消息,故可判断到达目的地。
tracert 有一个固定的时间等待响应(ICMP TTL到期消息)。如果这个时间过了,它将打印出一系列的*号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP TTL到期消息的响应。然后,Tracert给TTL记数器加1,继续进行。
系统中都有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息。
路由表是TCP/IP通信的基础,本地计算机上的任何TCP/IP通信都受到路由表的控制。
root@ubuntu:/home/dan# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
具体见 3.2节。
假如路由表中没有默认项,且又不能找到匹配项时,这时怎么处理?
(1)如果该ip数据报由主机产生的,那么就会给该数据报的应用程序返回一个差错,或是“主机不可达”或“网络不可达”。
(2)如果是被转发的数据报,那么就给原始发送端发送一份icmp主机不可达的差错报文。
ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发
ICMP应用分析-ICMP重定向
ICMP虽然不是路由协议,但是有时它也可以指导数据包的流向(使数据流向正确的网关)。ICMP协议通过ICMP重定向数据包(类型5、代码0:网络重定向)达到这个目的。
如上图所示,主机PC要ping路由器R2的loopback 0地址:192.168.3.1,主机将判断出目标属于不同的网段,因此它要将 ICMP请求包发往自己的默认网关192.168.1.253(路由器R1的E0接口)。但是,这之前主机PC首先必须发送ARP请求,请求路由器R1的 E0(192.168.1.253)的MAC地址。
当路由器R1收到此ARP请求包后,它首先用ARP应答包回答主机PC的ARP请求(通知主机PC:路由器R1自己的E0接口的MAC地址)。然后, 它(路由器R1)将此ICMP请求转发到路由器R2的E0接口:192.168.1.254(要求路由器R1正确配置了到网络 192.168.3.0/24的路由)。此外,路由器R1还要发送一个ICMP重定向消息给主机PC,通知主机PC对于主机PC请求的地址的网关是: 192.168.1.254。
路由器R2此时会发送一个ARP请求消息请求主机PC的MAC地址,而主机PC会发送ARP应答消息给路由器R2。最后路由器R2通过获得的主机PC的MAC地址信息,将ICMP应答消息发送给主机PC。
a) 数据包的入接口和路由后的指定的出接口是同一个接口。
b) 数据包的源IP地址和该包应走的下一跳IP地址属于同一个网段。
c) 数据报非源路由的(这种情况应该比较少见了,源路由多见于Token Ring)。
d) 系统开启重定向功能。
主机和路由器对于重定向报文有不同的处理原则。
1)路由器一般忽略ICMP重定向报文。
2)主机对于重定向报文的感知取决于操作系统。以Windows为例,对于网关返回的ICMP重定向报文,Windows会在主机的路由表中添加一项主机路由。那么以后对于这个目的地址数据报,主机会将其直接送往重定向所指示的路由器。支持重定向报文处理的还有许多的Unix系统,如FreeBSD的诸多版本等。这类主机收到ICMP重定向报文后所采取的行动基本都是增加主机路由。显然,修改默认网关是不合理的。
同时,有的操作系统对于重定向报文是不做任何处理而直接丢弃(虽然也同样经由网络层向上递交),比如Sun的某些系统。
某些主机可以启动路由器功能,如FreeBSD的某些版本和Win32系统。这时主机的行为要特殊一些,会施加一些特殊条件来判断是否处理该重定向报文,这是依系统而异的。比如BSD,它检查重定向报文的条件之一是“重定向报文不能让主机本身作为网关”。
ICMP重定向使得客户端的管理工作大大减少,使得对于主机的路由功能要求大大降低。该功能把所有的负担推向路由器学习。但是与此同时ICMP重定向也有很多弊端。
就重定向本身的机制来说,ICMP重定向增加了网络报文流量,因为主机的报文总是要在网关的直连网段上重复传输。那么更进一步如果主机的操作系统支持重定向(比如Windows)会如何?如图1,而主机收到重定向报文,会在自己的路由表中产生指向B的主机路由,经由1.1.1.2。事实上,主机这样可能会引起两点显著问题。
其一是引起性能问题,例如:有一台大型的服务器,要处理数十个子网下的数千台主机的业务。如果要支持重定向,那么服务器将会维护一个庞大的充满主机路由的路由表。这是一笔很大的开销。可能很大程度上降低服务性能,甚至导致网络服务瘫痪。
其二是可能埋下安全隐患。利用这点可以进行攻击和网络窃听。如果目某主机A支持ICMP重定向,那么主机B发一个IMCP重定向给它,以后它发出的所有到指定地址的报文都会转发主机B,这样B就可以达到窃听目的了。当然,拿windows操作系统来说,它会对ICMP报文进行检查,如果这个重定向不是网关发送的,会被直接丢弃。不过伪造一个网关的数据包很容易。另外,如果刻意伪造许多虚假的ICMP重定向报文,主机路由表就可能被改的乱七八糟。
一般认为,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。
当路由器启动时,它定期在所有广播或多播传送接口上发送通告报文。准确地说,这些通告报文不是定期发送的,而是随机传送的,以减小与子网上其他路由器发生冲突的概率。一般每两次通告间隔450秒和600秒。一份给定的通告报文默认生命周期是30分钟。
使用生命周期域的另一个时机是当路由器上的某个接口被关闭时。在这种情况下,路由器可以在该接口上发送最后一份通告报文,并把生命周期值设为0.除了定期发送主动提供的通告报文以外,路由器还要监听来自主机的请求报文,并发送路由器通告报文以响应这些请求报文。如果子网上有多台路由器,由系统管理员为每个路由器设置优先等级。例如,主默认路由器就要比备份路由器具有更高的优先级。
主机操作
主机在引导期间一般发送三份路由器请求报文,每三秒钟发送一次。一旦接收到一个有效的通告报文,就停止发送请求报文。主机也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。另外,如果没有接收到来自当前默认路由器的通告报文,那么默认路由器会超时。只要有一般的默认路由器,该路由器就会每隔10分钟发送通告报文,报文的生命周期是30分钟。这说明主机的默认表项是不会超时的,即使错过一份或两份通告报文。
距离向量算法,实际中较少使用。工作原理:
(1)初始化——RIP[1]初始化时,会从每个参与工作的接口上发送请求数据包。该请求数据包会向所有的RIP路由器请求一份完整的路由表。该请求通过LAN上的广播形式发送LAN或者在点到点链路发送到下一跳地址来完成。这是一个特殊的请求,向相邻设备请求完整的路由更新。
(2)接收请求——RIP有两种类型的消息,响应和接收消息。请求数据包中的每个路由条目都会被处理,从而为路由建立度量以及路径。RIP采用跳数度量,值为1的意为着一个直连的网络,16,为网络不可达。路由器会把整个路由表作为接收消息的应答返回。
(3)接收到响应——路由器接收并处理响应,它会通过对路由表项进行添加,删除或者修改作出更新。
(4)常规路由更新和定时——路由器以30秒一次地将整个路由表以应答消息地形式发送到邻居路由器。路由器收到新路由或者现有路由地更新信息时,会设置一个180秒地超时时间。如果180秒没有任何更新信息,路由的跳数设为16。路由器以度量值16宣告该路由,直到刷新计时器从路由表中删除该路由。刷新计时器的时间设为240秒,或者比过期计时器时间多60秒。Cisco还用了第三个计时器,称为抑制计时器。接收到一个度量更高的路由之后的180秒时间就是抑制计时器的时间,在此期间,路由器不会用它接收到的新信息对路由表进行更新,这样能够为网路的收敛提供一段额外的时间。
(5)触发路由更新——当某个路由度量发生改变时,路由器只发送与改变有关的路由,并不发送完整的路由表。
特点:
缺点:收敛慢
例子:
初始时R1到C网络的跳数是1,路由表中就记录着1,R2经过R1再到C共两跳,因此记录跳数是2.
现在:R1到C的路径被剪断了,R1可以感受到,于是在自己的路由表中更新为16,表示"无穷大",不可达。
这是个坏消息,坏消息传得慢。现在看如何慢。
R1准备在下一个30秒内告诉R2这个坏消息,但是R2先把自己的所有信息都告诉了R1,R1一看咦?R2到C的跳数是2,我到R2就一跳,现在虽然我不能直接到C了,那么绕道R2不就可以了吗?说干就干,于是把自己到C的跳数改为3.好了,真相被谎言掩盖了。开始了二者之间的互捧臭脚时间。
R1向R2这个好基友坦白所有的信息,R2看到R1到C的距离变为3了,R2知道自己是经过R1才到达的C,于是毫不犹豫的改为4.下一次再把全部信息告诉R1,R1收到一看,咋回事啊,怎么又加一跳了呢!R2那边发生了什么?但是还是得根据规则,毫不犹豫的修改到C的距离跳数。就这样不断增加,直到都为16,才恍然大悟,原来大家都到不了了啊。
参见:https://blog.csdn.net/ztguang/article/details/70949781