网络原理-

文章目录

  • 协议
    • 应用层
    • 传输层
    • 网络层
  • 数据链路层


协议

在网络通信中,协议是非常重要的概念.协议就是一种约定.

在网络通信过程中,对协议进行了分层

接下来就按照顺序向大家介绍每一种核心的协议.

应用层

应用层是咱们程序员打交道最多的一层协议.应用层里有很多现成的协议,但是有些并不适用于一些特定场景.需要咱们自己自定义协议.

自定义协议我们约束好两方面内容:
1.服务器和客户端要交互哪些信息
2.信息发送的具体格式

这里我们可以用两种方式编辑数据的格式

(1)xml
在这里插入图片描述
< requst >< /requst>就是标签(tag)
利用xml可读性和扩展性都明显提高.但是整个信息冗余太多了,会导致标签占据的空间比数据还多.在进行网络传输的时候,会占用网络带宽.

json
json是当下比较主流常用的数据组织格式了.

在这里插入图片描述
应用层我们就介绍到这里,接下来我们介绍传输层

传输层

UDP协议
特点:无连接,不可靠传输,面向数据报,全双工.

UDP数据报:报头+载荷.
在这里插入图片描述
UDP报头一共有四个字段,每个字段有2个字节.由于协议用2个字节表示端口号.端口号取值就是0-65535,所以最大值就是64kb.因此一个数据报最大长度就是64kb.一旦数据报长度超过64kb,就会发生数据截断.

端口号前文我们有过介绍,就是数据传输后,传到具体到哪个应用程序(每个程序都有自己的端口号).

校验和:验证数据在传输过程中是否正确.检查当前传输的数据是否存在bit翻转.如果错了,就把数据报丢弃.

校验和是如何实现的?
1.CRC算法(循环冗余校验)
在这里插入图片描述
UDP在发送数据之前就会先计算一下CRC值,把算好的CRC值放到UDP数据报中,发送给接收方,接收方在拿到数据后,也会计算CRC值,如果传过来的值和接收方计算的值相等.就证明数据是正确的.

2.md5算法

特点:
(1)长度一定
无论原始数据多长,最终算出的md5值都是固定的长度

(2)分散
计算md5值的时候,如果数据发生一点点变化,结果就会有很大差异.

(3)不可逆
一个字符串,计算md5的值.但是如果想根据计算出的md5的值得到字符串几乎是不可能的.

TCP协议(最重要)

特点:有连接,可靠传输,面向字节流,全双工

在这里插入图片描述
源端口和目的端口这里我们就不做介绍了

4位首部长度.就是报头长度.在TCP中报头前20字节是固定长度的.
他的最大长度是60字节.

在这里插入图片描述

保留(6位):为协议的未来发展提供了灵活性。如果未来网络通信的需求发生了变化,需要引入新的特性,保留位可以被重新定义,而不会影响到现有协议的正常运行。

TCP的可靠传输的十个机制

TCP的可靠传输,是TCP的在互联网浪潮的安身立命之本.

这里的可靠性并不是保证数据100%发送到对方,而是发送方能够知道对方是否收到.

用来确保可靠性,最核心的机制就是"确认应答"

1.确认应答:
在这里插入图片描述
就像我请女神去吃饭,女神欣然给我回应.这样我就知道女神接收到了我要请他吃饭的消息.

发送方发出数据,接收方给一个回应,就知道了接收方收到了发送方的数据.

后发先至:
在这里插入图片描述
由于数据传输的过程中会经过很多设备,路由器交换机.如果数据1先发送但是数据堵在了半路,数据2虽然后发送.但是路线通畅,可能就会导致后发先至.
可能就会导致接收方先接收到数据2并且返回ack(应答报文)给发送方,此时发送方就以为是数据1的应答报文,这就乱套了

为了解决上面的现象.引入了序号和确认序号.告诉发送方,应答的是哪个数据.
发送方先发送序号为1的数据,后来发送了序号为2的数据,但是由于网络路径的原因可能序号为2的数据先被接收,此时序号的作用就是在接收方内会根据序号大小对数据进行排序,按照从小到大的顺序返回给发送方.
在这里插入图片描述

在这里插入图片描述
序号是发送方发给接受方的
在这里插入图片描述
报头中的序号只能存一个数字,但是由于序号都是连续的,我们存第一个就可以知道后续的序号.

