iis网站开发,wordpress 相册 插件,网上医疗和医院网站建设,移动端首页设计目录 前言#xff1a;
1.网络原理的理解
2.应用层
2.1自定义协议的约定
2.1.1确定要传输的信息
2.1.2确定数据的格式
3.传输层
3.1UDP
3.1.1UDP报文格式
3.2TCP
3.2.1确认应答
3.2.2超时重传
3.2.3连接管理
3.2.3.1三次握手
3.2.3.2四次挥手
3.2.4滑动窗口
3.…目录 前言
1.网络原理的理解
2.应用层
2.1自定义协议的约定
2.1.1确定要传输的信息
2.1.2确定数据的格式
3.传输层
3.1UDP
3.1.1UDP报文格式
3.2TCP
3.2.1确认应答
3.2.2超时重传
3.2.3连接管理
3.2.3.1三次握手
3.2.3.2四次挥手
3.2.4滑动窗口
3.2.5流量控制
3.2.6拥塞控制
3.2.7延时应答
3.2.8捎带应答
3.2.9面向字节流粘包问题
3.2.10异常处理心跳包
3.3TCP与UDP的差别
4.网络层
4.1IP协议
4.1.1地址管理
4.1.1.1动态分配IP地址
4.1.1.2NAT机制
4.1.1.3IPv6
4.1.2路由选择
4.2IP地址的组成
4.2.1IP地址分类ABCDE
4.2.2子网掩码
4.3特殊的IP地址
5.数据链路层/物理层
5.1以太网
结束语 前言
在上一节中小编主要是与大家讲述了有关于网络编程方面的知识如果没有查看的同学请点击这里☞http://t.csdn.cn/zZ5wt 接下来小编继续带着大家来看网络编程中的一些更深层次的一些知识大家快快来和小编一起学起来吧
1.网络原理的理解
我们之前学习了网络初识这里面我们对网络有了大体的概念和认识接下里学习了网络编程在这里面主要是给大家介绍了UDP和TCP让我们真正通过代码来感受到了网络通信程序这里再给大家来介绍网络原理让我们来进一步的了解网络的工作过程。下面我们将通过对网络协议分的这几层来分别给大家一一介绍从应用层-传输层-网络层-数据链路层-物理层。这里主要的重点是应用层和传输层其余的大家简单了解即可。
2.应用层
这里的应用层是简单给大家先介绍一下在后期小编还会给大家出有关于HTTP的内容这这块小编在给大家详细介绍一番。应用层和代码是直接相关的一层它决定了数据要传输什么拿到数据之后又该怎么使用。在应用层这里虽然存在一些现有的协议HTTP但是也有很多情况是需要程序猿来自定制协议的。关于自定制协议就是说要约定好应用层数据报和数据格式此时就是在自定义协议。那么我们具体的该如何进行约定呢详细请看下面。
2.1自定义协议的约定
2.1.1确定要传输的信息
首先你要想传输数据就得先确定好你要传输的数据都有哪些这里是根据需求文档走的比如我现在要点一份外卖那么可能就需要下面的这些信息。 2.1.2确定数据的格式
那么当上面确定好了要发送的数据之后就要规定一下要发送的数据应该是以那种格式来进行发送。在网络上传输本质上都是0101的二进制字符串此时我们需要把上述这些信息都整合成一个字符串。
这里有一个简单的方案就是直接使用分隔符来进行组织当然也不是一定要使用分隔符这里还是可以使用其他的符号来进行分隔的我们可以让属性和属性之间使用\n来进行分隔。那么只要接收方按照这套格式来组织数据接收方按照这套格式来解析数据两者只要可以对的上这样的格式就是可以的。
在实际开发中也有一些现成的格式可以直接使用比如XML里面就是使用标签的形式来进行组织的再比如现在比较流行的格式JSON他是使用{}来进行组织的。
这些我们会在后面一一给大家讲解。
3.传输层
3.1UDP
3.1.1UDP报文格式
如下图所示 端口
下面来区分一下这几个概念源IP、源端口、目的IP、目的端口。
这就几个就像是西游记里唐僧经常说的一句话“贫僧自东土大唐而来到西天拜佛取经”。这几个对应关系如下图所示
在UDP报头中就会包含源端口表明自己是从哪里来的数据同时包含目的端口号指明这些数据要到哪里去。
每个端口号在UDP中都占有两个字节它的取值范围其实是0-65535。其中小于1024的称之为“知名端口号”是给一些名气比较大的服务器预留的端口这部分端口在咱们写代码的过程中不应该使用。就像是坐飞机的时候会分为头等舱和经济舱一样的道理但是这里注意0这个端口虽然是合法的端口但是实际上是没有人使用的。
报文长度
他也是占2个字节的范围是0-65535也就是64KB。所以一个UDP报文的最大长度就是64KB这里我们可以看到64KB放在现在是一个很小的数字了所以大家在使用UDP编程的时候一定要注意UDP的数据报不能够太长否则的话就会出现问题。
校验和
在网络的传输中并不是那么的稳定可能会出现各种各样的幺蛾子。通过网线传输的时候是电信号电信号使用的是高低电频用0 1 表示。但是如果外部环境干扰比如强磁场之类的就可能会导致高电频变成了低电频低电频变成了高电频这就会导致传输的数据出现错误那么此时就需要一个判定判断一下传输的数据是不是正确的这就是校验和存在的意义它就是用来判定当前传输的数据是否出错。
举个例子
比如现在父母让我们下楼买菜要买西红柿、鸡蛋、茄子、芹菜。一共买四样菜这里的买四样菜就是一种校验和我们买完之后如果是四样那么就说明这里是有可能是对的但是如果是三样或者是五样菜那么一定是买错了注意这里小编在说买四样菜的时候为什么会说是可能是对的因为数量首先是对的但是可能买回来的菜的种类就不一样了呀
所以说如果校验和不对此时你的数据一定不对但是校验和对但是数据也是有可能是错的。
所以为了让校验和能够辨识率更高一些计算的时候通常会以数据内容作为参数来进行计算数据内容发生变化校验和也就会发生变化。
3.2TCP
在上一节中小编给大家大体介绍了一下TCP它是有连接、可靠传输、面向字节流、全双工的。TCP对数据传输提供的管控机制主要体现在两个方面安全和效率这些机制和多线程的设计原则类似保证数据传输安全的前提下尽可能的提高传输效率。那么这里的可靠传输就是TCP存在的初心也是最核心的机制。那么这里TCP是如何实现的可靠传输的呢下面给大家介绍可靠传输的十个机制确认应答、超时重传、连接管理、滑动窗口、流量控制、拥塞控制、延时应答、捎带应答、面向字节流、异常处理。下面就来展开一一给大家叙述一下这十个机制。
3.2.1确认应答
确认应答是实现可靠传输最核心的机制。比如下面的传输机制。 当A主机给B主机发送了数据1000然后此时B主机就给A主机返回一个应答报文并告诉下一个要传输的数据是从1001开始的此时A主机就会继续发送1001-2000的数据B主机又会返回一个应答并告诉下一个数据的开始时2001。
那么在网络上经常会出现后发先至的情况比如A主机发送完0-1000数据之后在发送1001-2000此时B主机先返回了2001再返回1001此时就会出现问题那么为了解决上述的问题就需要针对消息进行编号给发送消息分配一个“序号”同时应答报文给出“确认序号”。
这里确认应答发送的叫做ACK每一个ACK都会带有确认列号意思是告诉发送者我已经收到了哪些数据下一次你从哪里开始发送。 注意 确认序号的规则不是说发送方的序号是啥确认序号就是啥而是取的是发送方发过来的所有数据最后一个字节的下一个字节的序号。比如确认序号1001的含义1.表示小于1001的数据我都已经收到了 。2.我接下来想向发送方索要从1001开始的数据。
3.2.2超时重传
在网络中会经常出现一种现象叫“丢包”。
情况一数据直接丢了接收方没有收到自然就不会发送ACK。 主机A发送数据给B之后可能因为网络拥堵等原因数据无法到达主机B。如果主机A在特定时间间隔内没有收到B发来的确认应答就会重发。
情况二接收方收到数据了返回的ACK丢了。
主机A未收到B发来的确认应答也可能是因为ACK丢失了。
对于上述两种丢包情况发送方式判断不了的所以只能重传。
那么什么会出现丢包问题呢
在A主机和B主机之间还存在着很多中间的路由器...每个设备都在承担着很多的转发任务每个设备的转发能力都是有上限的某个时刻某个设备上面的流量达到峰值就可能会引起部分数据包被丢失。如果包丢了接收方就收不到了自然就不会返回ACK了发送方就会迟迟收不到应答报文发送方就视为刚才的数据包丢了就会重新再发一遍。
发送方对于丢包的判断是一定时间内没有收到ACK。
注意
对于上是的情况二B就会收到重复的数据那么这里也不用我们担心TCP这里会帮我们做好处理他会在接收缓冲区中根据收到的数据的序号自动去重这样就保证了应用程序读到的数据仍然只有一份。
解决丢包问题
TCP针对于多个丢包的处理思路就是继续超时重传但是每丢包一次超时等待时间就会变长降低了重传的频率。如果多次重传都无法得到ACK此时TCP就会尝试重置连接相当于尝试重连。如果重置连接也失败了TCP就会关闭连接放弃网络通信了。
3.2.3连接管理
TCP建立连接是通过三次握手TCP断开连接是通过四次挥手。那么下面我们就来具体看一下三次握手和四次挥手究竟是怎么一回事吧。
3.2.3.1三次握手
三次握手是TCP建立连接的一个过程。握手handshake是指通信双方进行一次网络交互相当于客户端和服务器之间通过三次交互建立了连接关系。
首先来明确两个概念
SYN称为同步报文。意思就是一方要向另一方申请建立连接。ACK称为应答报文。意思就是确认已经收到了另一方发送的申请了。
下面我们来给大家画图来演示一下整个握手的过程 这里又有同学好奇了为什么在上述中明明客户端和服务器之间进行了四次交互为什么要叫三次握手呢因为这里的SYN和ACK是可以同时打包发送给客户端的。如果是打包同时发送给客户端的话就会变成三次交互也就是三从握手了如下图所示
TCP三次握手具体流程如下所示
客户端发送SYN包客户端向服务器发送一个SYN包其中SYN标识为1表示客户端请求建立连接并指定一个随机的序列号x。服务器发送SYN ACK包服务器收到客户端的SYN包之后向客户端发送一个SYN ACK包其中SYN 和 ACK标识位均为1表示服务器接收到了客户端的请求并同意建立连接。同时服务器也会指定一个随机的序号y并将确认号设置为x 1。客户端发送ACK包客户端收到服务器的SYN ACK包后向服务器发送一个ACK包其中ACK标识位为1表示客户端确认收到了服务器的响应并将确认号设置为y 1。
那么这里在TCP的报头结构中也有体现出来。如下图所示
上述的这几个都是特殊的比特位这几个默认是0如果设置为1则表示特定的含义。
第二位也就是ACK如果是1表示当前TCP数据报是一个应答报文。第五位也就是SYN如果是1表示当前TCP数据报是一个同步报文。
了解完三次握手之后我们还得了解一下为什么要三次握手它起到了啥效果达到了啥目的呢
三次握手这个过程本质上是在投石问路它验证了客户端和服务器之间各自发送能力和接收能力是否正常。 这就像是我们在通话的时候先会确认一下对方和自己的的信号是否正常一样
3.2.3.2四次挥手
上面是三次握手是客户端与服务器之间建立连接那么怎么断开来连接呢我们这里是采用四次挥手具体的我们来看下面的图所示
四次挥手的具体流程如下所示
客户端发送FIN包客户端发送一个FIN包其中FIN标识位为1表示客户端希望关闭连接。服务器发送ACK包服务器收到客户端的FIN包后向客户端发送一个ACK包其中ACK标识位为1表示服务器已经收到了客户端的请求并将确认序号设置为客户端发送的序列号1。服务器发送FIN包服务器在发送完ACK包之后也会发送一个FIN包其中FIN标识位为1表示服务器也希望关闭连接。客户端发送ACK包客户端收到服务器的FIN包后向服务器发送一个ACK包其中ACK标识位为1表示客户端已经收到服务器的请求并将确认号设置为服务器发送的序列号1。
这里小编给大家举一个例子来方便大家的理解。假如客户端和服务器是男女朋友的关系此时他俩现在想要分手那么女生就对男生说咱两分手吧向另一方发送了FIN的请求男生收到之后给女生说我知道了向另一方发送一个ACK包表示已经收到了请求那么接下来男生说那就分手吧再向另一方发送了FIN包表示断开连接此时女生收到这条分手消息之后发个消息表示已经收到了向另一方发送ACK包表示已经接收到了。
那么这里有一个问题就是上面在三次握手的时候中间的ACK和SYN可以合并一起发送那么这里是不是也可以打包一起将FIN和ACK一起发送呢会不会变成“三次挥手”呢
答案是否首先这里需要明确一点三次握手中SYN和ACK是同一时机触发的都是有内核来完成的而四次挥手的ACK和FIN则是不同时机触发的ACK内核完成的会在收到FIN的时候第一时间返回而FIN则是应用程序代码控制的在调用到socket的close方法的时候才会触发FIN。所以是不可以合并的。 四次挥手的主要作用
确保所有的数据都被传输完成在关闭连接前双方都可能还有数据需要传输因此需要四次挥手来确保所有的数据都被传输完成。避免服务器收到来自已关闭的连接的数据在关闭连接后服务器可能会收到来自已关闭的连接的数据因此需要等待一段时间确保客户端收到了服务器的FIN包并确认关闭连接才能关闭连接。确保双方都能正确地关闭连接四次挥手的过程中客户端和服务器都需要发送FIN包和ACK包以确保双方都能正确的关闭连接避免连接一方关闭而另一方任然处于连接的状态。
因此TCP协议需要进行四次挥手以确保双方都能正确的关闭连接并避免数据的丢失和混淆。
3.2.4滑动窗口
TCP要保证的不仅仅是可靠性还要保证效率但是要提升效率往往意味着损失效率。如下所示的发送方式就是一种效率极其低的发送方式
此时主机A这边就花了大量的时间在等待ACK就相当于是发送快递总不能是发送一个包裹然后服务器等待客户端收到包裹然后再给下一个客户发送包裹吧所以想要提高效率就得批量发送数据了一次发送多条数据一次等待多个ACK如下所示
上述就是一次批量发送了4条数据发送完之后统一等待ACK每次收到一个ACK就立即发送下一条上述批量传输数据的过程就称为“滑动窗口”。
批量并不是无限发送而是发送到一定的程度就等待ACK不等待直接发送数据量是有上限的。而且是回来一个ACK就立即发下一条相当于总的要等批量的数据是一致的。此时就把等待数据的数量就称为“窗口大小”。示意图如下所示
所以此时看到的效果就像是窗口还会那么大但是往后挪动了一个格子如果收到的ACK非常快此时这个窗口就在快速的往后滑动。
那么如果在发送的过程中如果出现丢包咋办呢那么此时就是要“可靠性第一效率第二”。出现的情况可能有以下几种
情况一数据包已经到达ACK被丢了。 在上述情况中相当于是一半的ACK都已经丢了相当于是丢包率是非常的高但是注意这种情况下对于可靠性传输是没有任何影响的因为确认序号的含义表示该序号之前的数据都已经收到了后一个ACK能够涵盖前一个ACK的意思。
假设现在是1001-2000这个数据丢失了那么接收方就会继续索要1001此时不会说是因为收到的是2001-3000就会返回3001那么接下来几次的数据ACK确认序号都会是1001也就是B在反复的向A索要1001这个数据A这边收到之后就知道事情不简单就知道1001可能是丢失了此时A就会重传1001-2000这个数据了。这就是重传过程也叫快速重传。
3.2.5流量控制
流量控制也是保证可靠性的机制。上述的滑动窗口越大相当于批量发送的数据就会越多整体的速度就会越快但是真的是越快越好吗如果发送的太快那么就会瞬间把接收方的缓冲区给打满了此时数据就会出现丢包这种情况就得不偿失了还不如发送的慢一点。那么怎么才能慢下来呢这里就可以通过流量来进行控制本质上就是让接收方来限制一下发送的速度让发送的慢一点甚至阻塞一下。
具体在ACK报文中携带了一个“窗口大小”这样的字段。如下所示
注意上述的16位窗口大小只是建议发送的窗口大小并不是在发送的时候就非要采纳这个值那么接收方这里会计算出一个窗口大小的值 那么究竟是如何计算的呢它采用了一个简单粗暴的办法就是直接拿接收缓冲区剩余的空间作为窗口大小。
如下图所示
发送窗口的大小 流量控制 拥塞控制。
下面我们就来给大家讲解一下拥塞控制。
3.2.6拥塞控制
上述中讲解了流量控制滑动窗口的大小主要就时取决于流量控制和拥塞控制的。流量控制主要是衡量了接收方的处理能力而拥塞控制主要是衡量了传输路径的处理能力。
如下图所示 在传输过程中数据并不是直接就能够从主机A传输到主机B的而是通过中间若干个路由器和交换机等的传输最终才能够到达主机B 所以很明显在传输的路径上任何一个设备处理能力如果遇到了瓶颈都会对整体的传输速率产生明显的影响。
而拥塞机制要做的事情就是要衡量中间结点的传输能力要衡量中间路径上有多少个结点以及每个结点当前的情况。
那么这里是通过什么来衡量出来的呢
其实是“实验”就是通过实验的方式来找到一个合适的发送速率。开始的时候先按照一个小的速率来进行发送如果发现没有出现丢包的现象就可以提高一下发送的速率了如果出现丢包的情况则立即再把速率调小。也就是让其维持着一个动态平衡的状态。
如下图所示
具体的过程如下所示
刚刚开始传递的时候会给一个非常小的窗口比较小的初识速度也就是慢开始。然后如果发现没有丢包现象就会以指数式进行增长此时窗口的大小就会在短时间内达到一个比较大的值快速接近当前网络传输路径的能力瓶颈。当增长到一定程度出现丢包现象了此时就会认为当前窗口大小已经达到了当前路径上的传输上限了。此时就立即把窗口大小调回到一个比较小的初识值然后重复上述的过程但是第二次进入到平缓上升的阶段比第一次的要小一点。
3.2.7延时应答
延时应答就是为了提高传输效率TCP可靠性的核心就是确认应答机制ACK是要发但也不是立即就发而是稍微等一会在发送发送方如果不停的发送数据此时接收方接收到数据之后应用程序也在不停的消耗缓冲区里面的资源。此时立即返回一个ACK此时的ACK是带有一个窗口大小N的但是如果是稍等一会再发送ACK此时ACK的窗口大小大概率会比N要大一些。因为在等待的这一小会里面应用程序从接收缓冲区里会消费掉一批数据了那么就可以让下一次传过来的数据就再多一点了。
延时应答的效果就是通过这个延时让接收方应用程序乘机多消费一点此时反馈的窗口大小就会更大一丢丢此时发送方发送速率也就可能会更快一点。
3.2.8捎带应答
捎带应答他是基于延时应答的一个机制在客户端中有很多种通信模型
一问一答这是客户端和服务器之间通常使用的通信模型。多问多答多用于上传大文件。一问多答多用于下载大文件。多问多答多用于游戏串流。
如下图所示 如上所示ACK和SYN的时机本来是不同的但是由于延时应答的存在此时ACK就可能会等一会在发送回去所以就很有可能和SYN合并成一个数据报一起发送回去了。此时合并成一个数据报要比两个数据报效率要更高一些。所以这也就是之前我们将的四次挥手可能会变成三次挥手了这就是捎带应答起到的效果。
3.2.9面向字节流粘包问题
在面向字节流里面有一个比较严重的问题就是粘包问题那么什么是粘包问题呢
如下图所示
那么此时站在B主机的角度就不知道要从哪里断开了是aaa和abbbb还是啥上述中所谓的一句话就相当于是一个应用层数据报当A给B连续发了多个应用层数据报之后这些数据就会累积到B的接收缓冲区中紧紧挨在一起此时B的应用程序在读取数据的时候就难以区分从哪到哪是一个完整的应用层数据报了。就会很容易读出半个包。
那么该如何避免粘包问题呢归根结底就是一句话明确两个包之间的边界。
3.2.10异常处理心跳包
在异常关闭中有以下四种情况
进程关闭/进程奔溃进程没了socket是文件随之就会被关闭虽然进程是没了但是连接还在仍然可以继续四次挥手。主机关机正常流程关机他会先杀死所有的用户进程也会触发四次挥手如果挥完那更好如果没有挥完比如对方发来的FIN还没有来得及接收呢还没有来得及ACK就已经关机了那么此时对方就会重传FIN在重传几次之后发现都没有响应就会尝试创新建立连接如果还不行就会直接放弃连接。主机掉电直接拔掉电源此时就会瞬间关闭来不及进行任何操作。如果对端是发送端对端就会收不到ACK就会继续超时重传然后进行重置连接最后不行就会释放连接。如果对端是接收方对端是没有办法知道的你这边是没有发送数据还是没有来得及发新的数据还是直接没了。所以此时TCP内置了心跳包他是一个保活机制。心跳包是一个周期性的如果心跳没有了就相当于是挂了虽然对方是接收方但是对端会定期给发送一个心跳包ping此时就会返回一个pong,如果每次ping过去之后都有及时的pong这个时候就说明当前对端的状态良好如果ping过去之后没有pong就说明心跳没有了也就是可能已经挂了。网线断开与上述的情况一致。
3.3TCP与UDP的差别
TCP传输控制协议和UDP用户数据报协议都是传输层的重要协议它们都是用来将数据从源主机发送到目标主机的但它们存在以下几点不同
连接机制不同TCP是面向连接的协议需要在客户端和服务器之间建立一个稳定的连接然后再进行数据传输而UDP是无连接的协议数据报可以直接发送给目标主机不需要建立连接。数据传输方式不同TCP采用可靠的数据传输方式即在传输过程中使用序号、确认序号和重传机制等控制手段来保证数据的可靠传输而UDP采用不可靠传输数据的方式数据报可能会丢失或重复不提供数据可靠性保障。数据传输效率不同由于TCP需要进行连接、序号确认等额外的数据包传输因此在数据传输效率方面相对于UDP要低一些。数据大小限制不同UDP对数据包的大小有限制最大只能传输64KB的数据而TCP的数据包大小没有限制的。应用场景不同TCP适用于要求数据传输可靠性高的场景如网页浏览、文件下载、电子邮件等而UDP适用于实时性要求较高的场景如视频会议、在线游戏等。
4.网络层
4.1IP协议
4.1.1地址管理
每个网络上的设备都要能分配到一个地址并要求是唯一的。这个我们可以想象成是我们的身份证号每个人都有唯一的身份证号用来区别身份。
协议格式如下图所示
32位源IP地址本质上是一个32位的整数通常会把32位的整数转换成点分十进制的表示方式。用三个点分隔把这个整数分成4个部分每个部分一个字节每个部分的取值范围都是0-255。那么32位的整数最多能表示多少个不同的地址呢他可以表示42亿9千万个。虽然这个数字很大但是现在全时间有那么多台机器那么多的手机等其他电子产品都要进行分配IP地址这显然是不够的那么如何解决上述的问题呢我们采用了动态分配和NAT机制来进行分配我们接着往下看。
4.1.1.1动态分配IP地址
所谓动态就是让上网的设备才给分配不上网就不给分配了此时就可以剩下一大批的IP地址了但是这显然是一种不靠谱的解决方式这个机制并没有增加IP的数量只能在一定程度上缓解不能彻底解决问题。那么追要想解决问题还是得靠NAT机制。
4.1.1.2NAT机制
对于NAT机制来说他是将所有的IP地址分为两大类一个内网IP一个是外网IP。
内网IP就是以10.* 、 172.16.* - 172.31.* 、 192.168.* 以这些开头的都是内网。内网IP是可以重复出现的尤其是在不同的局域网中。外网IP就是剩下的IP都是外网IP外网IP必须是唯一的。
注意内网设备如果要访问外网设备就会给他分配一个外网IP。但是外网设备是无法直接访问内网设备的。外网的IP是不可以重复的但是内网的IP是可以重复的但是在同一个局域网中是不可以重复的。就比如一个学校中同一级的班级的班号是不可以重复的但是每一个学生在同的班级中时他们的学号就可以重复。但是在同一个班级中学号是不可以重复的。
NAT背景下的通信
外网设备—外网设备不需要任何NAT直接就可以通信。内网设备—其他内网设备不允许。外网设备—内网设备不允许。内网设备—外网设备对应的内网设备的路由器触发NAT机制进行IP替换此时就会给这个网络数据报的源IP替换成路由器自己的IP。
4.1.1.3IPv6
我们当前使用的大部分IP分配机制都是由动态分配NAT来解决的。但是我们现在大部分使用的是IPv4他是传统的IP协议使用的是4个字节32位来表示IP地址的。现在出来了IPV6他是更新了一些IP协议使用的是16个字节128位来表示IP地址的。它比之前的IP地址多出来了很多很多。但是目前为止还是有很少的在使用IPV6主要是他与IPV4并不兼容所以大部分都没有进行升级。
4.1.2路由选择
从A到B之间具体路线是怎么走的在互联网中存在很多冗余的路线那么A和B之间存在多条路线具体走哪一条该怎么选择呢
在网络中网络环境是十分复杂的某一个路由器是无法把整个网络环境都记录下来的路由器只能记录周围的情况也就是只能知道它的邻居都是谁这个是由路由器中的一个路由表来进行记录 的在实际的转发中是渐进式的类似于问路一样的逐渐接近自己的目标。
4.2IP地址的组成
IP地址主要分为两个部分网络号和主机号。
网络号标识网段保证互相连接的两个网段之间具有不同的标识。它是标识了一个局域网。主机号标识主机同一网段内主机之间具有相同的网络号但是必须有不同的主机号。它是标识了一个局域网内部的主机。
如下图所示 上述中的198.168.0 就是一个网络号以及198.168.1也是一个网络号。
此时我们通过路由器就将两个局域网给连接到一起了此时这两个局域网就称为“相邻”的局域网。这两局域网的网络号是不能重复的。那么对于上述的IP地址中是前三个字节是网络号但是一定是前三个字节就是网络号吗那不一定。对于网络号主机号的划分主要有两种方式一种是IP地址分类ABCDE另一种是子网掩码。那么接下来我们就来分别看下它两是怎么进行划分的。
4.2.1IP地址分类ABCDE
如下图所示对于ABCDE这种分法现在已经几乎不用了。这里小编就不给大家讲解了主要给大家讲解一下子网掩码是分法。
4.2.2子网掩码
其实我们可以打开我们cmd输入ipconfig就可以查看到自己电脑的子网掩码了。 我们可以看到这里是255.255.255.0那就说明IP地址的前24位都是网络号剩下的8位是主机号一般像我们家用的网络的子网掩码都是255.255.255.0。
4.3特殊的IP地址
这里先假设子网掩码是255.255.255.0。
主机号为0的IP192.168.0.0就是网络号局域网里不应该存在某个主机号是0 的。主机号全为1,192.168.255是广播地址往这个地址上发送UDP数据报此时这个数据报就会被转发给整个局域网中的所有主机。TCP不支持广播。IP为127开头的127.*称为环回IP。主机号为1的192.168.0.1一般为“网关IP”。
5.数据链路层/物理层
5.1以太网
数据链路层和物理层对于程序猿来说距离就更远了在数据链路层中有个协议是以太网。
下面是以太网的格式
在上述中的源地址和目的地之就是我们之前给大家交代的mac地址。
CRC是校验和。
IP数据报是用来传输数据的以太网帧。
下面的两个是特殊的以太网帧。
在IP数据报中有一个数字是1500把这个数据链路层数据帧最大载荷长度称为MTU。如果承载的数据长度超过MTU就会在IP层进行分包是每个分出来的结果都能在MTU之内。
在IP中有一个工作就是来完成这个分包/组包的工作的如下图所示 结束语
好啦这节小编就给大家分享到这里啦这节的内容有点多大家有啥不会的可以在评论区留言给小编希望这节对大家了解网络有一定帮助想要学习的同学记得关注小编和小编一起学习吧如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津在此小编先谢过各位大佬啦