[线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议

本文主要是介绍[线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀Java EE(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. 网络层IP协议
    • 1.1 IP协议的作用
    • 1.2 协议头格式
    • 1.3 解决IP数量限制的3种方式
      • 1.3.1 动态分配IP地址
      • 1.3.2 NAT机制
      • 1.3.3 IPv6协议版本
    • 1.4 地址管理
      • 1.4.1 网段划分
      • 1.4.2 特殊IP地址
    • 1.5 路由选择
  • 2. 数据链路层以太网协议
    • 2.1 以太网帧格式
    • 2.2 IP地址与mac地址对比
    • 2.3 MTU
  • 3. DNS应用层协议

1. 网络层IP协议

1.1 IP协议的作用

IP协议最大的两大作用有两个,一个是路径规,也就是路由选择,第二个是地址管理.他用来帮助数据在如此复杂的网络环境中确定一个合适的路径.
在这里插入图片描述

1.2 协议头格式

在这里插入图片描述

  • 4位版本号:指定IP协议的版本,对于IPv4来说,就是4.对于IPv6,就是6.至于其他的版本,目前值存在于实验室,并没有大面积推广使用.
  • 4位头部长度:IP头部的长度是多少.注意,这里的4位头部长度中的位是16进制的,一位表示0~15,一共4位,即最大是15x4=60.
  • 8位服务类型:虽然这里是8位,但是这里只有4位是有效的.4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本.这四者相互冲突,只能选择一个.这四者可以相互切换.

类似与奥特曼变身的过程.当变身到均衡模式的时候,各项指标都比较均等,当变身到力量模式的时候,攻击力大大提升,防御力相对较弱,当变身为迅捷模式的时候,移速叫快,但其他指标中等.
在这里插入图片描述

  • 16位总长度:IP数据报的总长度(头部+载荷)

问题:IP协议是否也像UDP协议那样最大64KB?
不是的,IP数据报可以自己实现拆包和组包,这样的功能如果携带的数据载荷超出长度上限,IP就会自动拆分为多个数据报,每个数据报携带一部分数据,最终发送到对方之后再拼接好.但是这种办法只使用与载荷是TCP协议类型的载荷,UDP协议不适用.
在这里插入图片描述
那么问题又来了,UDP协议为什么不适用呢?
如果把一个很长的UDP数据报拆分之后,发送给对方接收之后.开始合并还原.还原出的数据,要交给UDP协议进一步解析,取出8个字节为报头,身下的作为载荷,但是剩下的到底有多长?就会从报文的长度字段中读取,最多64KB,剩余的就会被视为无效数据.

下面我们提到的3个报头字段都和IP数据报的拆分有关系.

  • 16位标识:如果一个IP报文被分片了,那么每一个分片中的这个标识都是相同的,表示他们是同一个数据报中分片出来的.也表示最后合拼的时候,哪些数据报要进行合并.
  • 3位标志位: 这其中,只有两位是有效的,第一位保留,第二位表示该数据报是否触发了拆包操作,第三位表示当前的数据报是否是最后一个要组包的部分.类似于结束标记.
  • 13为片偏移:在拼接一个数据报的时候,拆开的包之间要有拼接的先后顺序.这个字段其实就表示的是当前分片在原报文中处于那个位置.
  • 8位生存空间:IP数据报要在网络中转发.我们要限制一个数据报在网络中最大的转发次数.一般是64(但是也不一定,可以配置),每经过一次转发,TTL-=1,一直减到0,还没有到达目的地,这个数据报就要丢弃.

问题:64次转发够用吗?经过64次一下的转发,应该到达目的地的数据报会到达目的地吗?
当然够用,路由器转发IP的时候,每个路由器不了解网络的全貌,但是知道相邻的设备有哪些,即使通过少数几次转发,也可以涵盖大量的设备.
这个设计到一个社会科学的理论,叫做"六度空间"理论.
https://baike.baidu.com/item/%E5%B0%8F%E4%B8%96%E7%95%8C%E7%8E%B0%E8%B1%A1/56374295?fr=ge_ala

  • 8位协议:表示上层协议的类型.即载荷部分是那种类型的数据报.一个数据报在分用时,要给上层那个协议,有明确的声明.
  • 16位头部校验和:使用CRC算法对IP头部进行校验,这里需要注意的是,只对报头进行校验,不管载荷部分.
  • 32位源地址和32位目标地址:表示发送端和接收端.这里虽然是比特位,但是我们平时看到的一般是点分十进制,一共分为4个部分,每部分是1字节.(0~255).
    数据报的四个核心信息:源端口,目的端口,源IP,目的IP.
  • 选项:最大40字节.

1.3 解决IP数量限制的3种方式

IP地址是有限的,如果有一天,IP不够用了怎么办?下面是解决IP数量问题的三种方式.

1.3.1 动态分配IP地址

也就是在一个用户不用网络的时候,他的网络IP就会被回收,分配给需要使用网络的用户,这样做确实可以缓解一定的数量问题,但是却没有从根本上解决问题,并没有是使得IP地址的数量增加.

1.3.2 NAT机制

这种机制也叫做网络地址映射.这种机制把IP地址分为了两种,私网IP和公网IP.也叫内网IP和外网IP.

  • 私网IP格式
    • 10.*,前八位是网络号,一共1677216个地址.
    • 172.16到172.31,前12位是网络号,一共1048576个地址.
    • 192.168.*,前16位是网络号,共65535个地址
      包含在这个范围中的,都是私网IP.
  • 公网IP
    除了上述格式是私网IP,其他的格式都可以是公网IP.

公网IP是唯一的,但是私网IP允许在不同的局域网中重复但不允许在同一个局域网下重复.

  • 引入私网IP和公网IP之后,又是如何进行通信的
    • 同一个局域网内部设备之间通信,由于一个局域网内部之间的IP不可重复,此时设备之间可以正常交互.
    • 广域网设备和广域网设备之间进行通行的时候,由于公网设备之间的IP是唯一的 ,也可以正常交互.
    • 局域网1中的A访问局域网2中的B,直接访问是不允许的,这是因为如果有其他局域网中的IP和局域网2中的B重复,就不知道要访问哪个局域网中的设备了,如果需要,就要使用广域网中的服务器进行数据转发.
    • 局域网设备主动访问广域网设备,这时候就需要使用到NAT机制.
    • 广域网设备主动访问局域网设备,不允许.也是因为不同局域网中的私网IP是可以重复的,这时候广域网下面有好多局域网,如果有两个局域网中的IP是重复的,就不知道具体要访问哪个局域网中的设备了.
  • NAT机制
    在这里插入图片描述
    在NAT机制中,运营商路由器起到了关键性的作用,可以把运营商路由器看做一个NAT设备.在发送方主机发送的数据报经过运营商路由器的时候,运营商路由器会对中间经过的数据报进行网络地址转换,把IP数据报的源IP替换成自己的公网IP,也就是WAN口IP.所以一个运营商路由器的公网IP就可以代表成千上万的私网设备.其中新的端口号由运营商服务器随机分配一个没有重复的.
    但是有一个问题,就是来的时候好好的,回不去了,这时候该怎么办?
    这时候在运营商路由器的内部生成一个"映射关系",它会记录当前这个对应的请求从哪个内网中的设备发送过来的,从而在回去的时候,把目的IP切换为原来的IP.
    那么返回的时候由是怎么返回的呢?(绿线表示返回过程)
    在这里插入图片描述

1.3.3 IPv6协议版本

NAT确实从很大程度上缓解了IP地址缺乏的问题,但是任然没有解决使得IP地址增多的目的.这时候我们就引入了IPv6版本的协议.
IPv6并不是IPv4的升级版,这两个版本的协议并不兼容,这也是如今IPv6没有在世界上大面积普及起来的原因.IPv6使用16字节,也就是128位来表示一个IP地址.它是8个由冒号隔开的16位字段,每个字段由4个十六进制数构成,比如AA22:BB11:1122:CDEF:1234 :AA99:7654:7410.
如果计算出IPv6地址的数量的话,这个数量将非常庞大,足以给地球上每一粒沙子分配一个IP地址.

1.4 地址管理

1.4.1 网段划分

IP地址分为两个部分,网络号和主机号.一共32位.

  • 网络号:**用来标识局域网,在同一个局域网中,网络号相同.**但是不可以说,网络号相同,就一定在一个局域网中,它们两个是一个充分不必要的关系.
    [注意] 局域网之间,网络号可以相同,但是,两个相邻的局域网之间的网络号不可以相同(同一个路由器上的WAN口和LAN口).
  • 主机号:区分同一个局域网中的不同主机.同一个局域网中,网络号相同,但是必须有不同的主机号.
    在这里插入图片描述

那么,在32位的IP地址中,如何区分那几位是网络号,那几位是主机号呢?我们有两种方法来区分.

  • 子网掩码
    子网掩码和IP地址一样,也是32位的二进制整数,其中左半部分全是1,右半部分全是0,不可以有01交错的情况.其中,全部为1的位置标志的是网络号,全部为0的位置标志的是主机号.
    在这里插入图片描述
  • 指定固定前缀
    这是一种上古时期的方法,现在已经很少使用了.具体是多少位网络号,多少位主机号,都是写死的,但是会浪费大量的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

1.4.2 特殊IP地址

  • 将IP地址中的主机地址全部设置为0,就成为了网络号,代表这个局域网.但是这样的IP地址不可以设置到主机上.
  • 将IP地址的主机地址全部设置为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据报.即给局域网中的所有设备发送数据报.
    [注意] TCP不支持,只有UDP支持
  • 127.*的IP地址用于本机环回,通常是127.0.0.1.往这个IP上发送数据的时候,就由自己来接收.

1.5 路由选择

路由选择通俗一点来讲,就是数据报在网络中找路的过程.
IP数据报在传输的过程中,是一跳一跳"问路"的过程.
• 当IP数据包,到达路由器时,路由器会先查看⽬的IP;
• 路由器决定这个数据包是能直接发送给⽬标主机,还是需要发送给下⼀个路由器;直接发送给主就是直接到达了目的地,而发送给下一个路由器就是让数据找到下一个问路的人.

那么路由器如何决定是否是直接发送到目标主机的呢?
当路由器收到数据的时候,会根据目的IP查询路由表,看在目的地在路由表中是否存在,如果存在,直接发送过去,如果不存在,路由器就会在他的路由表中共挑选一个最"神通广大"的朋友,把数据交给他,让他再去转发.
在这里插入图片描述

• 依次反复,⼀直到达⽬标IP地址;
在这里插入图片描述

[注意]

  • 对于路由器在进行数据转发的时候,无法一下子知道目的地的IP对应的设备如何到达,只能通过启发式的方式,通过一步一步问路的方式,来找到目的地.
  • 所以网络中的路由器寻路的时候,无法做到最优解,只能做到较优解.

举例说明:问路
假如现在没有导航和地图,只能靠问路的方式从北京的天安门东到达西二旗.

  • 从北京地铁的天安门东站出发,在天安门东站,开始问路人A:你知道西二旗怎么做地铁吗?路人A回答道:我不知道,但是我只知道,你需要坐福寿岭站方向的地铁,做到复兴门之后再看看,于是你便坐到了那里.
  • 到达复兴门之后,你又开始问路人B:你知道西二旗怎么坐地铁吗?路人B回答到:我不知道,但我知道你需要换乘2号线,坐到西直门站再看看.
  • 到达西直门后,你又开始问路人C:你知道西二旗怎么坐地铁吗?路人C回答到:你需要换乘13号线,坐那么4,5站地就可以到达西二旗.
    这其中,你问路的路人就像一个个路由器,给你指路,而你就是一个数据报,需要从起点到达目的地.
    在这里插入图片描述

2. 数据链路层以太网协议

在以太网中,既包含数据链层的内容,也包含一些物理层的内容.以太网不是一种具体的网络,而是一种技术标准.

2.1 以太网帧格式

在这里插入图片描述

  • 目的地址与源地址: 这里的地址类型是mac地址,或者说是物理地址,每个地址是6个字节,48个比特位.

什么是mac地址.
在前面的IP地址中,IP地址进行选择时候,IP层决定下一个路由器要找谁,到了数据链路层,就要决定具体要怎么找到下一个路由器.即数据报要从路由器中的哪个接口发送出去.
路由器在数据链路层也维护了一张表,这个表中就记录的是每个网口以及网口对端设备mac地址的关联关系.

  • 类型: 描述后面载荷的数据类型.
  • CRC: 是以太网帧的帧尾,其中也使用CRC校验和来验证数据报的正确性.
  • 0800类型数据载荷:这个数据载荷就是真真实实携带数据的载荷,最大占1500个字节.
  • 0806类型与8035类型:这两种数据类型都不会携带任何业务上的载荷,只是针对转发数据过程中起到辅助的作用.
  • ARP请求/应答:ARP协议给每个路由器或者交换机建立转发表(注意不是路由表),这张表是由硬件层面来维护的,直接通过转发芯片来记录.这张表中记录的是IP地址与mac地址的映射关系.数据转发过程中的每一跳,先查路由表,知道下一跳的IP地址,之后再查转发表,知道IP地址对应的mac地址,之后再转发.

2.2 IP地址与mac地址对比

  • IP地址描述的是路途总体的起点与终点.
  • mac地址描述的是路途中每一个区间的起点和终点.

举例说明:从太原到哈尔滨
从太原到哈尔滨的路线假设是: 太原—>北京—>沈阳—>哈尔滨
假如我们取出北京—>沈阳这一段:

  • 源IP: 太原
  • 目的IP:哈尔滨
  • 源mac:北京
  • 目的mac:沈阳

它们之间的传输作用其实就对应的是我们之前在网络初步的时候提到的TCP/IP五层模型中网络层与数据链层的传输作用.当时我们使用送快递的例子来说明了.这里我们再重复一次.
https://blog.csdn.net/2301_80050796/article/details/138972120?spm=1001.2014.3001.5501

  • 应用层: 和具体的应用程序相关,传输的数据干啥用,如何使用,有何意义.
  • 传输层: 关注的是通信双方的"起点"和"终点",终端到终端的传输.
  • 网络层: 关注的是通信中通信路径的规划,规划出的路径确定了数据要经过哪些"点到点的传输".
  • 数据链层: 关注的是通信过程中,相邻两个点之间的通信.
  • 物理层: 物理层就是网线和网口等硬件方面的东西.

举例说明: 网上购物
某人在淘宝上买了一箱面包.商家接到订单.

  • 应用层: 他买来这箱面包是用来吃的,绝对不是其他的什么用途~~.就像我们通过网络拿到数据之后,来干嘛用.
  • 传输层: 商家从仓库出库商品之后,寄到快递驿站,驿站揽收之后,快递单就会打印收货的地址.这时候就是只关注寄件地址和收件地址.也就是通信双方的"起点"的"终点".
  • 网络层: 揽收之后,商家就要对运输的路径进行规划,比如要从深圳市寄到北京市.可以是在深圳发件之后,在保定中转,之后到达北京,也可以在天津中转,最后到达北京.
  • 数据链层: 运输途中,两个结点之间该用什么样的交通方式,比如从深圳到北京比较远,可以采用铁路运输,从天津到北京比较近,可以采用大卡车运输.
    在这里插入图片描述

2.3 MTU

MTU相当于发快递时对包裹尺寸的限制.这个限制是不同的数据链路对应的物理层,产生的限制.
• 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填
充位;
• 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
• 如果⼀个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进
行分片(fragmentation);
• 不同的数据链路层标准的MTU是不同的;

3. DNS应用层协议

DNS,全称Domain Name System,叫做域名解析系统.
当我们在使用IP地址查找一个主机的时候,IP地址过于复杂,没有任何规律,很不好记,这时候我们便引入了域名解析系统.通过DNS系统把一个IP地址转换成一个域名,这个域名是一个字符串.

举例说明:比如百度,www.baidu.com,这是百度的域名,但是百度广域服务器的IP地址不是这个东西,它的IP地址依然是一个点分十进制数字:202.108.22.5,只不过为了方便用户访问到百度,把这个点分十进制的数字用一个带有汉语拼音的域名代替掉了.

在这里插入图片描述

  • 那么这些字符串与IP的对应关系在哪里呢?
    在过去,会使用hosts文件来描述域名和IP地址的关系.但是随着互联网的日益扩张,这个文件就必须不停更新,用户的电脑可能会存不下.于是DNS服务器便诞生了.把这样的对应关系,使用服务器来保存.

DNS服务器在查询域名对应的IP地址的时候,是按照一级一级的查询的.
比如www.baidu.com,其中com是一级域名.baidu是二级域名,在DNS服务器查询的时候,首先查询一级域名,再查询二级域名,以此类推
在我们前面的语法部分讲到包的时候,我们通常也使用公司域名的反向域名对包进行命名.

  • 访问DNS服务器的机制
    • 客户端缓存: 电脑在尝试访问某个域名的时候,得到的IP会保存起来,下次再访问的时候,就不会重新查询DNS.
    • 分布式系统: 全世界各个地方,建设了很多DNS镜像服务器,此时请求DNS服务器只需要就近访问附近的镜像服务器即可.

这篇关于[线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028434

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T