确认序号是接收方返回给发送方的
在这里插入图片描述
如果发送的数据是1-1000,返回的确认序号是1001,就证明前面1000个数据都已经收到了.并且告诉发送方要从第1001个数据发送数据.

TCP的确认应答是保证TCP可靠性的最核心机制

2.超时重传(是确认应答的补充)
在发送方发送数据之后,并没有受到应答报文(ack报文),就是接收方并没有给出应答.

如果一切顺利,发送方就会接收到接收方发回的确认应答.
但是网络传输中会存在"丢包"现象,如果数据包丢了,自然也就收不到ack报文

小知识:
什么是丢包?
在这里插入图片描述
如果一台设备在同一时间涌入大量数据,超过设备本身承载的极限,就会丢弃一些数据,就会发生丢包.

丢包的情况在网络通信中还是很常见的.但是发送方接收不到ack报文(接收方返回的确认应答的报文),有两种情况:
1.数据在发送的时候发生丢包,接收方并没有收到数据
在这里插入图片描述
2.接收方接收到了数据,但是返回给发送方的ack报文丢了.
在这里插入图片描述
针对第二种情况,在没有收到ack报文,但是数据已经被接收方收到.那么TCP会怎么处理?

TCP socket在内核中有内存缓冲区,发送方发来的数据是要先放在接收方的缓冲区中的.然后应用程序调用read或者scanner.next来读取数据.
在这里插入图片描述
当发送方没接收到ack报文的时候,就会超时重传.发送的数据如果会存到接收方的内存缓存区中.此时新的数据会用自己的序号和缓冲区数据的序号做比较,如果有序号一样的,就丢弃新数据.

但是如果数据被应用程序读取走了,此时新的数据在缓冲区就无法和原来的数据比较序号了.我们应该怎么办?
注意,应用程序在读取数据的时候,是按照序号的从小到大顺序连续读取的.
此时socket api会记录上一次读取的数据的序号是多少.

比如上一次读取的数据的序号是3000,新收到的数据包的序号是1001,由于应用程序在缓冲区读取数据都是从小到大的,所以1001已经读取过了,这里又重新传来序号为1001的数据,所以就重复了,直接丢弃.

3 三.TCP的连接(三握四挥).
TCP的连接是热门高频面试题.十分的重要.

建立连接: 内核和应用程序的相互配合建立连接
在这里插入图片描述

那么客户端内核是如何操作才和服务器的内核建立连接的呢?重点来了

三次握手(建立连接)

此处谈到的连接是虚拟的连接,是"虚拟的,抽象的",我们把通信双方各自保存了对端的信息就称为连接
在这里插入图片描述
客户端这一方是主动的,第一次交互,一定是客户端发起的.就像是客户端求服务器办点事,一定是客户端先张嘴.

建立连接的流程:客户端主动发起连接请求.给服务器发送一个syn数据包,里面保存了客户端的信息.此时服务器接收到这个数据包之后会给客户端返回一个ack(应答报文),就是告诉客户端,我收到了.紧接着,服务器也给客户端发送了一个syn数据包,里面包含了服务器的信息,此时就和我们连接的概念一样了,通信双方都保存了对方的信息.客户端收到了服务器的syn后会给服务器返回一个ack,告诉服务器我收到了,这样就建立了连接

在这里插入图片描述

syn(同步报文段):是一个特殊的TCP数据报.
1.没有载荷.不会携带应用层的数据
2.是TCP6个标志位的第五个
syn表达的是:我(客户端)想和你(服务器)建立连接
虽然syn不带应用层载荷,但是会包含IP报头(包含设备IP)和TCP报头(包含设备应用程序的端口号).
包含的这些东西就是告诉接收方我是谁.我是哪个设备的哪个程序

所谓建立连接的过程就是通信双方各自给对方发送一个syn(同步报文段),双方各自回应一个ack(应答报文).

有人会问,不是三次握手嘛,但是上面通信双方出现了四次交互啊?
虽然是四次交互,但是有两次可以合并.
在这里插入图片描述
于是就有下面的图
在这里插入图片描述
上面这个图就是三次握手,通过三次握手就建立了连接.

三次握手建立连接的意义:
1.三次握手.可以先针对通信路径.进行投石问路.初步检查下通信线路是否畅通.
就类似先行官一样,先在前面开路.确定路线不会出问题,大臣才会出发.

