易栈 · 一盏

塞外秋来,衡阳雁去

网络层:IP

一、IP:网际协议

IP提供不可靠无连接的数据传输。不可靠表示不能保证IP数据报能成功地到达目的地。如果传输过程中出错,IP的处理方法是:丢弃该数据报。无连接表示IP不维护任何关于后续数据报的状态。

IP数据报格式:

版本|首部长度|服务类型TOS|总长度|标识|标志|片偏移|生存时间TTL|协议|首部校验和|源IP地址|目的IP地址|选项部分|数据

首部长度:IP数据报首部的长度,单位为32位(表示有多少个32位)。由于该字段占4位,所以首部长度最长为15*32/8=60字节。在没有附加选项的时候,首部长度为20字节(重要!在估算数据报长度时常常会用到)。

总长度:整个IP数据报的长度,单位为字节。由于该字段占16位,所以IP数据报最长可达65535字节。总长度字段是IP首部中的必要内容,一些数据链路(如以太网,要求数据部分最短为46字节)需要填充一些空白字节以达到最小长度,这时如果没有总长度字段,就不知道链路层给出来的数据中哪些是数据,哪些是填充字节。另外TCP首部中只记录了TCP首部长度,没有TCP报文段总长度,所以TCP报文段中的数据长度是靠“IP数据报总长度-IP首部长度-TCP首部长度”算出。

TOS:服务类型(type of service)字段。包括优先权字段(3位,已弃用)+TOS子字段(4位)+未用位(1位,必须置0)。TOS子字段的4位分别表示:最小时延、最大吞吐量、最高可靠性和最小费用。可以根据应用类型的不同,选择不同的服务类型。例如Telnet作为交互应用要求最小时延,而FTP文件传输要求最大吞吐量。

标识唯一地标识主机发的每一份数据报。通常每发一份报文它的值就会加1。

标志&片偏移:当IP层发现要发送的数据报的长度大于链路层的MTU时,就会把数据报分片。同一个数据报的每个分片的标识字段都是相同的。片偏移表示当前分片中的数据在原数据报(分片前)中的起始位置(相对于原数据报的开头的偏移量)。标志字段占3位,但只有2位起作用:

  • 更多的片”位(MF,more fragment):表示当前分片还不是数据报的最后一个分片,后续还有更多的分片
  • 不分片”位(DF, don’t fragment):表示禁止把当前数据报分片。如果一个数据报长度超过了链路层MTU,又不允许分片,那么IP层会给源主机返回一个ICMP不可达差错,这个性质可以用来探测MTU。

IP数据报被分片了之后,只有到达目的地才会被重新组装。分片可能发生在源主机上,也可能发生在中间路由器上。如果中间路由的MTU越来越小的话,已经分片过的数据报可能会再次进行分片。收到第一个分片后,IP层会启动一个定时器。如果定时器超时而数据报片还未能全部到达,就会将这些数据报片丢弃,从而避免因为分片丢失而导致接收端缓存满。

TTL:生存时间(time-to-live)字段。TTL的初始值由源主机设置,每经过一个路由器,它的值就会被减1。当TTL的值为0时,路由器会丢弃这个数据报,并且给源主机返回一个ICMP超时信息。所以TTL是数据报能经过的最多路由器数,也是报文在网络中的生存时间。

协议:标识所传送的数据的协议类型,例如TCP、UDP、ICMP等。

首部校验和:注意这个校验和只校验IP首部,不校验数据部分。校验和字段占16位,它的值等于首部中每个16位的反码求和(包括校验和字段,只是初始时将校验和置0)。接收方收到数据报后,同样对首部的每个16位的反码求和(包括校验和字段,相当于将检验和与它的反码相加),结果应该为16位的全1。如果不是全1,表示首部数据出错,则IP将丢弃该数据报。路由器对TTL字段减1之后,需要相应改变校验和。ICMP、IGMP、UDP和TCP都采用相同的校验和算法

本文链接:易栈 - 网络层:IP