在复杂的网络环境中确定一个合适的路径。也就是说网络层解决的是数据在网络的传输的问题
主机:配有ip第hi,但是基本不进行路由控制的设备。
路由器:配有ip地址,又可以进行路由控制
节点:主机和路由器的统称
ip有一个能力,可以把数据跨网络从A主机送到B主机的能力。
ip和tcp的关系就好像学生和老师的关系一样。tcp是老师,ip是学生。ip负责在网络中传输数据,tcp负责为ip指定传输数据的策略,比如说什么超时重传,确认应答,流量控制啦,这些策略。tcp的用意是想ip更好的传输,相当于老师想学生考试拿更高的分数。
ip不保证可靠性,丢了就丢了。可靠性还是由tcp制定的策略来保证的。
剩下的几个字段后面说:
最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小
有效载荷就是上层的协议加上本身的数据。
由于mac的有效载荷MTU最大时1500,可以推出一下关系:
ip+有效载荷 = 1500字节,因此ip的有效载荷最大应该是1500-20=1480。
tcp+有效载荷 =1480,因此tcp的有效载荷最大应该是1480-20=1460.
ip把有效载荷给了mac之后,如果比MTU要大,那么mac就要求ip进行分片。
分片是ip干的,tcp是不知道的。
所谓分片就是把大的有效载荷分成几个小的有效载荷。
比如说现在ip传了一个3000字节(加上自己的header)的有效载荷给mac,比MTU=1500要大,mac就要ip分片后再传下来。ip怎么分片呢?
下面的分析都是假设tcp和ip没有给选项来分析的:
ip层传下去的3000字节里面有20字节是ip协议的header,剩下的是有效载荷2980字节。
可能会有人这么分:
如果每一片分成1500字节,分成两片,不就刚好3000字节了吗?
实际上每一片1500字节,1500字节里面1480字节是有效载荷,2片1480的有效载荷等于2960的有效载荷,那么这样就比原来的2980有效载荷少了20字节。因此不能这么分。
只能分成三片了。
这3位标志就是如果有效,就是用来标志ip发下来的一系列数据包是否是经过分片的。
3位标志在合并分片和确认该数据包是否为分片的时候有用。
经过分片之后,凡是16位标识相同的,证明这几个包原来属于同一个包。
片偏移就是分片的时候的切割点。比如一个1000字节的数据包分片成两个500的数据包,第一个数据包的片偏移是0,第二个片偏移是500.
有两个作用:
一开始客户端给server端发数据,数据传输到ip层了。方形就是一个个数据包
现在要做的就是挑选出被分片过的数据包。怎么挑选呢? 根据3位标识和13位片偏移来挑选。
挑选完之后还要进行分组,因为有很多client给server发消息,我们要把属于同一个数据包的分片分在一组。怎么分呢?根据16位标识来分。16位标识一致就是同一组。
分完组之后,我们就要把同组的分片拼起来,怎么拼呢?用13位片偏移+3位标识来拼。
按照片偏移从小到大排序,然后直接拼就好了。
就拿上面那个3000字节的数据包要分片成三个包来举例子好了。
现在有一个问题:如果有一些分片之后的包丢了怎么办,ip可以发现吗?
答案是可以的。别忘了header里面有数据报总长度,和4位首部长度。
如果自己的偏移量加上自己的长度等于下一个分片的偏移量证明没有丢包。如果不等就是丢包了。
丢包了tcp没有收到对方的ack,因此整一个重新发送。(超时重传)
分片不好,容易丢包。包越多越容易丢。因此最好不要分片
IP地址分为两个部分,网络号和主机号
网络号:保证相互连接的两个网段具有不同的标识
主机号:统一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
同一个网段就是同一个局域网的意思。同一个局域网的网络号一定是一样的,不同局域网的网络号一定是不同的。
过去曾经提出一种划分网络号和主机号的方案
把所有IP 地址分为五类, 如下图所示
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;
例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多. 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了
但不要认为这5类划分ip的方法很落后,现在还在用。
针对这种情况提出了CIDR(无类域间路由)
简单理解着就是ip号与子网掩码按位与得到的就是网络号。
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0。
这个包含的主机号范围是咋算的?
其实就是字码掩码的全0部分变成全1部分的值。
举两个例子
比如说255.255.255.0是最后8为2进制位为0,因此主机号的范围就是
00000000-11111111,总共256个主机号。
如果是255.255.255.240,那么最后4位2进制是0,因此主机号是0-15,总共16个主机。
其实直接用255-最后一位的数就可以了。255-0 = 255,证明0-255都可以是主机,总共256台。
255-240=15,证明0-15都可以是主机,总共16台。
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
ipv4是一个32位整数,很有可能不够用。现在有三种方法来解决这个问题
私有ip就是局域网里面的ip,不同局域网的私有ip是可以相同的。
比如今天我在学校连了wifi的ip和我在公司连了wifi的ip有可能是一样的,因为这里的ip指的都是私有ip。
理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
也就是说:
我们可以理解成公网只有一个,协议规定了私有ip是不会出现在公网上的。
具体规则如下:
包含在这个范围中的, 都是私有IP, 其余的则称为全局IP(或公网IP);
先讲一个结论:
实际上我们上网的过程是要先经过运营商的,运行商相当于帮我们建好了网路的高速公路让我们走,这也是为什么我们要上网就要交钱给运营商的原因。
现在讲一下NAT技术,NAT技术就是不断更换ip地址的技术。
我们知道ip的header里面有源ip号和目的ip号。那么请问主机发送信息的时候,它的源ip和目的ip是多少?
源192.168.1.201/24
目的122.77.241.3/24
是这样吗?
很明显不是的。刚刚说过,不同局域网里面的ip很有可能是相同的。源ip是192.168.1.201/24的主机太多了,怎么知道是哪一台?而且私有ip是不能出现在公有ip上的。
因此我们需要进行ip地址的转换(NAT)
先从主机发送到家用路由器,此时的src和dst是
源192.168.1.200/24
目的122.77.241.3/24
再从家用路由器中发送到运行商路由器,此时的src和dst是
源10.1.1.2/24
目的122.77.241.3/24
最后从运行商路由器发送到服务器端,此时的src和dst是
源122.77.241.4/24
目的122.77.241.3/24
这样私有ip就不会出现在公网里面了.注意:发送的时候目的ip永远不会变,变得都是源ip。
关于路由器的一些知识点
注意:
只有最外层的运营商路由器的WAN口IP才是公网ip,其他路由器的WAN口IP还是私网ip。只不过这个WAN口ip是对外的而已。
路由的过程是问路的过程。问的对象是路由表。
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
依次反复, 一直到达目标IP地址
那么路由器怎么知道要把ip数据包往哪一个路由器上转发呢?这就需要路由表了。
用route命令可以查看路由表
Genmask是子网掩码,Gateway是下一个地址
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符
再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;
由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
依次和路由表前几项进行对比, 发现都不匹配;
按缺省路由条目(即default), 从eth0接口发出去, 发往192.168.10.1路由器;
由192.168.10.1路由器根据它的路由表决定下一跳地址;
上面讲的所有东西都是工作在网络层的,接下来讲工作在数据链路层的概念
刚刚在说路由的过程的时候,只是宏观的概念。比如说ip数据包跳一跳跳到路由器上传输,只是宏观的概括,具体传输时是数据链路层要干的事情。
以太网不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了物理层的内容。因此数据链路层+物理层也可以叫做网络接口层。
以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网,无线LAN等(这里不讲
先前情回顾一下:
当在一个局域网里面,主机A要发送东西,先看目的地址,与子网掩码按位与,得到网络号,如果是在本局域网传输数据,就要借助mac帧和以太网技术。如果是发给外网,直接交给路由器就好了
以太网规定:在一个局域网里面,只允许一台主机和另一台主机单独交流。
啥意思呢?
比如说局域网里面有5台主机,ABCDE,现在A和B在通信,C如果想和D通信是不允许的。 因为A和B通信的时候,A其实也有发信息给D,如果C和D要通信就会发生信息碰撞
之前讲过,局域网通信时所有局域网内的主机都是可以收到这条消息的,目标主机不是自己的主机收到这条消息后就会丢掉,只剩下目标主机是自己的主机和发送方进行通信。
如果不是这么做,就会发生信息碰撞(就是干扰)。而我们把整个局域网称为碰撞域。
局域网可以看成是临界资源,只有一个主机可以来使用它。
mac地址是定长的,6个字节。一个冒号一个字节。mac地址是全球唯一的。
类型是数据是什么类型,决定了上层是什么协议给mac层发数据的。有可能是ip,有可能是ARP.
如果类型是0800,证明数据类型是IP,如果类型是0806,证明是ARP请求/应答
我们知道如果要发給外网的主机,必须先交给局域网的路由器,由它去路由到目的地。
主机看到对方主机的网络号并不是自己的网段的,它就会发给自己的路由器,让它去路由。(至于为什么主机会知道路由器的mac地址,后面讲)。在同一局域网是用mac帧来传输的。因此第一阶段的源mac地址是主机A,目的mac地址是路由器A` .
由于路由器是工作在网路层的,因此mac帧需要先解包,把mac的header揭下来,变成ip的数据包。路由器跟着数据包中的ip地址去查路由表,看一下下一个要交付的对象是谁。
在这幅图中,很明显是要给下一个路由器的。而这两个路由器在同一局域网中,因此要重新封包,变成mac地址。此时第二阶段的源mac地址是A`路由器,目的mac地址是B路由器。
重复这个过程,直到找到了目标主机。
这也是之前网络基础里面讲的W型跨网络传输原理。
总结一个重要的点:传输过程的时候,mac地址是一直在变的。目标ip地址是永远不变的(由于NAT技术,源ip地址还是有可能会变得)
IP地址描述的是路途总体的 起点 和 终点;
MAC地址描述的是路途上的每一个区间的起点和终点
之前讲ip的分片的时候讲过MTU,mac帧规定了数据最大字节是1500字节。其实它还规定了最小字节,是46.如果不够,会在后面进行填充字节。
简单理解一下,mss是纯数据的大小,mtu是加上tcp和ip的header的大小
之前讲过一个问题,主机是怎么知道路由器的mac地址的?这就和ARP协议有关系。
ARP协议是在mac帧上层的,因此先加的header是ARP的header,然后再加以太网帧的header
总结一下就是先广播,然后局域网内的其他主机通过ip来识别是否是想要自己的mac地址,如果是,就arp回应给请求方(默认局域网内主机之间是知道彼此的ip地址的)
DNS是属于应用层的。DNS是一整套从域名映射到IP的系统
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系
说白了就是一个字符串对应着一个ip+端口号。DNS服务器就相当于一个翻译软件,把字符串翻译成对应的数字。
做个实验:
ping www.baidu.com
直接输入这个ip地址也是可以访问的
DNS下层是udp支持的。
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.
www.baidu.com
域名使用 . 连接
ICMP协议是一个网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因.
有可能有这个疑惑:tcp不是可以超时重传吗?可是问题是ip上层不一定采用的是tcp,万一用的是其他没有可靠性的协议怎么办呢?
说白了,icmp就是具有诊断功能的ip。
简单来说就是一直发送请求,对方不理我我就返回一个ICMP的报错给发送方。
ICMP主要功能包括:
ping命令就是用的icmp协议。ping命令可以检查网络的连通性
ping命令会先发送一个 ICMP Echo Request给对端;
对端接收到之后, 会返回一个 ICMP Echo Reply
有一个问题:telnet的端口号是23,ssh的端口号是22(详情看之前的tcp和udp那一节),那么ping的端口号是多少?
答:ping不关心端口号。端口号是传输层才关心的东西,而ping采用的是icmp协议,是网络层的,不关心端口号。
也是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器
traceroute www.baidu.com
之前已经讨论过,ipv4协议下,ip地址不够用的情况,NAT是当前解决这个问题的重要手段,是路由器的一个重要功能。我们回顾一下:
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这是啥意思?
画个图就知道了。
由于一个路由器只有一个WAN口ip,那这样一个WAN口ip就对应着两个私网ip了,那查表就查不到目的地了。
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
不仅仅是主机方面加了端口号,路由器方面也加了端口号。不过路由器的端口号是虚拟的(当然也有可能是真实的),最终目的只是为了建立唯一映射关系而已。
总结一下:知道建表的逻辑是用ip+port来建立唯一映射关系即可。具体细节不用知道。
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
正向代理是我要代理去帮我拿数据(本质还是从公网拿)。
反向代理是我自己去向代理拿数据(本质是从代理那拿)。
总结一下:
正向代理用于请求的转发(例如借助代理绕过反爬虫).
反向代理往往作为一个缓存.(提高访问效率)