2.三次握手.验证通信双方,发送能力和接收能力是否正常
在这里插入图片描述

3.三次握手.过程中也会协商一些参数.

这里我们就只是介绍下,TCP通信的起始序号.TCP在一次通信中传输的数据的序号不是从0开始的,而是从一个很大的数开始的,以这个数字为开头计算.即使是同一个服务器和客户端,通信完再次连接的时候,传输的数据的序号也不是上一次的序号.这样做的目的就是为了防止"前朝的剑,斩本朝的官".
在这里插入图片描述
假设我们再传输数据的时候,数据"先发后至(先发出的数据最后到达)“.
通信双方连接已经断开了连接,并且已经建立了新的连接.此时上一个连接传输的数据才到达对端,但是发现已经改朝换代了.此时这个数据就会被丢弃.
那么接收方是如何识别当前的数据包是上一个连接的数据呢?
正常的数据包的序号都是连续的,即使发生"丢包”,但是整体差异不会很大,之前的包的序号和现在的连接的传输的包差异还是很大,就像鹤立鸡群了.一下子就发现了.

四次挥手(断开连接)
断开连接需要进行四次挥手,和三次握手(建立连接)不同的是,三次挥手必须是客户端是主动的一方,主动发起连接请求,而四次挥手(断开连接)哪一方主动都可以
在这里插入图片描述
FIN:结束报文段,是TCP的6个标志位中的最后一个.用于断开连接,FIN是通过close来触发.

TCP的状态转换(也很重要)
在建立连接(三次握手)的过程中的状态转换.
在这里插入图片描述

LISTEN状态:就是指ServerSocket 已经创建好,并且绑定了端口号.可以进行连接请求了.这个状态只有服务器这边才会有

 public TcpEchoServer(int port) throws IOException {socket=new ServerSocket(9090);}

在这里插入图片描述
可以看到当我们在编译器上运行我们的服务器的时候,打开cmd观察,此时我们并没有运行客户端的代码,自然也就没有连接.此时的LISTEN就是等待连接请求.

ESTABLISHED状态:此时就是已经建立连接完毕了

此时我们将客户端代码也运行,建立客户端-服务器的连接
在这里插入图片描述
再次打开cmd我们就发现,出现ESTABLITSHED就证明成功连接.

在断开连接(四次挥手)时TCP的状态.
在这里插入图片描述
CLOSE_WAIT状态:被动的断开连接.接收方知道对方不再发送数据,但是自己这边的可能还有数据要发送,所以不会立即关闭连接.等到逻辑执行完毕,调用socket.close()方法向对端发送FIN

TIME_WAIT:主动断开连接的一方,本端先给对面发送了FIN之后,对端也给本段发送了FIN,于是本端就进入了TIME_WAIT.它存在的意义就是为了防止最后一个ACK"丢包".
在这里插入图片描述

如果在TIME_WAIT断开连接,那么如果最后一个ACK丢包的话,那么服务器这边没有收到ack报文,于是会重新传FIN数据包.但是已经断开了连接.重传的FIN也就无法返回ACK了.

此时TIME_WAIT最多会等待2MSL.(一分钟),虽然生活中的一分钟很短,但是对于计算机来说,却是很长的.如果这么长时间都没重传.估计客户端返回给服务器最后的那个ack也已经被收到了.

4.滑动窗口
TCP的可靠传输固然很好,但是付出的代价也是很多的.每次传输一个数据后都要等待a接收到ck报文,才继续传输下一个.导致大量的时间都浪费在等待返回ack上了.
在这里插入图片描述
由此,滑动窗口出现了.它可以保证可靠性的基础上提高效率.

在这里插入图片描述
滑动窗口的核心机制就是批量传输.之前是发送一条数据,收到ack后,才能发送下一条数据.

批量传输,就是连续发好几条数据,不等ack,连续发了一定数据之后统一等ack.这样就减少了总的等待时间.
在这里插入图片描述
批量发送了四个数据之后,等到返回了一个ack,就往后发一组,接着返回接着发一组,以此类推.
在这里插入图片描述

如图,我们就把上面白色的区域(不等待ack,批量传输的数据量)称为窗口大小.上图就是四个数据为一个窗口.发送完数据后,等待一个ack返回后就继续执行.

