前言
我们在之前的文章讲到了socket套接字,我们总程序员的角度接触了socket网络编程,通过Socket,Seversocket等api,让不同主机上的进程进行网络通信,我们只需要明确ip,端口,以及udp还是tcp协议,就可以进行操作
但是Socket只是网络通信的入口,后续我们讲到了TCP协议的具体内容,包括其中的一系列的机制,来保证数据的可靠传输以及尽可能的加快数据的传输效率,这也才是传输层相关的内容,接下来,数据还会经过网络层,数据链路层,物理层,以及路由器,交换机这样的机器,那接下来的数据要经过哪些具体的步骤,ip协议,mac地址又是什么,在这篇文章里会有讲解
网络层
网络层紧接着传输层,在这个层里面就会讲解到说ip协议相关的知识,网络层的主要目的是做到地址管理以及路由选择

一般网络层有两类ip协议,一种是ipv4,一种是ipv6,我们一般上网是用到的ipv4,所以我们先以ipv4的报头来进行学习
初看报头
版本:这个是让我们选择使用的ip协议类型,是v4还是v6
首部长度:表示ip报头的长度,单位是4字节,所以如果这个位置的数字是5,那么就表示4*5=20字节
服务类型:这个主要是决定ip在路线选择的时候的一个策略偏好,就比如说你是要最小延时,最大吞吐量,最高可靠性,还是最小成本,这个是只能选择一个的,毕竟不可兼得
总长度:16位,也就是最大一个可以传输64kb,如果ip数据报需要携带更大的载荷,就需要进行拆包,就是把一个大文件拆成几个小份
标识,标志,片偏移:这个就是为了我上面说的拆包,标识是为了说明哪些包是要组合在一起,就给定一个编号,比如我有三段的数据编号都是10086,那么就可以知道这三个数据是要组合在一起的,标志是为了说明这次数据是否进行了拆包,片偏移是为了解决网络中后发先至的问题,对到的数据进行一个编号排序
生存时间:这个表示一个ip数据报最多能传多久,就好比我们的ip地址填错了,那这个数据是根本不可能传输到的,一个无效的数据一直传输是会消耗资源的,所以我们规定了一个最长时间,这个时间足以让数据跑相当远的距离了,当时间到了还没传输到,那么我们就会丢弃这个数据
协议:这个协议是说我们传输层使用什么协议对数据进行解析
首部校验和:这个和TCP报头一样,都是比较前后的数字来判断是否传输过去了,不过这个只校验首部,载荷部分是TCP/UDP协议来校验
32位源ip地址,目的ip地址:这个就是我们平时见到的ip地址了,就好比192.168.0.1,分成四个部分,中间用.来隔开,那32位表示的范围是0-42亿多,以前可能看着很多,但是我们现在上网的用户已经超过了这个数字,那这个ip不够分了,那我们该如何应对呢:
1,动态分配:
设备上网了再分配ip地址,这种方式的效果比较有限
2,NAT网络地址转换(核心办法):
我们将ip地址主要分为两种(1)外网/公网ip (2)内网/私网ip,除了内网ip的都是外网ip,内网ip主要是【10. 172.16.-172.31. 192.168.】并且我们规定,不同的局域网里的ip是可以重复的,就好比我们班上的10号和其他班上的10号,不过外网ip是唯一的,这个时候就可以大大提高利用率,这里还没有涉及到NAT转换,我们接下来考虑几种情况(1)同一个局域网里的设备互相访问,这个可以,并且没有涉及到(2)两个外网ip互相访问,这个没有问题,并且没有涉及(3)不同的局域网的设备想访问对方,这个是不允许的,因为我们刚刚讲到不同的局域网里的ip是可以重复的,所以会出现问题(4)外网ip设备想访问内网ip设备,这个也是不允许的,也是因为内网ip是可重复的,我外网设备拿着这个ip可以找到好多不同的(5)内网设备想访问外网ip,这个时候就涉及到NAT转换了,我们传输的数据在经过一个带有外网ip的路由器的时候,会进行ip的转换,就是直接换成对应的路由器上的外网ip,然后传输出去,核心原因就是想要访问外网设备是需要外网ip的
接下来我们具体来聊一下这个传输转换的过程,以及一些需要补充的知识
【1】外网,内网,局域网这三者的关系:局域网和外网内网没有本质的关系,局域网一般是很小范围内的网络,比如在家里,或者宿舍里面,局域网描述的是一个范围,而内网外网是一个相对的概念,这个是由网络管理员规定的,比如一般的,整个学校是内网,学校外部是外网,图书馆是一个局域网,宿舍是一个局域网,但是这并不是说局域网和内网有什么必要的关系,这个内外网是划定出来的,如果网络管理员划定101寝室是内网,那么图书馆啊其他的宿舍也都是外网的范畴了
【2】NAT不是一定就转一次,这个转换不是说,有那么一台路由器标识着说统一到我这里来转换,只有我这里可以转换内外网ip,不是的,而是像上面说的这个内网外网是一个相对的概念,比如规定我家是内网,我家外面那就是外网了,但是我小区规定小区里面是内网,小区外面是我啊王,那么我家外面到小区里面这个范围是啥,所以说这个是个相对的概念,看你站在哪个角度来看,所以路由器在进行下一跳的时候,会知道相对于外面是需要内网ip还是外网ip,需要外网ip了就进行NAT转换
【3】网关是什么:网关是一个网络通网另一个网络的出口角色
【4】并且每一个路由器都会维护一个NAT表,就相当于两个设备同时传输数据出去,那么他们经过同一个路由器后改的相对外网ip是一样的并且这个时候如果系统分配的端口号还一样,都是路由器提供的,并且这个时候如果系统分配的端口号还一样,那么数据传回来的时候怎么知道哪个消息是哪个的,这个时候不仅会维护一个表,而且路由器还会换掉一样的端口号,用端口号来区分,这个表,里面记录了前ip,前端口号,后ip以及后端口号,这样就可以一一对应了

