IP协议层 在传输层的下边,链路层的上边。
IP层封装后称为数据报(传输层叫数据段,链路层叫数据帧。值得注意的是,不是所有的以太网数据帧都是IP数据报,至少以太网还要使用ARP协议。不是所有的IP数据报都是UDP或TCP数据,因为比如ICMP、IGMP也用IP传送数据)。
IP协议在网络中当然非常重要了,所有的TCP、UDP、ICMP、IGMP数据都以IP数据报格式传输。
IP协议提供一种不可靠、无连接的服务。网络中的可靠性是交给上层的传输层负责,比如TCP协议。IP实际也提供了尽可能的服务,尽力发送了哈哈。无连接意思是,不维护一个后续数据报的状态(比如TCP交换数据前的三次握手,靠一对IP和端口维护连接),IP每个数据报都是独立的。比如说两个数据报从源端发送到目的端,先发的A,后发的B,但是他俩谁先到目的端都不一定,走的路由线路也可能不一样。
IP首部。每个协议的首部还是很重要和关键的,理解首部各个字段的意思很有必要...
IP数据报的格式如下:
一般数据报的头部占有20个字节,如果有选项数据(比如IP记录路由选项,记录时间戳都是放在这个字段里)就要再加上选项数据的字节长度。除了头部就是数据区了(显然如果从传输层过来的,那么这个数据区就会包含传输层的头部和他的数据)。
按照首部的网络字节序介绍下:
4bit 版本: 版本号,v4还有很多,路由也已经支持了v6。
4bit 首部长度: 首部长度指的是首部占32bit字的数目,包括首部选项。4bit最大(全为1)能表示15。那么15*32bit,表示最大首部长度为60个字节。
8bit 服务类型(TOS): 一些应用程序的类型,比如telnet、ftp、tftp smtp icmp等等。不同的程序有不同的TOS参数:比如最小时延、最大吞吐量 、最高可靠性、最小费用等。类如telnet这种程序,就要求交互性高一些(最小时延),ftp需要吞吐量大一些。(注:一般实现都不设置TOS这个字段,这些类型需要其他东西判断,比如根据端口号来区分是什么服务...)
16bit 总长度(字节数): 和首部长度以32bit为单位不同,这个是以8bit一个字节为单位。总长度是包括ip头部和数据部分。显然16bit的最大长度是65535。但是一般不会这么大,ip层数据报到了链路层,链路层会给数据报分片,不然太大了...分片时,这个总长度就是各个分片的总长度了。总长度是必须要设置的,因为链路层的数据帧(帧的数据部分就是这个ip数据报)有最小长度要求,如果不够需要补长,补长的话就需要在帧尾了,帧尾就污染到数据报了,所以如果有这个必要的ip数据报总长度,就能区分哪些是补长,哪些是数据报的数据哈哈。
16bit 标识: 唯一标识主机发送的每一个数据报。被分片以后,分片的每个分组中的标识是一样的。
3bit 标志: 3bit分为保留位,不分片位,更多片位。不分片位是1的时候不分片,0为分片。更多片位在分片中除了最后一个分组为0,其它分片都置为1,表示告诉接收端啥时候把这些分片完成组装的标志。
13bit 片位移: 用于数据报被分片时,记录这个大的数据报被分片了,距离该大数据报第0字节偏移了多少字节。类似于sql中的offset哈哈
8bit 生存时间TTL: 这个字段很有意思,比如ICMP协议中ping、tracerout命令都利用了这个TTL。一般来说,就是网络传输中,跨一个路由,TTL就减1。给他一个生存时间,避免一个包在路由中循环往复一直这么传播。到1或者0这个包就废废了,然后这个路由发回去一个ICMP包告诉源端主机情况。
8bit 协议: 表示上层协议是那种类型,是TCP、UDP、ICMP、IGMP等,识别那个协议向IP传送数据。
16bit 首部检验和: 首部(ip只计算首部的)检验和。发送数据报的时候,1).先把这个16bit全置为0;2).把头部中每个16bit进行相加; 3). 得到的结果取其反码。这个反码就放在16bit的检验和中。接收端接收时,执行上述的2,3步骤,如果值为16bit的1,表示传输正确。这也看出来IP协议也是尽可能的传输了哈哈。
32bit 源端ip地址: 发送端的ip地址。
32bit 目的端ip地址: 接收端的ip地址。
首部选项: 可以存储记录下通过的路由ip、通过的时间戳等信息。显然记录的长度有限。当今这么庞大的互联网,用的也比较局限。
========IP首部============
五类互联网地址和IP范围: 可以看到A类网址容纳主机数量最多,A类网址也比较少基本都分配完了。
IP路由选址:
如果是以太网的一个网段里,那么没必要跨路由器,根据mac地址找到目的端完成传送。
如果跨路由传输,那么就有一个路由传输的算法了,通常如下:
1). 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
2). 搜索路由表,寻找能与目的网络号相匹配(要用到子网掩码)的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
3). 搜索路由表,寻找标为“默认”的表目。如果找到,则把报文发送给该表目 指定的下一站路由器.
三个都没有,那么路由就给它抛弃了,并返回源端一个错误。
以太网中跨路由传输时,值得注意的是。数据帧的首部中目的地址,目的MAC地址,在每个链路里可能是变的,它一般总是指向下一个链路的MAC地址,比如网关路由的MAC地址;而ip首部中的目的地址,目的ip一般是不会变的。经过的路由通常都是根据这个目的ip进行路由的。
子网寻址:
一般来说,一个ip地址由网络号和主机号组成。但是一个网络号如A类、B类地址下边可以容纳太多的主机(B类也有16bit主机了),一般又不会这么多,就给主机号再分配了,分成子网号和主机号。
拿分配B类地址举例,有16bit的主机号,一般就是8bit的子网号,8bit的主机号。这样一个B类网络号,下边可以有254个子网,每个子网下又可以有254个主机(全0全1)。
子网掩码:
掩码是一个比特掩码。当然和ip一样也是32位,为1的是网络号+子网号,0的对应主机号。如果知道地址,那么就知道它是否为A类、B类或C类地址(从IP地址的高位可以得知),也就知道网络号和子网号之间的分 界线。而根据子网掩码就可知道子网号与主机号之间的分界线。
值得注意的是,如果子网号和主机号并非都是8bit的话,比如子网号占了10bit,那么主机号就是6bit了,这种变长子网。这样用点分十进制表示网络号+子网号的时候,最后一个点后边当然就不是0了~
-