就类似于假设我们设置窗口大小为4000字节.比如发送方发送了1-4000的数据,此时收到了1-1000的ack(应答报文).此时就会向右滑动,可以发送4001~5000的报文了.再收到ACK2001的话 就可以发送5001~6000的报文了 以此类推.

假如发送了上图1~1000 1001~2000 2001~3000 3001~4000 这个四个数据段,然后收到一个ack就开始走,等到收到ack确认序号是窗口中最后一个数据的序号(4000)的时候,4001-5000,5001-6000,6001-7000,7001-8000这几个数据段也已经被发送完毕了.

其实就是边返回ack边进行传输

滑动窗口,保证可靠性是前提,但是如果出现丢包会怎么办呢?
1.ack丢了
在这里插入图片描述

这里我们假设1-1000的确认序号为1001的ack报文丢了,但是确认序号为2001的ack报文成功返回.因为前面介绍过,确认序号返回有两个意思:这里假设确认序号为2001,(1).前2000个数据都已经被成功接收了.(2).可以开始传输2001开始往后的数据了

所以这里ack报文并不影响.

2.数据丢了
虽然ack报文丢了不会影响,但是数据就不一样了.
在这里插入图片描述
在上述重传的过程中,整体的效率还是非常高的.这里对于重传做了针对性重传.哪个丢了就重传哪个.
已经收到的数据不必重复发送,发送方连续三次收到重复ack,就会立即重传.这就是"快速重传".
在这里插入图片描述
5.流量控制
我们知道可以通过滑动窗口来提高传输效率.

而窗口大小越大,更多的数据用同一块时间等待.效率就会越高.但是窗口大小能无限大嘛?

很显然不能.如果你发送的数据太快,接收方的内存缓冲区满了.接收方处理不了.此时也会发生丢包.
与其知道他满了,不如提前感知到,减慢发送速度.改变窗口大小.
我们知道TCP包含了16位窗口号大小.接收方通过ack报文将接收缓冲区剩余空间的大小,作为ack中的窗口大小的数值.下一步发送方就会根据这个数值来调整窗口大小.

窗口大小是否就是64位?
不是的,TCP报头的选项中,包含了窗口扩展因子.实际上设置的窗口大小.是16位窗口大小*2^窗口扩展因子
在这里插入图片描述
流量控制的思想就是通过接收方内存缓冲区的大小来决定传输速率.因为接收方返回的ack报文会带上接受缓冲区剩余的时间.如上图,我们先传入1-1000的数据,接收方成功收到后,接收方还剩3000字节的空间,用ack告知发送方还剩3000字节的空间.继续传输1001-2000,2001-3000,3001-4000.
当传输完4000字节数据后.发现接收缓冲区满了,并且知道接收缓冲区一直是接收数据,数据并没有被应用层读取.由于已经满了,发送方就不能再发送数据了.否则会发生丢包.那么发生方什么时候才可以继续传输数据呢?

此时发送方会时不时的出发"窗口探测包","窗口探测包"不携带任何载荷,不会对业务产生影响.但是会出发ack,此时一旦有数据在接收方被读取,缓冲区就会有空闲空间并且通过ack返回给发送方,此时发送方就可以继续发送数据了.

6.拥塞控制
上述的流量控制是针对接收方的,而拥塞控制就是针对数据传输中路线的设备的.因为网络通信本身也是生产者-消费者模型,发送方是生产者,接收方是消费者,而中间的传输线路的设备(路由器,交换机)就是阻塞队列.如果生产者生产数据太快,此时阻塞队列就会满了,必须等消费者消费一波才可以继续发送.在网络通信中如果传输数据太快,超过设备本身负载量,也会发生丢包.
在这里插入图片描述
流量控制我们可以通过ack报文知道缓冲区的剩余空间.但是拥塞控制中是中间传输设备可能会满,传输数据中会有很多设备传输.而且我们也不知道是哪个设备负载量满了发生丢包.那么我们如何处理?

这里我们就把整个中间传输的线路看作一个整体.通过"实验"的方式找到一个合适的传输速率.
如果按照某个窗口大小发送数据之后,出现丢包,就视为中间路径存在拥堵,那么我们就要减少窗口大小.如果没出现丢包,我们就要增大传输速率.