3,ipv6:这个ip协议使用了16个字节来表示ip地址,这个数字是相当大的,但是早期ipv4以及ipv6是两个独立的系统,早期由于ipv4的快速崛起,ipv6的使用率就很低,并且如果现在换起来的成本也会相对的高,不过由于国家的出手,所以现在基本上的互联网厂商都是可以支持ipv6的
网段划分
我们的ip=网络号+主机号,这个是如何划分的呢,这个主要看我们的子网掩码,这个子网掩码转为二进制之后,数字唯一的对应部分就是网络号,其余为零的就是主机号

那我这个举例子:
255 255 128 0
11111111 . 11111111 . 10000000 . 00000000
我的子网掩码前17位都是1
10 10 74 34
00001010 . 00001010 . 01001010 . 00100010
所以将我们的ip也转为二进制一对应就出来了,我们同一个局域网的设备,网络号是一样的,我们是通过主机号来区分设备
特殊ip值
刚刚讲到了网段的划分,根据这个我们有一些特殊的ip值,当我们的主机号全为0的就是网络号:用来代表这个局域网,主机号全为1的就是广播号:用来进行给当前网段所有网络设备发信息的
路由选择
决定了我们的数据接下来是往那条路发,往哪个方向发,我们数据在网络中走的策略的走一步问一步

路由选择相当于是这样一个过程,一步一步问过去,然后最终走到终点
路由选择 = 路由器拿目标 IP 去查路由表,决定下一跳往哪走。
路由表 = 一部分自动生成,一部分人工配置,一部分由路由协议不断学习和更新。
数据链路层

网络层是宏观角度的路径规划,而数据链路层是微观角度两个节点之间该怎么传输,在这个层主要的协议就是以太网,类型是表示数据载荷是啥格式的内容,MAC 地址是网络接口的地址,也就是网卡在数据链路层的标识,mac地址由于是6个字节,所以会更多,也就不需要说动态分配或者NAT转换
LAN 口 = 路由器朝“自己这边内部网络”的接口。
WAN 口 = 路由器朝“上一级网络/外部网络”的接口。
这个是决定数据接下来往哪走的关键,如果要找的目标就在自己内部的网络里,就走lan口,这里的内部网络也就是属于自己的这一侧,也就是被自己这个路由器控制的设备,如果这个数据是要走到外部,那就会通过WAN口来走到其他的路由器设备去,这里面还有一个ARP方法,就是在你路由器得知你的ip之后,我们会通过ARP进行一个广播,会去广播问谁是这个ip地址,看看是在自己一侧还是外侧
ip就相当于是一个固定的总目标,但是你要往哪一个地方走还得靠mac地址

可以理解一下上面这个过程,再结合上之前讲的,这就是一个数据进行封装再经过各个网络设备的解封装以及封装最终来到目的地的过程
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/java_nnnn/article/details/165345334




