网络原理二(下)

目录

TCP/IP协议

​网络层

          1.地址管理

          2.路由选择 

​数据链路层 

特殊的协议:DNS协议


TCP/IP协议

上一篇已经介绍了TCP/IP协议中的应用层和传输层,那么这篇就来介绍一下网络层和数据链路层的具体情况吧,物理层就不具体介绍了!

网络层

网络层最重要的协议就是IP协议了,IP协议也是很重要的一个协议了,毕竟是这个协议栈的"代言",因此我就重点来介绍一下网络层的IP协议

首先来看一下IP协议的报头格式吧

4位版本:指得是IP协议的版本号,可以有两个取值4(0100)和6(0110),就是IPv4和IPv6 

4为首部长度:IP数据报的首部长度和TCP的首部长度一样的也是变长的,只需要在选项里面添加选项就可以了,4位的范围是0~15,单位是4字节,1111就表示15,就表示当前首部长度就是60字节

8位服务类型(TOS):这里其实只有4位是有效的,4位TOS分别为:最大吞吐量,最小延时,最高可靠性,最低成本(同一时刻只能取一种状态),而IP协议要在两点之间取到一条合适的路径,这里的合适指的就是TOS中的选择最合适

16位总长度(字节数):16位总长度这就和UDP的总长度是一样的,也就都是64k的大小,那么单个的IP数据报就不能超过64k,这就意味着太长的IP数据报是不能传输的,只能通过分包组包这样的操作才能完成这样的数据报的传输了

这几个就是负责完成分包组包这样的操作的,举个例子:

假设这个数据报是超过64k的,那么这样的数据报就是不能完成传输的,因此就需要分包,才能完成传输,将每一个包都拆成小于64k的数据报:

 这样的话就可以进行传输了,而分出来的数据报每一个包都是有一个IP报头的,但是IP数据载荷的内容是不一样的,就类似于是一个大件的快递,无法通过一个包裹来发送,就只能将这个包裹分成好几个包裹才能发送,而分出来的每个包裹都是不尽相同的,但是上面的快递表单是都有的,16位标识就表示可以将这些分出来的包裹哪一些是一起的,多个分出来的包16位标识都是一样的,但是这样发送的话就不能分清哪个是哪个部分了,而IP内部也早就想到了这样的问题:13位片偏移就可以用来描述哪个包谁先谁后,3位标志:只有一位是有用的,0表示后面患有后续,1就表示这是最后一个包了(结束标志),通过这个片偏移也可以识别这个包应该放到接收缓冲区的哪里,和其他的包之间的间隔是多少

 

 通过这样的操作就可以实现分包和组包的效果了,也就可以传输较长的IP数据报了,而这也就解释了另一个问题:UDP的分包组包怎么做? 就是模仿IP数据报的分包组包,在应用层里面设置标识,标志和片偏移,也就可以完成传输较长的UDP数据报了

8位生存时间(TTL):指一个IP数据报在网络中所能存活的最长时间,这里的单位不是s或者ms,而是转发次数,每发送一个IP数据报,都会赋予一个初始的TTL(常见取值为128/64)而每经过一个路由器,TTL就会减一,当TTL减到0了,那么就认为这个IP数据报永远到达不了了(一个正常的IP数据报在既定的TTL内都是会到达的),那么为了不让这个废弃的IP数据报在网络中占用硬件资源就会直接丢弃掉这个IP数据报

8位协议:表示传输层使用的协议,UDP和TCP的取值都是不同的

16位首部校验和:这和前面的校验和是一样的,用来校验数据的正确性

:源IP地址就表示发件人地址,目的IP就表示收件人地址,对IPv4而言,一个IP地址本质上是一个32位的整数,通常会使用"点分十进制"来表示这个IP地址,三个点就把32位整数分成了4个部分,每个部分1个字节,范围是0~255,类似于192.168.0.1就是一个IP地址,这样的写法也是为了人来识别,其实在机器里面的存储方式还是4个字节整数来表示的

 而IP协议所要完成的工作就是:1.地址管理,2.路由选择

1.地址管理

IP地址是一个点分十进制构成的数据,把IP地址分成两个部分:网络号(描述当前的网段信息也就是区域网的标识)+主机号(区分了区域网内部的主机),要求同一个局域网内部主机之间网络号是相同的,但主机号是不相同的,由同一个路由器连接的局域网,网络号也是不相同的

