网络层

一:ip数据报格式

 

具体来说首部(一共20字节)包含以下几个字段

版本:指明是Ipv4还是ipv6。Ipv6是为了缓解ipv4地址不足引入

总长度:16位,因此一个ip数据包的最大长度是65535字节。

标识:数据在整个网络体系的传输流程是应用层的data到传输层的段,到网络层的IP数据包,到链路层的帧,以及传输介质上的比特流。所以最终的数据都是要通过物理层进行传输,不同媒介的MTU不同,当数据大于MTU时,就需要进行分片。分片既可以发生在信源的网络层也可以发生在中间的路由器。信宿主机会根据标识进行重组,同一数据的不同分片的标识是相同的。

标志:3bit。最后一位是MF,为0表示该分片是最后一个分片,为1时表示还有更多分片。中间位是DF,为0表示允许分片,为1时表示不允许分片。与片偏移共同给数据重组提供依据。

TTL:由于ip层是一个无连接的不可靠传输,传输过程通过ICMP协议进行错误信息的反馈。它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。


二:网际控制报文协议 ICMP  

为了提高 IP 数据报交付成功的机会,在网际层使用了网际控制报文协议 ICMP (InternetControl Message Protocol)。 ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP 不是高层协议,而是 IP 层的协议。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。

ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报告报文。 

差错报告报文含5中类型:

信宿不可达(即数据无法到达目的主机)

源点抑制:数据包集中到达某一路由器后,数据包来不及被处理

超时:与IP数据包首部的TTL字段息息相关,可能由于网络拓扑的结构,导致数据在网络上循环传输,而在规定的时间内无法到达。

参数错误:ip数据包首部的字段漏写或者是错写

重定向:这其实不是一个错误,因为网络上主机的数量庞大,当网络拓扑发生变化时,仅更新路由器的路由表,主机的路由表不更新。信源主机按照从前的路由表进行数据传递,路由器接收到后将更新后的路由信息返给信源主机,作用有2个,一是数据不可达,二是更新信源的路由表。

询问报告报文包含2种

回送请求和回答报文 :主机或路由器向特定目的主机发出询问,收到此报文的主机必须发送ICMP回送回答报文。可用于测试目的站是否可达以及了解其有关状态。PING 用来测试两个主机之间的连通性。PING 使用了 ICMP 回送请求与回送回答报文。PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或UDP。

时间戳请求和回答报文 : 请求某台主机或路由器回答当前的日期和时间,不同主机的系统时间会有差别,因此可用于时钟同步和时间测量


三:IP路由

当数据从信源传递到信宿的过程中间会经过路由器,这个传递的路径是ip路由相关知识。每个主机和路由器都会维护一张路由表,路由表是整个网络传递的基础。包括静态路由和动态路由两种。静态路由是管理员以手工的方式写进路由表,适用于小型网络,拓扑不易发生的网络体系结构中。动态路由是根据某种算法自动学习更新路由表。包括距离向量路由算法和链路状态路由算法。

运行距离矢量路由协议的路由器,会将所有它知道的路由信息与邻居共享,但是只与直连邻居共享!运行链路状态路由协议的路由器,只将它所直连的链路状态与邻居共享,这个邻居是指一个域内(domain),或一个区域内(area)的所有路由器!

距离量路由协议,更新的是“路由条目”!一条重要的链路如果发生变化,意味着需通告多条涉及到的路由条目!
链路状态路由协议,更新的是“拓扑”!每台路由器上都有完全相同的拓扑,他们各自分别进行SPF算法,计算出路由条目!一条重要链路的变化,不必再发送所有被波及的路由条目,只需发送一条链路通告,告知其它路由器本链路发生故障即可。其它路由器会根据链路状态,改变自已的拓扑数据库,重新计算路由条目。

