IP协议的简介以及IP首部信息|8月更文挑战

665 阅读15分钟

介绍了IP协议的概念和IP首部的内容,以及相关知识点,ICMP、ARP、port、DNS。

前面我们简单的介绍了TCP和UDP协议以及TCP的三次握手和四次挥手,接着我们简单的学习IP协议以及相关知识点,下面的内容都非常简单。

@[toc] IP(Internet Protocol)协议位于网络层。主要功能是提供IP地址,将源IP地址和目的IP地址封装到数据包的IP首部中,为路由器指明一条数据传输的方向和路线,但它只指明发送者和接受者地址,并不维护任何关于后续数据报的状态信息,不保证数据包一定能到达,以及数据是否会被丢弃以及丢弃之后如何处理。

因此IP协议也是一个无连接、不可靠的、尽力而为的数据包传输服务,此时就需要上层的TCP协议来保证可靠性。

1 IP和MAC

要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC地址(Media Access Control Address)。

1.1 IP

IP 地址指明了节点被分配到的地址,是网络层及其以上层使用的地址。

IP 地址分为公有(广域网)IP和私有(局域网)IP。公有IP是服务商分配的,公有IP全球唯一,私有IP则在同一个网络下唯一,不同的网络下不一定唯一,并且都可能改变,我们连接互联网使用的IP都是公有IP。

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。

计算机只能识别二进制的数据,所以我们的IP地址应该是一个二进制的数据。但是呢,我们配置的IP地址确不是二进制的,为什么呢?比如:

十进制IP: 192.168.1.100 换算成二进制:11000000 10101000 00000001 01100100

实际上它确实会将十进制地址转换成二进制数据,但是假如真是使用:11000000 10101000 00000001 01100100来显示的话。以后与别人建立连接都要配置这样的IP地址,记忆起来就比较的麻烦。

所以,为了方便表示和人类记忆IP地址,我们就把IP地址的每一个字节上的数据换算成十进制,然后用.分开来表示:"点分十进制"。这就是IP地址显示为十进制的原因。

Windows查看本机IP可以使用ipconfig命令。

1.2 MAC

MAC地址是指网卡所属的固定物理地址,数据链路层和物理层使用的地址。

IP 地址可以和 MAC 地址进行配对。MAC地址是全球唯一,它是网络设备制造商分配的,用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。

MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址,其中前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的MAC地址,MAC地址在世界是唯一的。

2 IP首部

普通IP首部长为20个字节,最长60字节,除非含有选项字段,结构如下:

在这里插入图片描述

  1. 4位版本号(Version): 指定IP协议的版本号。因为目前仍主要使用IPV4版本,用于标识IP协议版本,IPv4是0100,IPv6是0110,也就是二进制的4和6。
  2. 4位首部长度(Internet Header Length): 用于标识首部的长度,单位为4字节(32bit),所以首部长度最大值为60字节,但一般只使用20字节的固定长度。
  3. 8位服务类型(Type Of Service): 简称TOS,定义IP封包在传送过程中要求的服务类型。包括一个3bit的优先权子字段,4bit的TOS子字段,1bit未用位但必须置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,4bit中同时只能置其中1bit为1,。如果所有4bit均为0,那就意味着是一般服务。
  4. 16位总长度(Total Length): 标识IP数据报包的总长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据包最长可达2^16 -1 = 65535字节,当数据包被分片时,该字段的值也随着变化。
  5. 16位标识(Identification): 用于标识IP数据报的唯一码,如果因为数据链路层帧数据段长度限制(也就是MTU,支持的最大传输单元为1500字节),一个过长的IP数据包需要被拆散进行分片发送,拆分出的每个分片的IP数据包标识都是一致的,当分片要进行重组的时候就是依据了这个标识。
  6. 3位标识(Flag): 目前只有两种,即只有后2位有意义;最低位为MF(More Fragment),为1代表后面还有分片的数据包,MF=0代表当前数据包已是最后的数据包。第二位为DF(Don't Fragment),DF=1代表不能分片,此时若这个包长度大于路由器的长度限制,则直接丢弃了,DF=0代表可以分片。
  7. 13位片偏移(Fragment Offset): 代表某个分片在原始IP数据包中的相对位置。通过这个偏移量和16位标识将多个分片数据包进行还原成原IP数据包。
  8. 8位生存时间(Time To Live): 简称TTL,表示数据包可以经过的最多路由器数。包在传输中每经过一个路由器TTL便减一,若TTL为0,则丢弃,一般不会经过255这么多,除非有循环路由。
  9. 8位协议(Protocol): 代表上层的传输协议类型,一般常见的1代表ICMP,6代表TCP,17代表UDP。
  10. 16位首部校验和(Header Checksum): 用于验证数据完整性,用以确保封包(分片)被正确无误的接收到,与UDP和TCP协议包头中的校验和作用是一样的。首先通过校验算法填入16位的值,当目标机器收到后重新进行校验算法并进行比对,若相同代表没有出现问题。
  11. 16位源IP地址与16为目标IP地址。

2.1 相关问题

  1. 为什么IP不是可靠连接的协议?
    1. IP层没有连接握手协议,没有超时和重传机制。IP协议只是为路由器指明一条数据传输的方向和路线,但它只指明发送者和接受者地址,并不维护任何关于后续数据报的状态信息,不保证数据包一定能到达,以及数据是否会被丢弃以及丢弃之后如何处理。
  2. IP数据报经过路由器都做了哪些改动?
    1. IP每经过一个路由器,TTL数就会减一,如果最后TTL为0了,但是依然没有到达目的地,这个IP包将会被丢弃。
    2. 这样做了目的是为了防止出现循环回路。并且最后一跳的路由器会发送一个ICMP不可达的数据包给源IP。
  3. IP包分片
    1. IP数据包的长度为16,也就是说最大为65535个字节。但是据链路层规定MTU(Maxitum Transmission)最大传输单元为1500个字节。
    2. 当IP数据包的大小超过了1500,IP数据包必须要进行分片处理。这还只是初始发送端的分片,在网络中如果某个路由器的MTU小于1500,那么还需要在路由器端做分片,这就给IP包的完整接收照成了很大的不确定性(我们知道数据包达到终点不一定是按照顺序的),因为万一某一个分片丢失,可能会造成IP重传,当然前提是高层协议支持重传(比如TCP支持重传,UDP不支持)。
    3. 对于TCP协议,不存在分片的问题,因为TCP报头的选项字段有MSS(Maximum Segment Size,最大报文段大小)字段,规定一个TCP包最大可传输的字节数,一般是1500-20-20=1460字节。也就是说到达IP封包的时候最大可承载数据只有1460个字节,这样就可以避免分片的问题。但是对于UDP这一类的协议,分片操作还是交给IP完成,虽然这样可以增加载荷的效率,但是稳定性会受到很大的影响。

3 ICMP协议

ICMP(Internet Control Message Protocol)协议,即Internet控制报文协议,是IP协议的附属协议,同属于网络层。它主要用于直接在两个IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用,因为它可以在用户传输真正的消息之前校验是否满足传输条件!

常用的ping命令,用于测试本机与指定的ip地址网络层的连通性,实际上就是使用的ICMP协议。

4 ARP协议

通过TCP/IP协议分层7层模型以及数据的封装和分用讲的分层信息传输我们知道,网络层依赖于链路层,IP数据报必须封装成帧,而数据帧的首部必须要封装有目的MAC地址,这样才会将数据发送到指定MAC地址的主机中,因为链路层的数据传输是不认识IP地址,它只认识MAC地址,所以两个有IP的设备要进行通信还要依赖于底层的MAC地址,因此仅仅知道对方IP地址是不能实现信息传输的,IP间的通信依赖下层的MAC地址。

此时就用到了ARP协议(AddressResolution Protocol),即地址解析协议,ARP协议根据目标设备的IP地址就可以找到目标设备的MAC地址,是连接网络层和链路层的重要协议。通常ARP缓存了同一个局域网的IP和MAC地址的对应关系,但是,如果通信双方不在同一个局域网类,则无法直接通过对方的IP地址查找到MAC地址,此时ARP会查找并返回网关(通常是路由器)的MAC,那么数据实际上会被转发到网关,后续在网关中再次通过ARP查找,找不到就继续转发到其他网关,最终会找到对应IP地址的MAC,将数据传递到指定的目的地!

如下是不同局域网的的通信案例:

A—–(B1-B2)—–(C1-C2)——-E

B1和B2是网关(路由器)B上的两个接口,C1和C2是路由器C上的两个接口,A和E是PC,由主机A向主机E发送数据包,那么在主机A形成的数据包的目的IP就是E的IP,源IP就是主机A的IP地址,目标MAC地址就是B1的MAC地址,源MAC地址就是A的MAC地址。

由A发给路由器B,路由器B检查MAC是自己,但是目标IP不是自己的IP,那么说明这个消息的真正目的不是自己,而是需要自己转发,那么B经过重封装后,源IP和目标IP是不变的,源MAC地址变成B2的MAC地址,目标MAC地址变成C1的MAC地址,封装完成发送给路由器C,路由器C接收到数据包后和B做的操作是一样的,源IP和目标IP的不变的,源MAC地址变成C2的MAC地址,目标MAC地址变成主机E的MAC地址,然后发送给主机E,主机E校验IP发现目标就是自己,这样E就收到了这个数据包,可以解析 数据,当回复数据包的时候就是把收到的数据包的源IP地址(主机A的IP地址)和源MAC地址(接口C2的MAC地址)作为他的目标IP和目标MAC地址。

实际的ARP查询更加复杂!

5 port 端口号

端口有物理端口,比如网卡口,也有逻辑端口,我们指的就是逻辑端口。

我们如果仅仅知道MAC和Ip地址,那么只能保证把数据传输到指定的主机中,但是主机中有很多应用程序,怎么知道这是属于哪个应用程序的数据呢?这就需要端口来支持了,数据要想发送到对方主机指定的应用程序上,只有先标识这些应用程序,所以给这些网络应用程序都用数字进行标识,这些数字就叫做端口号,用来表示该主机中的一个应用程序。简单的说,端口号能够唯一的确定某台计算机当中的某个应用程序,因此端口号在一台主机中是唯一的,不能冲突,如果我们直接启动两台tomcat而不修改端口号的话,就会报端口冲突异常!

常用应用程序的默认端口号:

tomcat 8080
Mysql 3306
Oracle 1521
SMTP(简单邮件传输协议) 25
POP3(邮局协议) 110
FTP(文件传输协议) 21
HTTP(超文本传输协议) 80

端口号的范围是[0- 65535],一共65536个数字。建议0-1024范围的端口不要使用,这都是系统进程预留的端口号。如果使用这些端口号,可能造成端口冲突,会造成某些功能不能使用。

6 DNS 服务

DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的协议。它提供域名(domain name)到 IP 地址之间的解析服务。

计算机既可以被赋予IP地址,也可以被赋予主机名和域名,用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。没有它,你想上百度就要记住百度的IP,上163就要记住163的IP,有了DNS的处理,你只需要记住对应网站的域名--也就是网址就可以了。

但是计算机却不擅长处理名称,而是擅长处理一长串数字。为了解决上述的问题,于是DNS服务应运而生。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。

设置我们的windows电脑的DNS路径解析,可以找到C:\WINDOWS\system32\drivers\etc\hosts文件,添加如下内容:

127.0.0.1 localhost 127.0.0.1 www.baidu.com 127.0.0.1 news.baidu.com

即可实现,域名和IP地址的映射!

7 其他知识

7.1 子网掩码

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。

子网掩码——屏蔽一个IP地址的网络号部分的“全1”比特模式。对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0

7.2 默认网关

网关实质上是一个网络通向其他网络的IP地址,要实现这两个网络之间的通信,则必须通过网关。TCP/IP协议里的网关是最常用的。

默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关,默认网关是子网与外网连接的设备,通常是一个路由器。

一台电脑的默认网关是不可以随随便便指定的,必须正确地指定,否则一台电脑就会将数据包发给不是网关的电脑,从而无法与其他网络的电脑通信。

默认网关的设定有手动设置和自动设置两种方式。

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!