那么怎么区分哪些位是网络号哪些位是主机号呢?这其实是不固定的

这里IP就引入了一个"子网掩码"的概念来表示哪些是网络号,哪些是主机号,例如一个子网掩码是255.255.255.0,这也是一个点分十进制表示的整数,子网掩码的左侧会全部是1,右侧全部是0,而且不会出现0和1混着出现的情况,而这些1就表示是网络号,0就是主机号,255.255.255.0就可以表示为1111 1111 1111 1111 1111 1111 0000 0000前面24个比特位就是网络号,后面8个比特位就是主机号,一般家用的设备不会很多,因此常见的子网掩码就是255.255.255.0,如果设备更多的话,子网掩码也就会产生一些改变了,这都是根据需求来划分网段的

另外在介绍一些特殊的IP地址:

如果IP的主机号全为0的话,该IP就是一个网络号(一个正常的设备主机号不可能全为0)

如果IP的主机号全为1的话,该IP就是一个"广播地址",往这个IP发送的消息,整个局域网都可以收到!

如果IP地址是以127开头的表示这是一个"环回IP",也就表示主机自己

如果IP地址是10开头,或者192.168或者127.16-127.31开头的,表示该IP是一个局域网内部的IP(内网IP),剩下的IP被称为是外网IP(直接在广域网上使用的),外网IP一定是唯一的,而内网IP只在当前局域网内部是唯一的,在不同的局域网内有可能出现相同的内网IP,而本来我们预期的是每一个IP地址都要对应到一个设备,这个为什么在不同的设备还可以对应到同一个IP呢?

 这就要看一下IP地址的范围了,当前使用的版本是IPv4,是一个32位的整数,所能表示的最大范围也就是42亿九千万差不多,如果按照我们的预期,那么世界上的设备数就不能超过42亿9千万,这显然是不现实的,那么该如何解决这一问题呢?下面我来介绍一下其解决方法:

 

1.动态分配IP地址

就是每个设备在连接上网络之后才会有自己的IP,如果不上网,这个IP就可以以被别的设备使用,就简单的利用了时差等不同人不同时间的上网时间段不同来解决这个问题,但这个解决方法显然也是无法根本解决这个问题的,治标不治本!

2.NAT机制

让多个设备公用同一个IP(外网IP),上面我介绍了网络是被分成了内网(局域网)和外网(广域网),而外网必须表示唯一的设备,同时内网中的很多个设备可以同用一个外网,此时一个外网IP就可以表示成千上万个设备,此时IP地址的压力就会减小很多,而如果同一个内网的设备,通过同一个外网(运营商的路由器可以修改IP地址,从内网发出去的IP改成外网IP,端口号也做出相关的调整,带有这样功能的路由器,也称为NAT设备),来访问另一个设备,那么给如何区分哪个设备是哪个设备呢,这里就可以通过端口号来区分了,每个设备的端口号都是不一样的,网络的连接是有五元组的,即使IP相同,通过端口号也可以区分不同的连接,那这样也可以看出来NAT机制也是有极限的,毕竟端口号的范围也是明确的,只有65535,同一个内网中的设备的连接数不能超过这个范围,超过了NAT就可能没用了,而且对于一个外网IP,可以在互联网中的任何位置都能访问到,但是对于一个内网IP来说,处在不同局域网就无法访问,也就是只有处在同一个局域网内的其他设备通过这个IP才能访问到,这也就体现出NAT机制的弊端了,如果所有的IP地址都是唯一的话,那么就可以直接访问了,但其实这是一种对于我们个人而言比较好的事情,毕竟自己的设备也不愿意被其他的设备可以直接访问到,但是设备的连接数还是有限制,这个就相对而言不那么完美了,虽然我们当前大部分使用的还都是NAT机制,但是这显然只是让这个续了一波命,也是没有从而根本上结局这个问题的!

3.IPv6