拥塞控制是怎么把窗口大小试出来的.
1.慢启动.刚开始传输数据的时候,速率是比较小的.采用的窗口也就比较小.
2.如果上述传输数据的时候没有发生丢包,那么就增大窗口大小,就是增大传输速率.(这里是按照指数增大)
3.指数增长,不会一直保持的,当指数增长传输达到阈值,指数增长就会变成线性增长.
4.线性增长也是一直在增长,到达一定传输速率,还是会发生丢包.一旦出现丢包,就把滑动窗口重置成最小的值,回到第一条慢启动的过程.并且也会重新设置阈值.
在这里插入图片描述
7.延时应答
接收方在收到数据之后不会第一时间向发送方返回ack(确认报文),而是稍等一会.等这一会,接收方可能会在内存缓冲区中读取一些数据,缓冲区空间就会增大.此时再返回ack,那么窗口大小可能会设置的更大一点.
在这里插入图片描述
延时应答具体怎么延时,也不是单纯的按照时间,而是按照"ack"丢了来处理.
我们前面讨论,滑动窗口传输数据的时候如果ack丢了,影响其实不大的,我们知道接收方从缓冲区读取数据都是按照序号的从小到大顺序读取的.如果1-1000的数据的ack丢了,但是2001的ack返回了,我们也就知道了1-1000的数据也被读取成功了.

我们这里的处理方式正常每次传输一个数据都会返回一个ack,这里我们就可以没隔几个数据返回一个ack, 这样就起到了延时应答的效果,并且不用频繁的返回ack,也节省了开销.

8.捎带应答
基于上面的延时应答机制,我们可以把ack(应答报文)和requst/response一起发送/接收.从而提高效率.
在这里插入图片描述

正常我们传输一条数据后,接收方会立即返回一个ack,这是TCP机制控制的,由系统内核返回的.如果我们用延时应答,此时ack可能会和response或者requst一起发送,就达到了捎带的效果.
利用延时应答+捎带应答,四次挥手也可能会变成三次.

9.面向字节流

“粘包问题”.
在这里插入图片描述
在这里插入图片描述
如何解决:
1.通过特殊符号作为分隔符.见到第一个分割符,就认为一个包结束了.

2.指定出包的长度,比如在包开始的位置上,加上一块特殊空间表示整个数据的长度.
在这里插入图片描述
10.异常情况
在这里插入图片描述
在这里插入图片描述

网络层

网络中的IP协议,主要完成以下两方面的工作
1.地址管理
2.路由选择

首先我们先认识下IP协议的报头
在这里插入图片描述
++++++++++++++++++++++++++++++++++++++++++++++++++++++
4位首部长度: 指的就是报头长度,也是可以像TCP一样可变长的.


4位版本:指的是当前IP协议版本(一般是IPv4和IPv6).


8位服务类型: 实际上只有4位有效.并且这4位彼此冲突,如果其中1位为1,剩下3位就都是0.这四位表示当前IP协议所处的模式.
(1)最小延时:表示数据传输中尽量减少延迟
(2)最大吞吐量:表示传输中尽量增加传输速率
(3)最高可靠性:虽然不像TCP那样,但是也保证了一定的可靠
(4)最小成本:硬件的开销


16位总长度: 描述了一个IP数据报的长度(报头+载荷),这里IP协议最大也是只能传输64kb的数据吗?如果构造一个特别大的TCP是不就传输不了了.
虽然IP协议本身有长度限制,但是它可以对数据进行拆包和组包这样的操作.

拆包:
在这里插入图片描述
这里本人绘画技术有限,献丑了各位O.o?

组包:
在这里插入图片描述
16位标识:就是指的是哪些数据报的载荷应该往一起组装.

3位标志:只有两位有效,其中1位标识当前数据是否已经拆包了,还有一位数据表示结束标记.

13位片偏移:表示这些包之间的先后顺序


8位生存时间(TTL):这里的生存时间不是s/ms,它指的是次数.当数据经过一个路由器转发,TTL-1.本质上是为了防止数据一直传输下去.TTL一般来说都是32/64位的整数.这些其实就已经完全够了.

假设我们访问美国官网,就经历了30次转发
在这里插入图片描述


8位协议:表示在传输层使用的哪个协议(TCP/UDP).

16位首部校验和:只是针对IP报头的校验,载荷已经在传输层检验了.