距离矢量路由协议发送周期性更新、完整路由表更新(periodic & full)可能会出现回环问题,解决的方法是:一是设置最大跳(超过最大跳,认为出错);二是水平分割。
而链路状态路由协议更新是非周期性的(nonperiodic),部分的(partial


四:ARP协议

ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。cmd输入 arp -a 就可以查询本机缓存的ARP数据。

通过ARP协议的工作原理可以发现,ARP的MAC寻址还是局限在同一个子网中,因此网络层引入了路由协议,首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。

ARP欺骗原理:

假设主机 A 192.168.1.2,B 192.168.1.3,C 192.168.1.4; 网关 G 192.168.1.1; 在同一局域网,主机A和B通过网关G相互通信,就好比A和B两个人写信,由邮递员G送信,C永远都不会知道A和B之间说了些什么话。但是并不是想象中的那么安全,在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换。

C假扮邮递员,首先要告诉A说:“我就是邮递员” (C主机向A发送构造好的返回包,源IP为G 192.168.1.1,源MAC为C自己的MAC地址),愚蠢的A很轻易的相信了,直接把“C是邮递员”这个信息记在了脑子里;

C再假扮A,告诉邮递员:“我就是A” (C向网关G发送构造好的返回包,源IP为A 192.168.1.2,源MAC地址为自己的MAC地址),智商捉急的邮递员想都没想就相信了,以后就把B的来信送给了C,C当然就可以知道A和B之间聊了些什么

  上面ABCG的故事就是ARP双向欺骗的原理了

ARP单向欺骗就更好理解了,C只向A发送一个返回包,告诉A:G 192.168.1.1 的MAC地址为 5c-63-bf-79-1d-fa(一个错误的mac地址),A把这个信息记录在了缓存表中,而G的缓存表不变,也就是说,A把数据包给了C,而G的包还是给A,这样就是ARP单向欺骗了。


五:路由协议

常见的路由routing协议:包括域内协议(rip,ospf)和域间协议(bgp)

RIP和OSPF的区别:

1:rip是基于距离向量,ospf是基于链路状态

2:rip仅和直接相连即相邻的路由器交换路由表信息,ospf是和本自治系统的所有路由器交换网络拓扑

3:rip是定期交换,ospf是当链路状态发生变化的时候用洪范法发送信息

4:rip不知道全网的拓扑结构,因此会产生“好消息传得快,坏消息传的慢”问题,不适应大型网络,ospf每一个路由器有全网的拓扑图,因此更新收敛速度快。


六:正向代理和反向代理

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。

反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向哪个服务器,并将获得内容转交给客户端,使得这些内容就好似他自己一样,客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。

                     


七:socket套接字编程

1)套接字:

概念:

在网络通信中全局的标识一个参与通信的进程需要采用三元组:协议,主机ip地址和端口号。而描述两个应用进程之间端到端通信关联则需要使用五元组:协议,信源主机ip,信源应用进程端口,信宿主机ip,信宿应用进程端口。套接字可以理解为通信连接的一方(内容就是这一方的三元组),实现了对网络层和传输层协议的封装。

类型:

流套接字:用于提供面向连接,可靠的数据传输服务。原因在于采用的是TCP进行通信。这种方式的通信连接必须显示建立

数据报套接字:用于提供无连接,不可靠的传输服务。采用的是UDP进行传输。这种方式的通信连接不需要显示建立

原始套接字:上述的两种套接字都是标准套接字的一种。流套接字只可以读取TCP的数据,数据报套接字只能读取UDP数据,原始套接字可以读取内核没有处理的ip数据报。使用原始套接字的目的是为了避开TCP/IP的处理机制,将被传送的数据包直接传送给需要它的应用程序。主要是用来进行编写自定义底层协议的应用程序。比如arp和ping。

2)客户机服务器模型:

服务器:

一般启动后就一直处于运行的状态,以等待客户机的进程请求

一般使用的都是熟知的端口号,便于客户端进程连接请求

一般拥有较多的系统资源,以便及时响应各个客户机进程请求

可以并行处理多个客户进程请求,但数目是有一定限制的

在通信时一般处于被动的一方,不需要知道客户端的ip地址和端口信息

客户端:

在需要服务器进程的服务时将向服务器进程请求服务,并建立通信连接,得到满足并完成处理后就终止通信

使用想系统申请的临时端口号与服务进程进行通信,通信完成后将释放该端口

拥有相对较少的系统资源

在通信时属于主动的一方,需要事先知道服务器的ip地址和端口信息

3)服务程序工作模型:

面向连接:

                               

服务端五元组的建立:

Socket函数确定使用的协议

Bind函数实现与本地的ip和端口号的绑定,即确定本地ip和端口号

Accept函数实现与远程ip和端口号的关联,即确定远程ip和端口号

 

客户端五元组的建立:

Socket函数确定使用的协议

Bind函数实现与本地的ip和端口号的绑定,即确定本地ip和端口号

Connect函数实现与远程ip和端口号的关联,即确定远程ip和端口号

无连接:

                                           

通信的一方可以不用bind函数绑定ip和端口号,而由系统自动分配,但是充当服务器的一方需要事先绑定ip地址和端口号

不绑定的一方充当客户端进程,通信必须由这一方先发起。虽然不用建立连接,但是充当服务器的一方应用进程也必须先启动,否则客户端发起的请求到达不到服务器

在数据传输的过程,虽然不用事先建立连接,但是在发送数据的时候,发送方除了指定本地套接字地址外(ip和端口号),还需要指定接收方的套接字地址。即在数据的接收和发送过程中动态的建立通信双方的通信连接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章