IPv6在报头中使用了一个更长的字段来表示了IP地址:16个字节,128位,这和IPv4的4个字节,32位大出来了很多很多,号称IPv6可以给地球上的每一粒沙子都可以分配一个IP地址,这显然数量是超大的,因此IPv6就从根本上解决了每个设备都无法分配一个IP地址的问题!!类似于AD80:0000:0000:0000:ABAA:0000:00C2:0002就是一个IPv6地址每个数字都是一个16进制的数字(2bit),每个冒号分割了2个字节,那既然IPv6这么好,为啥现在还在使用IPv4+NAT呢?当然是成本花费太大的问题呀,本来IPv4和IPv6就是两个不同的机制,现在的大量的网络设备很可能都是只支持IPv4,而不支持IPv6,那么想要把IPv4升级IPv6就必须把现有的设备换掉,而现在的设备也是用的挺好的,又为什么要更换呢,想升级又要一大笔开销,这显然是不值当的,这也就是IPv6到现在为止无法替代IPv4的最大原因,不过还好有国家的大力支持,才使得IPv6的进程在我国得以持续推动!!!

另外再简单介绍一下在没有子网掩码的时候是如何划分IP地址的,之前是把IP地址分成了A,B,C,D,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

这些简单做以了解就可以了,毕竟这些现在已经被淘汰了~~

2.路由选择 

路由选择其实就是规划路径,两个设备之间要找出一条通道,然后才能完成传输,而找出这个路径就需要认识路,IP数据报中的目的地址就表示了这个包要到哪里去,经过一个路由器,当前路由器如果认识路就会直接告诉路怎么走如果不认识就会告诉你一个大致方向(下一跳),到达下一个路由器再询问,然后往后面走,就会距离目标地址越来越近,总会有一个路由器是认识路的,就可以顺利的转发过去了,如果路由器认识多条路径,就可以选择一条最合适的路径了!!

那什么是路由器"认识"路? 其实在路由器内部维护了一个数据结构,路由表(有一系列的路由表生成算法,自动生成一波,还可以手动配置),在这个路由表内部就记录了一些网段信息(网络号)然后目的IP就在这些网络号中进行匹配,以及每个网络号对应的网络接口(网络接口其实就对应了路由器中具体的端口号),通过这个就可以大致找到目标地址!

 

数据链路层 

数据链路层就距离我们程序员更远了,数据链路层的主要协议就是"以太网",一般我们插的网线,就被称为"以太网线",以太网协议不仅仅规定了数据链路层的内容,而且规定了物理层的内容下面来看一下以太网数据帧的具体格式:

 目的地址和源地址都是6位的,就比IPv4的地址长度要长差不多6w倍,这个地址称为"mac地址",mac地址就真正实现了每个设备都是唯一的(每个网卡在出厂的时候就已被写死了mac地址),类似于00:1B:44:11:3A:B7就是一个mac地址(也可以称为物理地址),那既然已经有了IP地址为什么还要有这个地址呢? 当时的网络层协议和数据链路层协议都是各自研发出来的,并不知道对方的存在,那么既然有了也是可以使用的,现在的IP地址和mac地址就同时使用但表示了不同的功能:IP地址表示一次传输过程中的起点和终点(不考虑NAT机制,一个IP数据报的源IP和目的IP是固定不变的),而mac地址用来表示传输过程中任意两个相邻节点之间的地址(一个以太网数据帧在转发过程中,源mac地址和目的mac地址都是会变的)

类型主要就描述了后面搭载了什么样的数据类型,像下面的类型0800就是一个一般的类型,后面就是普通的数据,而类型是0806的话,就搭载了ARP请求/响应,这两个就属于特殊情况

CRC指的是以太网数据帧帧尾就是基于CRC(循环冗余算法:把数据的每个字节依次进行累加如果溢出了就表示溢出了)算法的校验和

另外这个46~1500表示数据的加载范围,而1500也被称为MTU表示一个以太网数据帧能够承载的数据范围,这个范围取决于硬件设备(以太网是和硬件密切相关的其他的硬件设备对应的数据链路层的协议可能也是不相同的,MTU也是不相同的),具体数据链路层考虑的是相邻节点之间的数据传输,而这就需要考虑到交通工具的选择,不同的交通工具所能够搭载的数据范围就是不同的,那么如果一个数据报超过了MTU怎么办?