32位源IP地址和32位目的IP地址:表示发件人和收件人地址.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

IP协议如何管理的地址
IP地址就是一个32位整数,为了方便,用"点分十进制"表示.通过3个 . 分成了四个部分.每个部分一个字节,每个部分的取值是0-255.

IPv4 地址 . . . . . . . . . . . . : 192.168.10.208

IP地址存在就是为了区分网络上不同的设备.

32位的整数表示数据范围大概是42亿9千万.看起来是一个天文数字,但是现如今的互联网时代,这些数字不是很抗打.那么我们该如何解决呢?

1.动态分配IP地址
利用时间差,有人上网,也有人休息.不是全世界人民同时一起上网.

2.NAT机制(网络地址映射)
我们先把IP地址分为两大类
(1)私网IP/局域网IP
IP地址是以10*_,192.168*,172.16-172.31*都是私网IP
(2)公网IP/广域网IP
除了上述私网剩下的都是公网IP.

这里我们要求公网的IP必须是唯一的
私网IP在相同的局域网内必须是不同的,但是在不同的局域网中之间的IP可以重复

上述约定有一个重要的限制:
1.公网访问公网,是可以访问的
2.局域网访问局域网(同一局域网内),也是可以访问的
3.局域网访问局域网(不同局域网),是不可以访问的
4.局域网访问公网,需要对局域网设备的IP进行地址转换.
5.公网不允许主动访问局域网

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在这里插入图片描述
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在这里插入图片描述
当同一局域网内的不同设备访问同一个服务器,此时路由器在收到数据后,会有一个表,表内存储了,替换之前的IP,以及两个设备各自的端口号,以及目的IP和目的端口.当服务器返回响应给路由器的时候,路由器就不能根据访问的IP地址来转换IP地址了,因为两个设备访问的都是同一个服务器.此时就路由器就会拿出刚才的存储的表,通过源端口号进行分别,并且将IP地址转换回来
++++++++++++++++++++++++++++++++++++++++++++++++++++++
客户端分配的端口号是系统随机分配的,可能会存在两个端口号相同的情况,那么我们该如何返回数据
在这里插入图片描述
虽然我们认为不同的设备可能系统分配的端口号不会一样,但是是在大多数情况,如果是极少数情况我们会做如下应对.
如果两个设备端口号一样,并且访问的服务器也一样.那么我们将IP地址在路由器转换后,会先将端口号也替换掉,然后当服务器返回响应的时候,路由器会拿出存储好的表,根据替换好的端口号来将替换好的IP协议进行转换并且返回
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.IPv6(根本上解决问题)
将IP地址从32位增加成了128位

相当于变成了2^128 个地址

“给每粒沙子都分配一个地址”

迟迟没有完全落地 因为所有的硬件设备都得换,而且对体验提升不大

但是中国已经覆盖到70%,虽然使用率一般,但是防止了美国在IP地址上的垄断操作

避免大漂亮直接给你断网


路由选择

由于网络结构错综复杂,每个路由器都掌握了局部信息,无法掌握全局的信息.
不同于我们现在使用的地图软件,只需要我们将起点和终点输入就可以得到很多条路线,这是在上帝视角看来,站在全局的角度,而我们可以根据路线找到最优解.对于地图而言,出发之前,路线就已经规划好了
而对于路由器规划的网络传输线路,则是摸索式,自己一点一点走,路线不是固定的.出发之前并不是按照某一条线路固定的走.这种传输就像是我们没有导航一样的,从家里出发去到某一个地点,期间可能会找很多人问路,直到走到终点.
如何判定数据包应该发到哪里??
这就依赖路由器存储了一个路由表结构,能找到路线就直接发送,否则按照默认发送

在这里插入图片描述
每一次问路我们都会离目标更近一点.直到走到终点.


数据链路层

数据链路层的核心协议就是以太网
在这里插入图片描述
数据链路层引入另外一种地址体系:mac地址/物理地址

和IP地址不同的是,IP地址注重的是全局的转发,从起点到终点,而mac地址则是相邻设备之间的转发
举个例子:
假如我们从长沙出发前往北京,具体路线是长沙-武汉-石家庄-北京
此时我们从长沙到武汉—>源IP:长沙;目的IP:北京; 源mac;长沙 目的mac:武汉
武汉->石家庄 源IP:长沙; 目的IP;北京 源mac:武汉 目的mac:石家庄
石家庄->北京 源IP:长沙;目的IP:北京; 源mac:石家庄 目的mac:北京
类似我们传输数据,每次经过一个交换机/路由器的时候,IP地址是不变的,但是mac地址会改变.

