TCP/IP:我们把网络定义为互相连接在一起的设备,网络的本质作用还是“端到端”的通信,然而希望互相通信的设备并不一定要“直接”连接在一起,因此必然需要一些中间的设备(路由)负责转发数据,因此就把连接这些中间设备的线缆上跑的协议定义为链路层协议,实际上所谓链路其实就是始发与一个设备,通过一根线,终止于另一个设备。我们把一条链路称为“一跳”。因此一个端到端的网络包含了“很多跳”。
此话引用自此博客,大神,膜拜
http://blog.csdn.net/dog250/article/details/6612496
IP(网络层)在我看来其实就是复用下层繁多的链路层协议,为上层传输层提供统一的接口,就是说,网络层对下层繁多的协议进行地址管理,每个设备不管它的物理层及其而对应的链路层使用的是什么协议,都对他们统一的使用IP地址进行唯一的标识,进行一跳一跳的传输。而向上,对传输层的协议进行分用(识别IP首部的协议字段),向上分用多个协论(TCP,UDP,ICMP,IGMP),保证不同的协议能被分到不同的协议软件中进行处理。传输层在此基础上就很简单的,他不用再考虑下面一跳一跳传输的细节,只需要考虑从源IP发送到目的IP就可以了,为此传输层的TCP协议进行了拥塞控制,超时重传和失序重排以保证端对端的可靠性。而网络层自身呢,就是下面的两个任务了:
1、路由选路:
路由表:
1)搜索路由表,寻找和目的IP完全匹配的表目。如果找到就发往下一站路由或者主机。
2)搜索路由表,寻找网络号相同的表目(优先匹配子网号相同的路由)。如果找到就发往下一站路由或者主机。
3)搜索路由表,寻找默认(default)表目。如果找到就发往下一站路由或者主机。
4)如果都找不到,那么很不幸,由于网络层只提供尽力的传输,所以该数据报被丢弃了。并且应该 向源地址发送一个ICMP不可达差错报文。
路由表中的标志值有:
U:可以使用的。
G:这是一个网关(路由器)。
H:这是一个主机地址,目的地址是完整的主机地址,不是一个网络地址。
D:该路由是由重定向报文创建的。
M:该路由被重定向报文修改。
以上,如果找到就发往下一站路由或者主机,这一步骤中,其实是发给路由表中对应的路由(网关)或者直接发往目的IP,如果是标志G,那么就说明,这是一个间接路由,那么在链路层的帧上的MAC地址放的是该路由的MAC地址,而如果没有这给标志,证明这是直接路由,那么在链路层帧中放的就是目标IP对应的MAC地址。至于,IP如何和MAC地址完成映射,就需要ARP协议了。
如果标志H,那么证明这个是一个主机,那么在匹配IP地址的时候就要匹配整个IP地址,而不只匹配网络号,有这个标志进行优先匹配。
好了,路由的选路就是这样,但是有一个关键问题还没有解决,我怎么知道哪写路由要更新?
其实这是路由的选路策略,分为动态选路协议和静态选路协议(涉及D、M标志),他们之间如何实现,将在下篇博客说明。
2、地址管理:
IP层抽象的互联网的屏蔽了下层硬件纷繁的细节,只要我们在网络层上讨论问题,就能够使用统一的、抽象的IP地址研究主机和主机或路由之间的通信。那么,他的编址方式又是什么?现在的IP网络使用32位地址,以点分十进制表示,如192.168.0.1。地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址(取决于是否加了子网掩码)。我们这里只没有子网掩码的情况,因为子网掩码其实是在网络号的基础上对同一网段的IP地址进行再分组。
如图,现在我们用的都是ABC类地址,D类主要是用于多播,这个和IGMP和UDP相关,这里不多做阐述。而E类地址,我们平时是见不到的。
有上图可知,A类地址是从0.0.0.0到127.255.255.255
B类地址是从128.0.0.0到191.255.255.255
C类地址是从192.0.0.0到223.255.255.255
D类地址是从224.0.0.0到239.255.255.255
E类地址是从240.0.0.0到255.255.255.255
还有几个特殊的IP地址:
版本号:长度4比特。用于标识目前使用的IP协议的版本号。一般有0100(IPV4)和0110(IPV6)。
目前我们使用的IP地址多为IPV4,IPV6主要是为了解决IPV4版本的IP资源枯竭问题而提出来的。
IP包头长度:长度4比特,这个字段的出现是因为IP包头的不定长(因为有可选项),如果没有可选项(如UDP),就不需要这个字段。其表示的单位是4字节,就是说当其数值为1111时,表示的是15×4=60字节。那么当字节数不足时,比如首部目前53字节,明显不是4的整数倍,此时我们在包头后面填充3个0字节则可(56是4的倍数)。
服务类型:占8个比特,根据数值不同对包的传送做不同优化,但大部分时候忽略。
总长度:首部和数据之和的长度,单位是字节。最大是2^16-1=65535字节。这是典型的数据报通信(UDP也是),往往是无连接的,所以需要边界,而像TCP或者管道这一类流式通信,就不需要这个字段,因为它们是流(有连接的),不需要边界。
标识:占16位,IP软件维持一个计数器,产生一个数据包就把计数值加1,并赋值给该字段。对于该字段而言,主要是为了在IP分片之后还能重新组成原来数据报。
那么什么时候会发生分片呢?
在链路层中有一个MTU(最大传输单元),这个MTU主要是为了限制每次传输的数据包的大小,以保证发送的速度,从而减小延时。并且由于IP总是提供尽力的传输却不保证数据包一定到达目的地,MTU减小TCP的MSS(最大传输报文段)可以减少有运输层发现丢包后重传的包的大小。
所以,当前IP的数据报大于MTU,此时如果没有设置DF位的话,那么就会使得IP数据包分片,分片完了以后,标识的作用就体现出来了,只有标识相同的数据报才会被合并成一个数据报。
此时又有了新的问题,那么你怎么知道我是第几个包?
很简单,首先,标志中有有一个MF位,如果MF为0的话表示这是最后一个分片,为1表示后面还有其他分片。DF是不可分片位,如果MTU小于当前数据包而有设置了这个位,那么会给源地址发送一个ICMP不可分片差错报文。
那么如何拼起来呢??
利用片偏移,13位,很奇怪,13位而已,而IP数据包长度却足足有16位。所以,片偏移是以8字节为单位的,一个IP报文分片以后,除了最后一个报文,其他的报文都是八字节的整数倍。
生存时间:这是数据报在网络中的寿命,防止数据报不停的在网络中兜圈子。为什么说IP是尽可能的传输呢?这个就是它的原因之一,如果TTL(生存时间)变成0的话,路由默认动作是丢弃这个数据报。IP数据报是靠路由进行一跳一跳的传输的,这个值每过一个路由器就减少1,一般初始设为255,也就是说,最多经过255次路由。
协议:利用IP进行传输的运输层协议有:TCP,UDP,为了在IP软件进行分用的时候方便,所以设置这个字段。当然,还有ICMP,IGMP和OSPF也是使用IP协议。
首部检验和:占16位,只校验数据报的首部,不含数据部分。每次经过路由器都要检查一次,避免首部出错。
源地址:发送方的IP。
目的地址:接收方的IP。
可变部分主要是用来排错、测量、安全的,其选项较多,但最后要用0填充字段填充到为4字节的整数倍,就是说,每个选项至少占用4字节。