没错就还是我前面介绍的分包组包,而在IP层协议的分包一般自己是不怎么会超过64k的,主要还是适应数据链路层的MTU,因此如果超过了MTU就需要进行分包组包,由于MTU一般比较短,超过MTU也是非常容易触发的主要还是受限于硬件,因此就需要在软件上进行封装,保证数据能正常的传输,这也就是MTU对IP协议的影响

MTU对UDP协议的影响:一旦UDP的报文长度超过了最大的数据报长度,那么就需要在网络层就会分成多个IP数据报,而这丢包的几率是非常大的,只要任意一个IP数据报丢了,整个数据也就丢失了!!

MTU对TCP协议的影响:TCP的单个数据报的最大长度称为MSS,也就是TCP在IP不分层的情况下,所能搭载的最大载荷,另外MTU也取决于TCP和IP的报头长度(变长的),而MTU和MSS的关系:

MTU在去掉IP和TCP的报头后就是MSS的大小,MSS对TCP起着一定的提醒作用,因为一旦超过了MSS,就需要分包组包了,这个花销还是很高的,因此当传输TCP的长度不超过MSS时,认为这个最高效的状态!!!

简单介绍一下ARP协议:ARP报文并不是用来转发数据的,只是起到一个辅助的效果, 路由器在这样的设备转发数据的时候,首先就拿到一个IP地址(目的IP),通过这样的IP地址就可以决定接下来这个数据该怎么走(从哪个端口出去,发送到哪个设备上),因此就得决定接下来封装的以太网数据帧目的mac地址是什么,这时就需要根据ARP协议建立起IP->mac这样的映射关系(类似于hash表里面的键值对结构,但这个表不一定存放在内存中,也有可能存放在硬件中)具体的操作就是:当设备启动的时候,就会向局域网中广播ARP报文,然后每个报文收到后都会给出一个应答,这个应答中就包含了自己的IP和mac地址,然后发起广播的一方就可以根据这些回应建立起这样的映射表了

 

 特殊的协议:DNS协议 

DNS协议是一个应用层协议,起到的效果就是"域名解析",由于IP地址并不好记忆,所以将其写成了点份十进制的形式,但是仍然对于人类不是那么友好,因此就使用了一串英文字母来表示这个IP地址,而这串英文字母就是域名,类似于www.sogou.com这就是一个域名,而且域名和IP地址是一一对应的关系!!DNS系统刚开始的时候只是一个普通的文件:hosts文件,

基本每个人的电脑上都会有,这也就是最早的域名解析系统,而到现在这个文件也不再使用了,因为全世界的域名那么多,每次使用域名都得改来改去这是非常麻烦的,因此就成立了一个机构专门负责维护这里的域名和IP地址的对应关系,假如你想申请一个域名的话,就可以去这个机构报备一下就可以~~这个机构维护一组服务器就会把hosts文件存到这个服务器里面(域名解析服务器),想要进行域名解析的话就访问一下这个总的服务器就好了,而全世界的设备是非常多的,也不能每个设备上网都去访问这个域名解析服务器,因此就把这个总的域名解析服务器设为根域名解析服务器,另外在每个国家每个地区都有各自的网络运行商,这些运营商就会就近架设域名解析镜像服务器(定时回合根域名解析服务器进行同步),像我们平时上网的话就会访问这些就近的镜像服务器,之前常见的一个问题:QQ能上,但是打不开浏览器,就是因为就近的域名解析镜像服务器挂了(上网就会需要使用到域名,QQ使用的是自己的服务器),想要解决这问题也很简单:更改自己的域名解析服务器就可以了:打开我的电脑网络设置找到更改适配器选项,点击以太网属性,选择TCP/IP将自动获取域名解析服务器改成手动获取就可以,自动获取获取的就是就近的域名解析服务器,而自己手动就可以更改这些服务器,例如谷歌维护的一组域名解析服务器:8.8.8.8,或者114.114.114.144这些都是可以的,直接替换掉就可以了!!

 另外当我们的主机,查询了一次DNS之后,主机就会把这个查询的结果缓存一定的时间(浏览器会缓存),下一次再访问到同一个域名的时候,就会省略查询DNS的过程(DNS域名和IP的对应关系是很少会发生变化的)

网络原理到这里就介绍完了,后面会再把一些比较重要的协议再分析分析的!!!

 

猜你喜欢

转载自blog.csdn.net/qq_58266033/article/details/124390795
今日推荐