文章目录
- 网络层
- IP协议
- 网段划分
- IP地址数量问题
- NAT技术
- DNS
- ICMP协议
- 数据链路层
- 以太网
- MTU的影响
- ARP协议
网络层
作用: 在网络环境中确定消息传输的路径。
主要协议: IP协议。
IP协议
IP协议的基本概念:凡是入网的机器都会有一个IP地址,用来表示该台机器在网络中的标识。
- 路由器:配有IP地址
- 主机:配有IP地址,但是不进行路由控制的叫主机。(我们用的电脑手机等都是主机,现在的电脑也可以当路由器。)
协议格式: 在之前的TCP/IP四层协议力说过,其实每一层传输信息都需要对应的 报头来区分数据。IP协议也有。
4位版本号:标识IP协议的版本,对IPV4而言就是4,IPV6就是6.
4位首部长度:用来标识标识IP头部的长度,其单位是4个字节,而4个比特位最大是15,因此对应的最大长度就是60字节
8位服务类型(type of service ): 3位优先权字段(已经不再使用),4位TOS字段,和一个保留字段(必须置为0)。4个位分别是 最小延时,最大吞吐量,最高可靠性,最小成本。四者只可选其一,因为是互斥的,根据不同的应用类型来选择。
**16位总长度:**表示整个报文的长度
16位标识: 如果IP报文在数据链路层被分片,同一份IP报文的这个分片的标识ID应该相同。
**3位标记字段:**第一位是保留字段,第二位为1,表示禁止分片,如果这个时候长度超过MTU(数据链路层的最大传输单元),报文直接丢弃。第三位表示更多分片,就是说如果有分片就会做一个标记。
**13位分片偏移:**就是说这份IP报文分片时是相对于最初的那个分片的偏移量,便于后面组装报文。
16位校验和:用于CRC进行校验,鉴别头部是否损坏。
为什么IP报文要有上述校验和等字段,在后面的数据链路层会提及。
网段划分
先来认识IP地址的。
IP地址分为两个部分,网络号和主机号。
- 网络号:保证互相连接的两个网段的不同标识
- 主机号:同一网段内,不同的主机具有相同的网段号,但是主机号必须不同。
通过上面的描述,你可能也猜出来。
网段划分:其实就是将一个大的IP网络分为多个小的网络,这些子网络之间用于标识的就是网段号。
子网:子网的构成就是将网络号的主机放在到一起,但是主机号不同就构建成了子网。子网中若新增主机,那么不允许主机号和其他主机重复。
这时候你可能有疑问?你说你平时看见IP地址有何别人一样的是为什么,但是明显那些主机不在同一个网络。这个设计一个NAT技术,后面再提。
曾有A-E类网络地址的划分方法,但是其对于如今网络世界弊端过于严重,几乎少有那种说法。这里给出其地址范围。
- A类 0.0.0.0到127.255.255.255
- B类 128.0.0.0到191.255.255.255
- C类 192.0.0.0到223.255.255.255
- D类 224.0.0.0到239.255.255.255
- E类 240.0.0.0到247.255.255.255
现在普遍使用的是CIDR,方案也就是上面提出子网的来源。
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
- 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
如果你曾查看过Linux的IP或者windows下的IP都会发现有一个子网掩码,将你的IP地址按位与上你的子网掩码就能得到你的主机号。
比如下面
** 特殊的IP地址:**
- 如果在一个网段之中,其中的IP地址之中的主机号全是0,那么这个IP地址就是该网段的网络号,代表了这个局域网
- 如果在一个网段之中,IP地址的主机号全是1,那么该IP地址往往用于作为广播地址,用来给相互连接的主机发送数据包。(这里不理解没关系,后面的数据链路层有解释)
- 127.*的IP地址往往用于本机环流测试,一般用127.0.0.1
IP地址数量问题
IPV4是一个32位整数,那么只有43亿左右的地址数量,而根据TCP/IP协议每一台主机都要有自己的IP地址。(早期互联网是够的,但目前看来完全不够,手机,联网等手表都需要IP地址)
CIDR在一定程度上缓解了上面问题,但是没有实际上起到好的效果(毕竟可用IP数没变)
一般有如下解决方案
- 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
- NAT技术
- IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;
目前而言,IPV6技术并没有大面积普及,大多数多是靠前两个方案来解决问题。
NAT技术
私有IP地址和公网IP地址:如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
10.*,前8位是网络号,共16,777,216个地址
172.16.到172.31.,前12位是网络号,共1,048,576个地址
192.168.*,前16位是网络号,共65,536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,
最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上,拿去需要取服务器上买公网IP乐,也就是云服务器之类的服务。
路由:在复杂的网络结构中,找到从源主机到目的主机找到一条路线,的过程就是路由。
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
依次反复, 一直到达目标IP地址。至于具体算法,那就涉及图等计算,这里不多做解释。
我们知道,IPV4地址是严重不足的,既然如此IPV4没有被淘汰呢?原因就是NAT技术。
NAT:能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法
比如你的windows 电脑的地址就是,192.168.184.128的地址,那么其通过你路由器转换之后,在往上一层传输时,IPV4的地址可能就变成了182.168.1.123了。在每次做这个的时候,你的路由器都给你做一张表,说192.168.184.128这个地址,是甲主机的,当对方有数据发过来。他家把数据转发给你即可。如此不断操作直到公网之间的主机互相交换数据即可。
如果你理解了上面的问题,不妨来看看这个。我们知道一个子网里面往往不止一个主机吧,那当不止一个主机需要访问公网的同一台主机又该如何呢?
NAPT:NAPT技术就是解决这个问题的,不同的客户端访问公网机器时,用我这个路由器不同的端口去访问即可。当公网的那台主机返回数据到不同的端口,我再将其发回不同的主机就行。
NAT技术真就完美了?
答案并不是,NAT依赖上述的转换关系,也就是你的路由器都得有对应的功能来实现这个NAT转换技术。
同时实现NAT转换不需要消耗路由器的性能吗?
再来就是一旦NAT设备,比如路由器出故障,那我所有连接于此的设备全部TCP连接都会断开,(相当于与是路由器和外面的机器连接起来的,而你是与路由器连接的)
同时还有一个伴随问题就是NAT穿越问题,我们知道TCP连接理论上建立的链接时对等的,但是这往往导致我们很难从公网中访问我们的私网里的设备。因为IP地址和PORT都被更改过,同时由于动态IP分配的技术,可能每次都在变化,这样就导致访问私网设备很困难。
NAT技术虽然使得公网访问私网难,但是也让一些问题变得容易,比如公司的服务器群,就让一个单独的服务器来做公网收发数据,由此能形成很好的隔离性。
DNS
DNS(Domain Name System):是一整套从域名映射到IP的系统。
在我们显示生活中,我们访问网站的时候,几乎很少说我要访问哪个IP地址,这样不好记住,也很麻烦,因此就有了域名.
域名: 主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.
com: 一级域名. 表示这是一个企业域名. 同级的还有 “net”(网络提供商), “org”(非盈利组织) 等.
baidu: 二级域名, 公司名.
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议
一开始呢,主机名是用 hosts(如果有小伙伴改过windows上的hosts文件) 文件记录域名和IP地址的对应关系。
这就类似一个电话簿,我每次想要和哪个主机联系查IP地址就好了。但是网络中主机太多了,我每次都要更新电话簿未免给用户的成本过高了。
因此就有了DNS。就是专门的机构来做这个域名解析工作,而你每次上网访问网站的时候呢,你就直接访问那个机构的域名解析,他呢就给你返回IP地址了。比如我们国家的114.114.114.114就是常用的域名解析站点。
ICMP协议
ICMP协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因.
ICMP正是提供这种功能的协议; ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
既然是一个协议,定然也有其对应报文,这里不做过多介绍。
我们常常使用的ping 命令就是基于这个ICMP协议的。
数据链路层
以太网
先来认识以太网:
以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等
以太网的帧格式
源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
帧末尾是CRC校验码
从以太网的帧格式我们可以看出,最长只能有1500字节的数据,然而前面IP报文最长可是远超这个数据量。这也是为什么IP报文会有16位标识符和13位偏移量等。
而这个以太网数据帧所限制的大小,称之为MTU(以太网最大传输单元),这个实际上时物理层产生的限制,而并非数据链路层的问题。
MTU的影响
MTU对IP层的限制:
前面IP报头有16位标识符和13位偏移量等,就是因为一个IP报文可能依次没办法直接发送完全,这就导致需要将一个IP报文拆成多个发给对方主机。而这些16位标识符,和13位偏移量就是便于对方主机收到被拆开的IP报文来重新组装的。
注意:IP报文太长被拆开后,每一个拆开的IP报文都是有完成的IP报头的。这也就导致下面的计算情况。
一个IP报文3000字节长,MTU是1500字节,那么要分成多少个IP报文呢?
答案:3个。因为每一个新的被拆开的IP报文都要有报头,报头至少20字节。因此拆开之后,需要 额外的报头。
MTU对UDP协议的影响
我们知道UDP是管发不管到的,也就是说如果UDP协议的数据,大于 MTU-20(ip首部)-8(UDP首部) 的字节数,那么UDP协议的丢包概率就会成倍增加。
MTU对于TCP协议的影响:
那么TCP的数据报也不能无节制的的大,肯定也要受限与MTU来使得数据丢失概率降低。而TCP数据报的单个长度称之为MSS(MAX Segment Size)
TCP链接时,通信双方协商过程,实际就进行了MSS协商,来达成这个正好使得IP报文不分割的值。
ARP协议
ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议
作用:ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
ARP协议帧格式。
字段 | 目的MAC地址 | 源MAC地址 | 类型 | 硬件类型 | 协议类型 | 硬件地址长度 | 协议地址长度 | 操作码 | 发送者硬件地址 | 发送者协议地址 | 目标硬件地址 | 目标协议地址 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
长度 | 6字节 | 6字节 | 2字节 | 2字节 | 2字节 | 1字节 | 1字节 | 2字节 | 6字节 | 4字节 | 6字节 | 4字节 |
描述 | 通常为广播地址(FF:FF:FF:FF:FF:FF) | 发送ARP请求的设备的MAC地址 | 0x0806,表示这是一个ARP帧 | 0x0001,表示网络接口类型为以太网 | 0x0800,表示要映射的协议地址类型为IPv4 | 6,表示硬件地址(如MAC地址)的长度 | 4,表示协议地址(如IP地址)的长度 | 1表示ARP请求,2表示ARP应答 | 发送ARP请求的设备的MAC地址 | 发送ARP请求的设备的IP地址 | 在ARP请求中通常为0,因为不知道目标的MAC地址 | 要解析的IP地址 |
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型,1为以太网;
协议类型指要转换的地址类型,0x0800为IP地址;
硬件地址长度对于以太网地址为6字节;
协议地址长度对于和IP地址为4字节;
op字段为1表示ARP请求,op字段为2表示ARP应答
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
因此在通讯前必须获得目的主机的硬件地址;
源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址