1.简介
IP协议是TCP/IP协议族中最核心的协议。所有TCP、UDP、ICMP和IGMP都以IP数据报格式传输。
IP协议有如下两个特点
- 不可靠: 不保证数据报能成功到达,可靠要求只能用由上层提供(例如TCP)。
- 无连接: 简单来说,就是一次发送一个,每个数据报相互独立,因此不保证顺序。
2. IP首部
IP首部一般为20字节,这里贴出来并只讲核心字段。
- 4位版本号: 目前是4,因此IP也称作IPv4,当然目前已经在普及IPv6的使用,IPv4会逐渐被IPv6取代。
- 首部长度: 指首部占32bit字的数目,一般的IP数据报的这个值就是5,由上图所示。
- 总长度字段: 指整个IP数据报的长度,该字段为16bit,因此IP数据报最长可达65535字节。这个字段很重要,因为某些链路需要填充数据达到最小长度,因此需要知道总长度来判断内容。
- TTL(time-to-live): 生存时间字段设置了数据报可以经过的最多路由器数。初始值由源主机设置(一般为32或64),每当经过一个路由器就减1,当减到0时,数据报丢弃并发送ICMP通知源主机。
3. IP路由选择
如果源主机可以直接找到目的主机,则直接发送,否则源主机将数据报发送至默认路由器上。
IP层在内存会有一个路由表,发送数据报时会搜索该表,如果
- 目的主机是自身: 根据协议字段送至指定模块处理,
- 否则: 如果自身有路由器功能则继续转发,否则丢弃。
路由表会有如下信息(注:网络地址可理解成一堆划分出来的子网共用一个对外的公共地址,具体指IP地址和子网掩码运算的公共地址,后面会讲。)
- 目的IP地址: 可以是一个完整的主机地址,也可以是网络地址。
- 下一跳路由器的IP地址,或有直连的网络地址
- 标志:
第一个标志指明目的IP是网络地址还是主机地址
第二个标志指明下一站是路由器还是一个直连的接口 - 为数据报传输指定一个网络接口
简单来说IP层传输并不知道整条线路是怎样的,它只是不断转发而已,直到某个路由器找到了目的地址。
4. 子网寻址
IP地址由网络号和主机号组成,网络号决定了地址类型,主机号决定具体地址,而子网编址要求主机号再分成子网号和主机号。
子网的出现原因是A类地址和B类地址分配太多空间。
以B类为例,可以按照下图划分子网。
这样划分可以缩小路由表规模,其他主机如果想要发送数据到某一个具体到主机号的子网,它依然要指定具体的IP,但是路线上的路由器只需要存储到子网号的地址即可,这就意味着一个子网号代表了它划分的一堆子网去接入Internet。
5. 子网掩码
上面的寻址有一个问题,就是我只知道目的IP,而不知道它划分的子网具体到几位,这时候就需要子网掩码进行计算。
子网掩码一般是32bit的值,为1的bit留给网络号和子网号,为0的bit留给主机号。
求子网号的运算方式是:子网掩码和目的IP按位与
以第一种子网掩码为例,假如我有一个主机地址是140.252.1.1,则显然按位与的结果就是140.252.1.0,这个就是计算出来的子网号。
这里看出来子网掩码有一个特点,因为网络号和子网号都在最前,所以子网掩码一定是前n位为1,剩余后32-n位为0,所以我们的IP地址可以写成140.252.1.1/24,意味着前24位为1,简洁易懂。
6. ifconfig&netstat
这两个命令应该都不陌生,ifconfig可以查看本机的IP和网络接口的一些信息,netstat常用来查看端口占用以及其他网络信息。
ifconfig
这里给出书里的一个ifconfig -a的例子
这里可以看到不同接口的IP地址,选项(broadcast为广播地址),目前大多数的局域网都是以太网,所以我们使用命令会看到eth0以太接口(现在服务器基本都支持ipv4和ipv6,所以我们除了inet还会看到inet6),和一个lo的环回接口。
netstat
我们常用的查看端口命令netstat -anp
- -a: 显示所有连线中的socket
- -n: 直接使用IP地址,而不通过域名服务器
- -p: 显示正在使用Socket的程序识别码和程序名称
还有其他很多参数可以看到网络使用情况,上节链路层也有用到这个命令查看接口的MTU。