网络协议总结
说到网络协议,首先离不开OSI 7层模型,OSI/RM是国际标准化组织公布的开放系统互连参考模型(OSI/RM),它是是一种分层的体系结构,参考模型共有7层。下图列出了TCP/IP 4层协议与OSI 7层模型的对比
发送请求的过程是从最顶层(应用层)出发,往下每一层负责封装属于自己的信息到请求中,最后将一整个请求发送给对方。
接收请求的过程是从最底层(网络接口层)开始,每一层的协议负责解析属于自己的东西,比如网际层(IP)处理ip信息,传输层(TCP)处理点对点的端口,应用层(HTTP)处理Request或Response的LineHeaderBody。
1、TCP协议中的三次握手和四次挥手
其中,ACK:确认,0x10。当ACK = 1时,代表这是一个确认的TCP包,取值0则不是确认包。
PSH:推送,0x08。当发送端PSH=1时,接收端尽快的交付给应用进程。
RST:复位,0x04。当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。
SYN:同步,0x02。在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
FIN:终止,0x01。当FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
Seq:是发送方当前报文的顺序号码。
ack:是发送方期望对方在下次返回报文中给回的Seq。
注:seq:"sequance"***;ack:"acknowledge"确认号;SYN:"synchronize"请求同步标志;;ACK:“acknowledge"确认标志”;FIN:"Finally"结束标志。
为什么要三次挥手:
在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此可以正常的建立连接。但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据…问题就在这里,Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,“三次握手”很有必要!
为什么要四次挥手:
借用网络示例,假如现在你是客户端你想断开跟Server的所有连接该怎么做?第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;故Server端还得终止主动向你发送数据,并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行!
使用的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。
2、ARP协议和RARP协议
1)ARP协议地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
主机发送消息时将包含目标IP地址的ARP请求广播道网络上的所有主机,并接受返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
ARP协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。
2)RARP协议:反向地址解析协议,即RARP功能和ARP协议相对,其将局域网中某个主机的物理地址转换为IP地址,比如局域网中有一台主机只知道物理地址而不知道IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。
RARP协议工作流程
(1)给主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
(2)本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
(3)如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
(4)如果不存在,RARP服务器对此不做任何的响应;
(5)源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。
3、路由选择协议
常用的有:RIP协议、OSRF协议,BGP,
1)、 RIP协议:
RIP(Routing Information Protocol,路由信息协议),是早期的内部网关协议,其底层是贝尔曼福特算法,它选择路由的度量标准(metric)是跳数,最大跳数是15跳,如果大于15跳,它就会丢弃数据包,默认管理距离是120,RIP是典型的距离矢量路由协议。RIPv1采用广播式更新,RIPv2采用组播更新方式,RIP默认每隔30秒周期性的发送整个路由表给邻路由。
应用: 适用于小型网络。
最大缺点: 无法在具有冗余链路的网络中有效的运用,容易形成路由环路。
原理: RIP所接收的路由信息都被封装在UDP协议的数据报文中,在UDP 520端口接收来自远程路由的信息,默认情况下,网络中的路由30秒发送一次RIP路由更新,邻近路由将其度量值标记为1跳,即经过一台路由可以到达,依次下一路由会将度量值标记为2跳,即经过两台路由可以到达发起的路由,以此类推。
避免路由环路的措施:
1)最大跳计数(maximum metric),RIP允许跳计数最大可以达到15,任何需要经过16跳才能到达的网络都被认为是不可达的。
2)水平分隔(split horizon):限制路由器不能按照接收信息的方向去将接收到的信息再发回去。学习是单向的,网络信息N传给A,B通过A学习到,这时假如A侧N网络down了,B上有相关信息,A上N信息已经失效被清理,但A扔不会从B在学习N的这些信息,这个是单向的。
3)路由中毒(route poisconing),路由中毒通过将故障网络设置成最大跳计数加1来暗示网络不可达,毒性反转是避免环路的另一种方法。
4)触发更新(triggered update):周期性发送更新,RIP是默认每隔30秒。
5)抑制定时器(holddown time):比如R2收到了R1发来的网络1不可达的信息后,R2首先标记此网络不可达,同时R2的抑制定时器启动,在RIP中抑制定时器是180秒倒计时,如果在抑制定时器到期前,又从R1收到网络1可达的信息了,那么删除这个抑制定时器,并且标记网络1可达;如果在抑制定时器期满前,收到一个来自其他路由的(R3或者R4)关于网络1的更新,并且这个更新具有更好的度量值(假设以前学到的是3跳,这里有其他路由告诉它只需要1跳就能到达网络1),那么R2删除抑制定时器,并且标记网络1可达;如果在抑制定时器到期前,R2收到另外路由器发来的关于网络1的更新,并且具有更差的度量值,那么忽略此更新;在抑制定时器期满后,R2删除抑制定时器,接收来自任何源路由的关于网络1的更新。
2)、OSPF协议:
即Open Shortest Path First开放式最短路径优先,底层是迪杰斯特拉(Dijkstra)算法,是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。常见的链路状态路由协议有:OSPFv2、OSPFv3等,其中OSPFv3是面向IPv6的且不兼容IPv4。
上图是链路状态路由协议路由表的生成过程,OSPF工作过程如下:
1)每台路由器学习**的直接相连的网络信息。
2)每台路由器和直接相连的路由器互交,发送Hello报文,建立邻居关系。
3)每台路由器构建包含直接相连的链路状态的LSA(Link-State Advertisement,链路状态通告)。链路状态通告(LSA)中记录了所有相关的路由器,包括邻路由器的标识、链路类型、带宽等。
4)每台路由器泛洪链路状态通告(LSA)给所有的相邻路由器,并且自己也在本地储存邻路由发过来的LSA,然后再将收到的LSA泛洪给自己的所有邻居,直到在同一区域中的所有路由器收到了所有的LSA。每台路由器在本地数据库中保存所有收到的LSA副本,这个数据库被称作"链路状态数据库(LSDB,Link-State Database)。执行OSPF的路由默认每隔30分钟会泛洪一次链路状态通告(LSA),称为链路状态刷新(并非周期性更新);当一条LSA被接收并被储存到链路状态数据库中后,路由器会给这条记录增加一个老化时间标识,默认是一小时,所以为了防止一些正常的LSA被清除,始发这条LSA的路由会每隔30分钟泛洪一次这条LSA的一个新拷贝。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
5)每台路由器基于本地的"链路状态数据库(LSDB)"执行"最短路径优先(OSPF)"算法,并以本路由器为根,生成一个SPF树,基于这个SPF树计算去往每个网络的最短路径,也就得到了最终的路由表。cost是OSPF中使用的唯一度量值,使用链路的带宽计算得来。
优点: 运行链路状态路由协议的路由器通过LSA的交换,相对RIP具有更强的全局观,具备整个路由网络的大表;另外,OSPF比RIP有更高的收敛速度(EIGRP除外,EIGRP是高级距离矢量路由协议有更快的收敛速度);当检测到拓扑发生变化时会立即发送更新;再者,OSPF采用多区域设计,可以将一些问题限制在较小的区域中;OSPF是层次型设计,易扩展;
缺点: 内存、CPU的要求高,在网络初始化时,大量链路状态包泛洪,会影响网络的可用带宽质量。
关于区域(Area)的概念是这样,OSPF通过划分区域来实现分层设计,跨越两个或两个以上区域的路由被称作ABR(Area Border Router,区域边界路由)。所有的区域都和"Area 0"相连,"Area 0"被称作骨干区域,骨干区域路由器具有整个自制系统中所有路由条目,LSA的扩散仅限制在区域内,通过划分多个区域可以减小LSA扩散过程中对硬件的负担。
OSPF的包格式如下:
OSPF中邻居建立过程:
DBD(Database Description,数据库状态描述包):DBD包是发送端对自己链路状态数据库的一个简短描述,接收路由器根据接收到的DBD包对比自己的链路状态数据库,检测发送端和接收端的链路状态数据库是否同步。
LSR(Link-State Request,链路状态请求包):接收端可以发送LSA来请求接收到的DBD中的某些详细信息。
LSU(Link-State Update,链路状态更新包):用来更新OSPF路由信息,回复LSR请求。
LSAck(Link-State Acknowledgement,链路状态确认):当收到一个LSU,路由器发送LSAck确认。
图例说明:
Down:OSPF初始状态,还没有开始交换信息。
Init:交换信息初期,表示已经收到了邻居的Hello报文,但是报文中没有列出本路由的RID,也就是说对方还没有收到本路由发出的Hello报文。
Two-Way:双向阶段,双方都收到了对方发送的Hello报文,建立了邻居关系。在多路访问的网络中,两个接口状态是DROther的路由器之间将停留在此状态,其他情况将继续转入高级状态。在此状态下的路由器是不能共享路由信息的,想共享路由信息,必须建立邻接关系。(注意邻居关系和邻接关系的区别)
Exstart:准备开始交换阶段,双方通过Hello报文决定主从关系,最高RID的路由将成为主路由,最先发起交换。主从关系确立后进入下一个阶段。
Exchange:开始交换阶段,路由器将本地的"路由状态数据库(LSDB)"用"数据库描述(DBD)“报文来描述,然后发给邻路由。如果这个阶段中的路由收到不在其数据库中的有关链路的信息,那么在下一个阶段中将请求对方发送该路由条目的完整信息。
Loading:加载阶段,路由器通过发送"链路状态请求(LSR)”,来向邻居请求一些路由条目的详细信息。邻居则会使用"链路状态更新包(LSU)“来回复LSR请求,收到邻居发回的LSU后,再发送LSAck向发送LSU的路由进行确认。
FULL:完全邻接状态,Loading结束后,路由器之间就变成了"Full adjacency”。