TCP/IP illustrated 阅读笔记(三) IP协议

1. 什么是IP协议:

Internet Protocol,工作在网络层,是TCP/IP协议族中的workhorse协议(意思就是IP是个搬砖的),是一个提供最best-effort(尽最大努力)的无连接的协议(无连接指不会维护连接状态,比如建立连接之类的)。IP协议不只IPv4 和IPv6,只是IPv4使用最为广泛,而IPv6是IPv4的继承者


2. IPv4首部说明

TCP/IP illustrated 阅读笔记(三) IP协议_第1张图片

首部后面跟着的数据段,存放的是payload(用户数据,这里的用户指的是上层协议)

Version:

IP协议版本,ipv4的 version为4

IHL:

Internet Header Length: 首部长度,注意是首部的长度,标识有多少32bits。之所以长度是变化的是因为最后面的options段,一般没有options段,此时IHL为5,总共20bytes。

DSField and ECN:

这两个是由早期的ToS(Type of Service)段分割出来的的。DSField(DifferentiatedServices Field),功能和早期的Tos类似,用于标识服务类型(一般会涉及到优先级的问题),DSFiled又分为class 和Drop Probability两个段,前者继承自Tos,标识服务类别,后者顾名思义,用于再路由器需要丢包时,决定先丢哪个。具体的机制没有自己地去研究了。ECN(explicit Congestion Notificatio),用于网络堵塞时,路由器会在堵塞方向的包中给ECN置位,通过数据包接受者路上出现堵塞了(ECN被置位表示路上至少经过一个路由器时发生了阻塞),然后接收者就会把这个消息告诉发送者,让他慢点发,或者不发了(这是上层协议的事情了)

TotalLength:

 指IP packet的总长度(包括首部和数据域)

Identification:

这里是用于IP分段时表示用来标识不同IP包产生的分段,每个IP包的分段的Identification的值是一样的。

Flags

总共3bit
bit 0: Reserved; must be zero.
bit 1: Don't Fragment (DF) ,即告诉路上的路由器不要对我进行分片,那么路由器该怎么办呢,不分片就不能传输了,所以就丢掉,路由器表示怪我喽
bit 2: More Fragments (MF),为1表示我后面还有分段,为0表示爹是最后一个分段了,

Fragment Offset

用来标识当前IP分段的第一个用户数据的字节相对于原始数据第一个字节的偏移量,单位大小为8bytes,比如该值为n时,标识偏移量为n*8 bytes,该值为0时,说明这是第一个分段,偏移量为0嘛

TTL

Timeto Live,用来设置一个包在网络中最多走多少跳的,每经过一个路由器,TTL的值就会减一,如果为0,路由器就会丢包,并且给发送者一个ICMP消息,告诉他你的包被大爷丢掉了。但是名字为什么是Time to Live。怎么不是hops to live呢,因为早期判断丢包是用在网络中待的时间来判断的,后来改成用跳数判断了,名字还是用的老名字

Protocol:

IP协议号,和Ethtype类似,Etytype用于标识以太帧里面封装的协议类型,这里的IP协议号用于标识封装在IP包内的协议。UDP为17,TCP为6,但是IP内也是可以封装IP的(这个涉及到隧道的概念了),IP自己的IP协议号为4.

HeaderCheckSum:

头部校验和,使用InternetChecsum算法,计算出来的校验和。注意IP的校验和只只计算IP头部,不会计算数据域的。具体算法参考https://en.wikipedia.org/wiki/IPv4_header_checksum,算法逻辑挺简单的,感兴趣的可以看一看。

Source/DestinationIP Address:

每个都是32bit,源IP地址,目的IP地址

Options:

一般情况下IP的头部是不会包含这个的,就算包含了,现在的路由器一般也都会忽略掉或者自动剥掉options。这个是在早期网络的特有条件下设计出来的(比如当时网络拓扑比较小)


3.IP Forwarding

router与host的区别:首先他们都有转发功能,但那是host只转发目的ip为自己的包(没有路由的功能),而路由器有路由功能。但是这两个概念不是互斥,现在的host也可以路由(个人热点、共享网络)。

3.1 direct delivery与 indirect delivery

direct delivery:

源主机和目的主机在同一个二层网络(比如以太网)(一个网线连着或者通过一个或多个二层交换机相连),不需要经过路由器的转发(网络层),就可以直接交付给目的主机。这一层实际上并不需要进行ip地址的路由,ipv4中通过arp协议可获得目的主机的mac地址,源主机的数据链路层会直接将ip包封装在以太帧中并发给目的主机的数据链路层(数据链路层的网络是mac)。所以叫做direct delivery (应该叫直接发送或者直接交付吧)

indirect delivery:

源主机和目的主机不再同一个二层网络中,这个时候就需要路由器了,路由器就是用来连接两个或多个二层网络的设备(同类二层网络或者不同类二层网络均可),indirect表示需要通过路由器进行转发,路由器转发时从一个端口获得以太帧,根据转发规则确定下一条的ip地址,然后再对ip包进行封装(源mac变为路由器的发送端mac地址,目的mac改为下一跳的mac地址),这个过程中如果没有NAT之类的协议或者非法篡改的话,源ip和目的ip是不会发生变化的。如果路上有多跳,每个路由器都会不断重复剥离以太帧头部,判断转发动作、然后丢掉或者重新对ip包进行封装,直到到达最后一跳路由器,然后这个路由器和目的主机之间又以类似于direct delivery的方式将ip包发送给目的主机

3.2 转发表(Forwarding table)

转发表一般至少由4个域组成(一个转发表有多个entry,每个entry有4个域)

Destination:

目的ip地址,包中的目的ip与mask与操作后和这个Destination进行比较,判断包的目的ip是否在这个Destination中

Mask:

掩码,与包的目的ip进行与操作后获得Destination(类似于子网掩码,或者prefix,产生的Destination其实是一个子网号或者子网段(prefix))、

Next-hop:

下一跳的ip地址,如果是最后一条,这里的next hop都是当前host或者router发送端口的ip(最后一跳实际上实在二层转发的),如果不是最后一跳则是下一条的ip地址,下一条的ip地址有时候就是网关(一般当当前跳为局域网内的主机时,下一条的ip地址是网关)

Interface:

标识从当前路由器或者主机的哪个端口发出去,因为可能是多interface的(一般为多网卡),这个域存储的是发送的interface在当前网络上的ip地址。


4. Host Modles

这种问题只会出现在多网卡的host上

strong host model:

这种模式下,interface(一般就是一个网卡)只会发送和接收源地址或目的地址为本interface的packet,这种模式安全系数较高,但是不灵活,windows一般默认为这种模式

weak host model

这种模式下,多个网卡,只要源地址或者目的地址可以match上任意一个本地的ip地址(多网卡多ip地址),就会正常发送接受。这种模式安全系数低,但是比较灵活,linux一般默认为weak模式


5. Address Selection

多interface的host(router),在发送数据时,选择哪个interface的ip地址,接收端如果是多地址,那么该选择哪个ip地址作为目的ip。这个涉及到地址选择算法,没有仔细看了

 

 

 

 

 

 

 


你可能感兴趣的:(读书笔记)