因为mac地址的表示范围比IPv4大很多,所以mac地址是静态分配的,机器出厂的时候就分配一个,一直都只是这一个不会像IP地址一样可能会发生改变.
鉴于mac地址一个机器就有一个mac地址,有些程序可能会使用mac地址作为身份标识(比如外挂)

1.目的地址 需要发送到的MAC地址
2.源地址 发送的源地址


3.类型 分为几种类型
类型 0800 + 数据报(16-1500字节) 可能是syn这样的特殊报文也可能是正常的业务数据
类型0806 ARP 请求/应答 + P
类型8035 RARP请求/应答 + PAD

ARP就是能够让路由器在内部建立一个结构 可以通过IP地址找到mac地址
RARP和ARP一样,但是是通过mac地址找到IP地址


关于DNS(域名解析系统)
我们如果使用IP地址描述网络设备的位置,可读性不是很好.
这里我们用一串可读性更好的单词描述设备的位置,这就是域名
www.baidu.com就是域名
上古时期都是引入一个hosts文件,这里有很多文本,有很多IP和域名.通过hash表存储.每次访问域名就会进行查询,返回对应的IP地址
随着互联网的高速发展,不停的维护hosts文件也会耗时耗力,于是大佬们就搭建了一组服务器,来提供域名解析的服务.某个主机想要访问某个域名,此时就先查询一下域名解析服务器.将IP地址返回给主机


如果全世界的大量的用户访问DNS服务器,服务器不就崩了?
我们的解决办法就是每个国家的运营商通过搭建"镜像服务器",我们上网的时候,直接访问咱们中国的"镜像服务器"即可

网络原理就像大家介绍完了,如果有介绍不对或者有欠缺的,希望指出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试】Java面试频繁问到的题最新整理(附答案)

文章目录 一、Java基础部分面试题 1.1. Java面向对象的三个特征1.2. Java中基本的数据类型有哪些 以及他们的占用字节1.3. int和Integer的区别1.4. String、StringBuilder、StringBuffer的区别及使用场景1.5. ArrayList、Vector和LinkedList的区别及使用场景1.6. Collection和…

从零搭建微服务项目Base(第7章——微服务网关模块基础实现)

前言&#xff1a; 在前面6章的学习中已经完成了服务间的调用实现&#xff0c;即各微服务通过nacos或eureka服务器完成服务的注册&#xff0c;并从nacos中拉取配置实现热更新。当某个服务接口需要调用其他服务时&#xff0c;通过feign定义接口&#xff0c;并通过注解配置服务名…

C# ConcurrentQueue 使用详解

总目录 前言 在C#多线程编程中&#xff0c;数据共享如同走钢丝——稍有不慎就会引发竞态条件&#xff08;Race Condition&#xff09;或死锁。传统Queue<T>在并发场景下需要手动加锁&#xff0c;而ConcurrentQueue<T>作为.NET Framework 4.0 引入的线程安全集合&a…

在Vue项目中使用three.js在前端页面展示PLY文件或STL文件

前言&#xff1a;这是一个3d打印局域网管理系统的需求 一、安装three.js three.js官网&#xff1a;https://threejs.org/docs/#manual/en/introduction/Installation 我用的是yarn,官网用的是npm 二、使用three.js 1.在script部分导入three.js import * as THREE from thr…

DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

大数据学习(46) - Flink按键分区处理函数

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Transformer多头注意力并行计算原理与工业级实现:从数学推导到PyTorch工程优化

一、核心数学原理剖析 1.1 多头注意力矩阵分解 Q XW^Q ∈ R^{nd_k} K XW^K ∈ R^{nd_k} V XW^V ∈ R^{nd_v} 多头分解公式&#xff1a; head_i Attention(QW_i^Q, KW_i^K, VW_i^V) 其中 W_i^Q ∈ R^{d_kd_k/h}, W_i^K ∈ R^{d_kd_k/h}, W_i^V ∈ R^{d_vd_v/h} (h为头数…

