"你说不爱了,又依依不舍。"
IP协议的基本概念
主机:配有IP地址,但是不进行路由控制的设备。
路由器:既配有IP地址,又进行路由控制。
节点:主机 && 路由器的统称。
所谓IP协议,就是实现主机 与 主机,跨网络的 通信!
dst IP=目标网络(号)+目标主机(号)
1.先找到主机所在的网络
2.在确定网络中,找到对应主机。
认识任何报头,重中之重在于:
1.报头与有效载荷的分离。2.有效载荷 交付上层哪个协议。
4位版本号:指定的IP协议的版本(IPV4)
4位首部长度:同TCP报头一样,每位 表示4字节的IP报头大小。
8位服务类型:4位TOS表示,'最小延时','最大吞吐量','最高可靠性'....
16位总长度:IP数据报的总长度。
根本上是因为TCP是面向字节流!
8位生存时间(TTL):数据报到达目的地的最大报文跳数。每经过一个节点.--TTL。防止循环跳转。
8位协议:表示上层协议(如:TCP)。
16位首部校验和:使用CRC进行校验, 来鉴别头部是否损坏
下面的第三四层很简单,也就不过多赘述。
我们知道IP协议具有实现主机与主机 跨网络通信的 能力。但是,拥有这种能力的根本,在于下层数据链路层(MAC帧)。
其中,MAC限定了其有效载荷的大小:MTU ==1500;因此,如果MAC的上层协议 传输的数据 > MTU(1500) ,那么就会自动把多余的部分丢失,这当然是不被允许的!
IP的分片与组装,仅仅由IP来进行处理。它的上、下层协议根本不关心!
16位标识: 唯一标识主机发送报文的id。
3位标志: 第二位标识禁止分片,数据字节超过MTU机会被丢弃。第三位为1,标识进行了分片。为0,类似于一个结束的标致。
13为片片偏移: 分片后,每一个报文的段位置。
上面条件都满足。也就说明分片报文已经全部收到。可以进行组装。
MTU=IP报头+IP数据
MMS: 最大传输尺寸。在TCP握手阶段 建立。
在前面也提到过,IP地址分为两个部分,网络号和主机。
网络号:保证两个相连,但并不相同的 “网段”。
主机号:同一个网段内,网络号相同,但必须有唯一标识的主机号。
可以看出,不同的子网(局域网),可以把相同网络号,不同主机号的主机连接在一起。
子网中,每新增一台主机,则这台主机的网络号,和子网的一致。主机号必须和子网内,其他主机的主机号不同!
合理的网络化分设置:能够快速的确定目标报文是属于哪个网络。 根本目的就是为提高寻址效率。
可以看到,如果手动进行IP子网的管理,显然很麻烦。
在过去提出了五类IP地址的管理方法。
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
但是,这种方法很快就被淘汰掉。因为IP地址分配的粒度粗糙,给本来就有限的IP地址,造成了大量的浪费。
按照A类主机和网络号位的划分, 2^24这么数量庞大的主机数。然而在现实中,不会有一个网架结构的一个子网,存在这么多台主机。
针对第一类网络划分存在大量的地址浪费问题,采用的新方案CIDR引入了 新的概念:"子网掩码"。
子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
将IP地址 与 子网掩码 “&”得到的就是网络号。
因此,每个子网都有自己的子网掩码,通过子网掩码 & IP,得到网络号,确定目的IP是否在子网内!
子网掩码在linux中查询:
//命令行输入
ifconfig
①IP地址中的主机地址全部设置为0,就成了网络号,代表整个局域网。
②IP地址中的主机地址全设置为1,就成了广播地址。(后面会细讲 用于链路层传输的特点)。
③127.* (127.0.0.1) IP地址是用于本机环回。用于网络测试。---->仅仅贯穿协议栈
上面我们讲解了,采用CIDR来解决IP地址数量有限的问题。
但实际上,IPV4的地址有限,只有2^32个。除去一些特殊的IP地址和 每一个MAC都需要配置一个或者多个IP地址。因此IP地址的数量并不如想象中的充足。
①IPV6:是IPV4的升级版,IPV4是一个4字节,32位的数。 但IPV6用16字节,128位表示一个IP地址。但这 两个版本IPV6不能很好兼容IPV4。因此,目前并未普及。
②动态分配IP技术:只给接入的网络设备,随机分配一个IP地址。
③NAT技术(后面详讲)。
IP地址 = 私有IP + 公有IP 这两者是隔断的!!!
私有IP和公有IP的区别,本质上就是区别 局域网 和 广域网。
如果是一个组织内部 组建的局域网,IP地址仅仅用于局域网内的通信,不会连接到Internet上,理论上任意IP都可以在局域网内使用。但是FC 1918规定了用于组建局域网的私有IP地址。
局域网IP规则:
①10.*,前8位是网络号,共16,777,216个地址
②172.16.到172.31.,前12位是网络号,共1,048,576个地址
③192.168.*,前16位是网络号,共65,536个地址
上述均为私有IP!
注:私有IP可以重复,但是公网IP不能重复!
可能大家在使用互联网公司提供产品的过程中,会有个疑问。为什么我们上网所需的流量(花费)交给的费用是给电信、移动而不是互联网公司?
本质上,是因为运营商为我们提供基础设施的建设、服务。
这也就是为什么,当你欠话费,手机卡被停用时,再也无法从手机上访问QQ、微信.....其实就是运营商检测到你手机欠费没交钱,就直接把你的网络请求截断了。当你补上话费时,又可以对互联网产品进行正常使用了。
LAN和WAN是一个相对概念而不是绝对概念。
我们知道,局域网的IP是 可以重复的。只要它不暴露在公网上。但同一个局域网内的主机号必须是不同的,因为需要确定主机的唯一性。
路由器是可以组建局域网的!
一个局域网内,路由器的主机 通常为1号。
路由器具有将私有IP转发公有IP的能力!
任何一个私有IP经过WAN窗口 进入公网,都需要经过路由转发为公网IP(这个之后会详讲)。
为什么私有IP不能出现在公网上?
本质上就是私有IP不能标识唯一一台主机。
路由器会自动替换掉原来的LAN IP为 WAN IP (NAT技术)
所谓路由:就是在复杂的网络结构中, 找出一条通往终点的路线
路由的过程,就是根据 目的IP 对每个网络进行查找的过程。(查找依据)
底层的实现,就是根据数据链路层(MAC)一个节点一个节点的 "跳"。(查找方式)
路由的过程,正如问路的过程。
①跳到哪个子网。
②转发默认路由(本子网内没找到)。
③查到目标网络。
查路由表:
//命令行输入
route
注:路由表生成的算法可以由网络管理员静态维护,也可以通过一些算法自动生成。
例如:距离向量算法,LS算法、Dijkstra算法。
数据链路层的本质,就是两个设备(同一种链路节点)之间的传递。
因此数据传输的物理层,是由数据链路层处理的。
1.“以太网" 它不是一种具体的网络, 而是一种技术标准(协议);
不仅仅包含了数据链路层的内容 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
2.以太网是局域网应用最广泛的技术,其他技术如:令牌环网 、 无线LAN等..
局域网通信的本质:同一时间只允许一台主机 在局域网内传输数据。
①MAC地址用来识别数据链路层中相连的节点。
②长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示。③在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的。
IP记录是 起点 和 终点
MAC地址记录的是, 起点与终点路途中,经过的上、下节点 区间。
1.MAC帧格式采用的是定长报头。
2.向上交付的类型,由帧类型决定。
目的地址/源地址:指的是网卡硬件地址(MAC),长度为48位,出厂后就固定了。
帧类型:IP(0800) 、 ARP(0806) 、RARP(8035)。
CRC:校验码
注:PAD是废弃的数据,仅仅是用于填补46字节。
IP数据报需要进行分片,根本原因就在于MAC规定了能够负载的字节最大值。
MAC字节负载范围(46 ~ 1500);
最小值:ARP数据包的长度不够46字节时,要在后面补填充(PAD)。
最大值:1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;1.如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片。
2.不同的数据链路层标准的MTU是不同的;
对IP毋庸置疑就是 分包、组装。
1.每个小包IP协议头的 16位标识(id) 都是相同的;(每片都有带有IP报头)。
2.每个小包的IP协议头的3位标志字段中。第2位置为0, 表示允许分片 ; 第3位标识 是否还有包。
3.到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层(仅仅由IP协议完成)。
对UDP的影响就比较粗暴。一旦UDP的数据报超过了MTU的最大限量。也就会在IP层进行分片,但是一旦数据产生丢包,数据重组就会失败。UDP并没有任何可靠性保障的机制,网络传输的丢失概率大大提高。
TCP虽然是面向字节流的,但其传输的最大尺寸,还是受制于MMS(Max Segment Size);
在进行握手的时候,双方主机会互相对MMS进行协商。
查看硬件MTU:
ifconfig
我们知道了目的IP地址,然而网络协议栈是自定向上的,需要不断地封包解包。对端的最底层是MAC帧,在之前我们之间并未有过通信的前提下,该如何找到MAC帧的地址呢?
要强调的是, ARP不是一个单纯的数据链路层的协议,
而是一个介于数据链路层和网络层之间的协议。
ARP协议建立了 主机IP 与 MAC地址的映射关系。也就是知道了对端的IP地址,就可以得到对方的MAC地址。
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢
弃;
因此在通讯前必须获得目的主机的硬件地址;
硬件类型(链路层网络类型):1为,以太网;
协议类型(要转换的地址类型):0x800 为IP地址。
硬件地址长度:以太网地址 为固定的 6字节。
协议地址长度:IP地址 为固定4字节。
以上字段 基本上是默认不变的。
op:字段为1标识ARP请求,字段为2表示ARP应答
发送主机,以一对多的方式 向网络内的所有主机发送ARP请求,并等待应答。
目标主机,收到请求ARP后,以一对一的方式,将ARP响应
为什么?
因为同一时间,一台主机不仅仅是和一台主机进行通信。
如果是要检查IP是否一致,无疑是要将ARP的有效载荷交付上层IP判断。显然不合理。
也就是本该在数据链路层 就可以判断丢弃的报文,还要交付给上层进行判断丢弃,占用资源空间。
可以想象,庞大的网络系统里,拥有众多的局域网。
如果每一个跨网络的主机间进行通信,都要先去发起ARP请求,在收到响应后才能接收数据,未免会影响效率。
因此每台主机都会维护一个ARP缓存表。用来记录一定时间内,维护两台主机的MAC地址。
//查看ARP缓存表
arp -a
DNS是一整套从域名映射到IP的系统。
我们在使用TCP/UDP提供的IP地址 + 端口号来确定网络上的唯一一台主机 和 程序。
但是IP地址不好记忆。
换句话说,也就是现在的搜索引擎
www.baidu.com;
com:一级域名表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等
baidu:二级域名, 公司名.
www: 只是一种习惯用法.
这是一个网络层协议。
一个新搭建好的网络,往往需要进行测试。IP协议是不保障传输的可靠的,丢包后并不知道。
①确认IP包是否成功到达目标地址.
②通知在发送过程中IP包被丢弃的原因.
③ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
④ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6。
当给对端发送一个ping命令,可以检查对方是否在线。
此时,如果对方在线,也会自动返送 ICMP Reply进行 回响。
注:ping 命令 ping的是域名
telnet是23端口, ssh是22端口, 那么ping是什么端口?
ping根本就没有什么端口可言,因为ping命令基于ICMP,端口号是传输层\应用层关心的内容。
能够打印出可执行程序主机,一直到达到目的IP之前经过的路由器。
代理服务器,更像是一副套子。
之前我们讨论了,IP地址的数量是有限的。
为应对IP地址数量不足的问题,提供了几套解决方案。
1.IPV6升级 2.动态地址分配 3.CIDR(子网掩码) 4.NAT<最主要的手段>
路由器最重要的一个功能,是支持了NAT技术。在前面也讲了,一个路由器配有LAN端口 、WAN端口。一个私有IP地址的主机,向跨网络实现通信,需要经过路由器,并进行路由转发,从私有IP地址,变为公网IP地址........ 当然这是浅显的理解
如果此时,有多台主机向同一个外网服务器发起请求。当外网服务器响应时,发现每个的IP都是同一个位置。(进程间通信) 那此时该如何解决呢?
内网+端口号的映射关系!
①NAT技术无法 从外部向内部 建立连接。
②装换表的过程,销毁 需要开销。
③一旦NAT设备出问题,一切TCP连接都会断开。
从应用上来说:
NAT技术主要解决的是 IP不足的问题。代理服务器多用于 加速器....
从底层实现来说:
NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
从使用范围:
NAT多部署在路由器(局域网)出口,代理服务器既可以部署在局域网,也可以部署在广域网。
根本上,NAT更像是硬件层面的,代理服务器多用于软件层面。
①IP构成:网络号(IP)+主机号
②IP协议的格式与 分片+组装
③网络分段,子网掩码(netmask)。
④MAC地址:固定的网卡地址 6字节 48位
⑤MTU 与 MMS\TCP\IP\UDP
⑥ARP协议报头 应答请求
⑦DNS域名解析 ICMP IP传输的可靠性保障
⑧代理服务器 vs NAT技术。
⑨路由器功能:创建局域网 、DHCP技术动态分配IP地址 、支持NAT技术