ip
一个IP由首部和数据部分组成。首部前一部分的长度固定,共20B,还有最大40字节的可变部分.

版本:占4位,指IP的版本,比如是IPv4还是IPv6版本,通信双方的版本必须一致。
首部长度:占4位,由首部和数据部分组成。首部前一部分的长度固定,共20B,还有最大40字节的可变部分,因此IP的首部长度的最大值是 60 字节 。
总长度:占16位,指首部和数据部分长度之和,单位为字节,因此数据报的最大长度为(2^16 – 1) = 65535B。
标识(identification):占 16 位,用来产生 IP 数据报的标识。它是一个计数器,每产生一个数据报就加1,并赋值给标识字段。但这个 “标识” 并不等同于序号,因为IP是无连接服务,数据报不存在按序接收的问题。当一个数据报长度超过MTU时,必须分片,这个标识字段的值就会被复制到所有的数据报片的标识字段中,相同的标识字段的值使得分片后的各数据报片最后都能正确地重装成为原来的数据报。
标志(flag):占3位,目前只有前两位有意义。标志字段的最低位是 MF (More Fragment)。MF=1 表示后面还有分片,MF=0 表示最后一个分片。标志字段中间的一位是 DF (Don’t Fragment) 。只有当 DF=0 时才允许分片。
片偏移:占13位,它指出了较长的分组在分片后,某片在原分组中的相对位置。片偏移以8个字节为偏移单位,即每个分片的长度一定是8B(64位)的整数倍。
生存时间(Time To Live):占8位,表明这是数据报在网络中的寿命,即数据报在网络中可通过的路由器数的最大值。路由器在每次转发数据报前,就把TTL值减1。若TTL值减为零时,就丢弃这个数据报。
协议:占8位,指出此数据报携带的数据使用何种协议,及分组的数据部分应交给哪个传输层协议,如TCP、UDP等。其中值为6表示TCP,为17表示UDP。
首部校验和:占16位,校验数据报 头部 在传输中是否出错。这个字段只校验数据报的首部,不校验数据部分。注意这边不采用CRC检验码计算,采用的是其它更简单的计算方式,这里不展开。
源地址:占32位,表示发送端主机的IP地址。
目的地址:占32位,表示接收方的IP地址。
IP数据报分片
如果IP数据报的总长度大于以太网帧的MTU(Maximum Transmission Unit),就需要将IP数据报中的数据分装在两个或多个较小的IP数据报汇总,这些较小的数据报称为片.
分片方式:一个长为3820B的IP数据报(20B的首部,3800B的数据部分),需要被转发到一条MTU为1500B的链路上。这意味着原始数据报中3800B的数据必须被分配到3个独立的片中(每片也是一个IP数据报),如下图所示

ip服务的特点:无状态,无连接,不可靠
无状态:指的是IP通信双方不同步传输状态信息.ip数据报发出后没有先后之分,没有上下文关系,这种服务最大缺点是无法处理乱序和重复的IP数据报,不过胜在简单高效.接收端一旦接收到完整的ip数据报(如果是IP数据报分片则会先组装出完整的)就转交给上层.
无连接:指的是IP通信双方都不长久地维持对方的任何信息.因此,上层协议每次发送数据都需要指定对方的ip地址.
不可靠:指的是IP协议不能保证IP数据报能准确地到达接收端,它只能承诺尽可能交付.接收端在发现错误后会返回一个ICMP错误报文,接收端知道出错后告知上层,但不会重发数据报.可靠传输可由上层协议tcp实现.
NAT
接下来来介绍下网络地址转换NAT(Network Address Translation)。先来了解下什么是专用地址:专用地址是专门用作一些只需内部通信的机构使用的地址,无需连接到因特网,路由器看到专用地址就不转发,所以说专用地址作为目的地址是不可能在因特网上被传送的。
三种局域网地址:

现在的问题是:如果专用网想和因特网的主机通信,怎么办?这时NAT派上用场了。NAT的作用:所有使用本地地址的主机在和外界通信时,都要在 NAT 路由器上将其本地地址转换成全球 IP 地址,才能和互联网连接,工作过程如下图:

- 离开专用网时:替换源地址,将内部地址替换为全球地址。
- 进入专用网时:替换目的地址,将全球地址替换为内部地址。
NAT有个局限性:当 NAT 路由器具有n个全球 IP 地址时,专用网内最多只可同时有n台主机接入到互联网。所以此时NAPT(Network Address Port Translation)派上用场:
这样,用一个全球IP地址,就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。

专用网主机不主动联系因特网的主机,因特网的主机就一定不会主动联系专用网的主机(主动联系也联系不到)。
ARP(地址解析协议,数据链路层)
作用:从 IP 地址解析出 MAC 地址
每台主机都会有自己地ARP表,用于记录ip和mac地址的对应关系.TTl为生存时间,默认为20分钟

在主机发送数据报时,发送方主机A先在ARP高速缓存中查看是否有目的主机B的IP地址,有,就查其mac地址,并将此硬件地址写入MAC帧,然后通过局域网将改MAC帧发往次目的mac地址;如果没有,主机便指示适配器使用用MAC广播地址(即FF-FF-FF-FF-FF-FF)来发送ARP请求分组,ARP请求分组的目的是询问子网上所有其他主机和路由器,以确定对应于要解析的IP地址的那个MAC地址。
适配器在链路层帧中封装这个ARP分组,用广播地址作为帧的目的地址并将该帧传输进本网络中。当目的主机接收到该ARP请求后,便发回一个响应ARP分组,响应ARP分组包括了主机B的IP与MAC地址的映射关系,主机A收到后将次映射写入自己的ARP缓存,最后按查询到的mac地址发送MAC帧。
不同网络的通信,就是一次又一次地在各自网络进行ARP找出来的路径.
ICMP(网络层)
ICMP (Internet Control Message Protocol) 允许主机或路由器报告差错情况和提供有关异常情况的报告,ICMP最典型的用途是差错报告。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。ICMP 报文的格式如下图:


终点不可达:路由器或主机不能交付数据报时就向源点发送终点不可达报文。
时间超过:路由器收到生存时间为零的数据报,或者不在预先规定的时间内收到一个数据报的全部数据报片时,丢弃已收到的数据报并向源点发送时间超过报文。
参数问题:路由器或目的主机收到的数据报首部中有的字段值不正确,就丢弃所有已收到的该数据报片并向源点发送参数问题报文。
改变路由(重定向):路由器把改变路由报文发送给主机,让主机直到下次应将数据报交给另外的路由器。(简单来说:路由器早已通过和其它路由器交换信息,确认了比自己更优的转发路径。于是如果主机传送数据报时经过了该路由器,该路由器就会发送改变路由报文给主机,告诉它,最佳路线不是我哦,你应该选择另一个路由才能走最佳路线呢!)
ICMP差错报告报文,它的数据部分,由收到的需要进行差错报告的IP数据报的首部和其数据字段的前8个字节提取出来组成。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。