通过监督微调提升多语言大语言模型性能

引言 澳鹏助力一家全球科技公司提升其大语言模型&#xff08;LLM&#xff09;的性能。通过提供结构化的人工反馈形式的大语言模型训练数据&#xff0c;让该模型在30多种语言、70多种方言中的表现得到优化。众包人员们进行多轮对话&#xff0c;并依据回复的相关性、连贯性、准确…

大数据开发治理平台~DataWorks(核心功能汇总)

目录 数据集成 功能概述 使用限制 功能相关补充说明 数据开发 功能概述 数据建模 功能概述 核心技术与架构 数据分析 功能概述 数据治理 数据地图 功能概述 数据质量 功能概述 数据治理资产 功能概述 使用限制 数据服务 功能概述 数据集成 DataWorks的数据…

用Nginx打造防盗链护盾

用Nginx打造防盗链护盾 一、你的网站正在"为他人做嫁衣"&#xff1f; 想象一下这个场景&#xff1a; 你精心拍摄的摄影作品、录制的课程视频、设计的原创素材&#xff0c;被其他网站直接盗用链接。 更气人的是——当用户在他们网站查看这些资源时&#xff0c;消耗的…

STM32 看门狗

目录 背景 独立看门狗&#xff08;IWDG&#xff09; 寄存器访问保护 窗口看门狗&#xff08;WWDG&#xff09; 程序 独立看门狗 设置独立看门狗程序 第一步、使能对独立看门狗寄存器的写操作 第二步、设置预分频和重装载值 第三步、喂狗 第四步、使能独立看门狗 喂狗…

Kubernetes的Ingress 资源是什么?

在Kubernetes中&#xff0c;Ingress资源是一种用于管理集群外部对内部服务访问的API对象&#xff0c;主要用于将不同的外部请求路由到集群内的不同服务&#xff0c;以下是关于它的详细介绍&#xff1a; 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…

vue3-03初学vue3中的配置项setup(Composition API (组合API组件中所用到的:数据、方法等,均要配置在setup中)

1.关于setup Vue3.0中一个新的配置项&#xff0c;值为一个函数.setup是所有Composition API (组合API)“表演的舞台”m组件中所用到的:数据、方法等等&#xff0c;均要配置在setup中。 2..setup函数使用 setup函数的两种返回值 1.若返回一个对象&#xff0c;则对象中的属性、…

【go语言规范】 使用函数式选项 Functional Options 模式处理可选配置

如何处理可选配置&#xff1f; Config Struct 方式 (config-struct/main.go) 这是最简单的方式&#xff0c;使用一个配置结构体&#xff1a; 定义了一个简单的 Config 结构体&#xff0c;包含 Port 字段创建服务器时直接传入配置对象优点&#xff1a;简单直接缺点&#xff1a…

leetcode 2585. 获得分数的方法数

题目如下 数据范围 莫要被困难的外衣骗了&#xff0c;本题就是有数量限制的完全背包问题。显然我们可以令 f(x,y)为当有x种题目时分数为y时的方法数 令某种题目的数量为k 那么方法数应该是 f(x,y) f(x - 1,y - k * (分值))其中(0 < k < 题目数量)通过代码 class So…

深入理解JavaScript中的异步编程与Promise

一、引言 在JavaScript的世界中&#xff0c;异步编程是一个核心概念&#xff0c;尤其是在处理网络请求、文件操作或任何可能阻塞主线程的任务时。本文将深入探讨JavaScript中的异步编程模型&#xff0c;特别是Promise对象的使用。 二、异步编程基础 2.1 什么是异步编程&…

VS Code 如何搭建C/C++开发环境

目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…

如何查询网站是否被百度蜘蛛收录?

一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”&#xff0c;例如“site:example.com”&#xff08;请将“example.com”替换为你实际的网站域名&#xff09;。如果搜索结果显示了你的网站页面&#xff0c;并且显示了收录的页面数量&#xf…

数仓搭建:DWS层(服务数据层)

DWS层示例: 搭建日主题宽表 需求 维度 步骤 在hive中建数据库dws >>建表 CREATE DATABASE if NOT EXISTS DWS; 建表sql CREATE TABLE yp_dws.dws_sale_daycount( --维度 city_id string COMMENT 城市id, city_name string COMMENT 城市name, trade_area_id string COMME…