计算机网络重要知识点

内容来源于飞天闪客,讲的非常通俗易懂。

网络是怎么传输的?

https://www.bilibili.com/video/BV1tseyzCEoF?spm_id_from=333.788.videopod.sections&vd_source=c815609efed4d3ffbba6f23ca86d94ae

集线器(物理层)

两台电脑之间想要通信,可以直接通过一条网线进行连接。但是随着网线的增加,每台电脑的线太过混乱,不好管理。

所以就有了集线器这样的设备,把各自的网线都插到这个设备上,再由这个设备做个转发,这样网线多的问题就解决了。

集线器会将传进来的包转发到所有出口。这样的话存在一个问题,不知道包是谁发给谁的。每个设备都有自己的mac物理地址,是网络硬件的唯一标识符,传输的包中需要再加上数据链路层头部源mac地址和目标mac地址。

当然,这个时候,其他电脑其实还是可以看到不属于自己的包的数据的内容,所以就有了新的需求:将包只发给一个设备就好了,也就衍生出了更加智能的集线器:交换机。

交换机(数据链路层)

交换机内部维护着一张mac地址表,记录了每个设备的mac地址和对应的交换机端口号。包在传递的时候就会根据包信息,将包数据传输给对应的端口。

但是最开始的时候mac表是空的,是怎么样一点点维护起来的呢?

一开始的时候交换机就是一个集线器,不过它知道学习,把流经自己的数据包携带的信息记录下来了,然后就学习到对应的mac映射表:

这基本就是现在常用的单交换机的形式,但是交换机的端口也不够用了怎么办呢?于是就有了多个交换机之间的通信。

这个时候一个端口对应的mac地址也就会变多了,所以要维护的mac地址表也就会逐渐增加,此时应该怎么办呢?

那这时就又有了新的设备了,在交换机与交换机之间连接一个新的设备。没错,就是大家非常常见的路由器了。

路由器(网络层)

它的功能就是作为一台独立的mac地址设备,将数据包作一次性转发。路由器每个端口都是独立的mac地址。

左边的端口6对应路由器的mac地址,那问题是端口6的数据怎么先发给路由器的呢(原本是要发给E,F,G,H这四个设备的)?

此时就引入了ip地址的概念了,192.168.0.1。此时我们再来看完整的发布过程:

一包数据除了需要加上数据链路层头部源mac,目标mac,还需要加上网络层头部源ip,目标ip的信息。

A与B通信时,直接可以通过交换机获得信息,通过源mac和目标mac就可以传递。

A与C通信时,A需要先把数据发给路由器,然后再转交给C。

A要给C,过程中先给到路由器,所以数据链路层的目标mac要是路由器的mac地址,网络层的ip必须是A的ip到C的ip。

先看传给路由器的时候,数据是:

由于数据先给路由器,此时的目标mac和目标ip对应如上所示。接下来路由器给到C的时候,有个神奇的过程,它会把目标mac自动变成目标ip对应的mac地址。

第一个问题

如果A给C发送数据,怎么知道需要路由器转发数据呢?

这里就涉及到子网 的概念,如果源ip与目标ip在同一个子网,直接将包通过交换机 发出去。如果源ip与目标ip不在同一个子网,就会交给路由器 去处理。是否在同一个子网又是通过掩码去判断的。

子网掩码常用255.255.255.0,将原ip与掩码进行与运算,相等就是同一个子网。

第二个问题

A怎么知道哪个是路由器的呢?

有一个默认网关的概念,默认网关就是一个ip地址。当遇到不是在同一个子网的电脑时,先把包发给默认网关对应的ip地址,所以就会先给路由器的ip地址。

第三个问题

数据包在发送时是需要mac地址和ip地址的,现在虽然有了ip的相关数据了,但是没有mac地址。

此时是一个叫ARP协议的东西,这个机制会把ip与mac地址进行对应,同样,需要先进行一次映射。这个协议是广泛使用的,交换机和路由器都会要通过ARP协议维护一个ip与mac的映射表。

第四个问题

路由器怎么把包再往下传递呢?

对于交换机来说,还有一个路由表,对应的是ip和端口,把目标ip范围得到,查表得到端口。当然也是存在ARP协议的,将mac地址获取到。

完整的数据包的传输过程

电脑视角

  1. 首先要知道我的ip和对方的ip。

  2. 通过子网掩码判断我们是否在同一个子网。

  3. 在同一个子网就通过arp获取对方mac地址直接扔过去。

  4. 不在同一个子网就通过arp获取默认网关的mac地址直接扔过去。

arp缓存表:用于缓存ip地址和mac地址的映射关系。

交换机视角

  1. 我收到的数据包必须有目标mac地址。

  2. 通过mac地址表查映射关系。

  3. 查到了就按照映射关系从我的指定端口发出去。

  4. 查不到就所有端口都发出去。

mac地址表:用于映射mac地址和它的端口。

路由器视角

  1. 我收到的数据包必须有目标ip地址。

  2. 通过路由表查映射关系。

  3. 查到了就按照映射关系从我的指定端口发出去。

  4. 查不到则返回一个路由不可达的数据包。

路由表:用于映射ip地址和它的端口。

路由器中也有arp缓存表,用于缓存ip地址和mac地址的映射关系。

小结

网络层(IP协议)本身没有传输包的功能。

包的实际传输时委托给数据链路层,也就是以太网中的交换机来实现的。

网络是怎么可靠的?

https://www.bilibili.com/video/BV1tseyzCEoF?spm_id_from=333.788.player.switch&vd_source=c815609efed4d3ffbba6f23ca86d94ae&p=3

传输层头部包括源端口,目标端口。

加上端口号之后,就从主机和主机之间的通信变成了进程和进程之间的通信。

A怎么知道包丢了?

让B告诉A。

丢了怎么办?

重传。

重传机制

ARQ(automatic repeat request,自动重传请求)

停止等待式

A发送数据包,只有等A收到了B的ACK反馈,才继续发下一个包。如果等待反馈时间很久,则认为数据包丢失,需要进行重传。这种方式可以保证数据传输可靠性,但也存在问题,即数据传输效率太低。

累计确认式

A连续发送数据包,B收到数据包后回复ack号,表示已经收到ack号之前的数据包,下一个A应该发的序号是ack。这种方式可以提高数据传输效率,但也存在问题,如果A发送数据速率过快,B接收数据速率不够时会出现堵塞等问题。

滑动窗口

假如B给A传回来的窗口大小为5,当A不断发送数据包时,已发送的最后一个序号就往右边移动,直到碰见了窗口的上边界,此时A就无法继续发包,达到了流量控制。在A发包的同时,A也会不断收到来自B的确认包,此时整个窗口就会往后移动,因此上边界也往右移动,A就能发更多的数据包了。

A和B的收发能力决定了滑动窗口的大小,网络环境的好坏决定了拥塞窗口的大小。

后退N步式

优点:A连续发送数据提高了系统的吞吐量。

缺点:由于B仅按序接收数据,那么在重传时又必须把原来已正确传送过的数据进行重传(仅因为这些数据分组之前有一个数据分组出了错)。

选择重发式

优点:信道利用率最高,对时延敏感性低。

缺点:序列号需要维护,对序列号传输要求高,存储空间开销大。

建立连接-TCP三次握手

存在问题:B服务器可能还没有做好准备,A客户端就开始发消息,这样就算A发了B也收不到。

建立一个 TCP 连接需要"三次握手",缺一不可:

  1. 第一次握手 (SYN) : 客户端向服务端发送一个 SYN(Synchronize Sequence Numbers)报文段,其中包含一个由客户端随机生成的初始序列号(Initial Sequence Number, ISN),例如 seq=x。发送后,客户端进入 SYN_SEND 状态,等待服务端的确认。

  2. 第二次握手 (SYN+ACK): 服务端收到 SYN 报文段后,如果同意建立连接,会向客户端回复一个确认报文段。该报文段包含两个关键信息:

    • SYN:服务端也需要同步自己的初始序列号,因此报文段中也包含一个由服务端随机生成的初始序列号,例如 seq=y。

    • ACK (Acknowledgement):用于确认收到了客户端的请求。其确认号被设置为客户端初始序列号加一,即 ack=x+1。

    • 发送该报文段后,服务端进入 SYN_RECV 状态。

  3. 第三次握手 (ACK) : 客户端收到服务端的 SYN+ACK 报文段后,会向服务端发送一个最终的确认报文段。该报文段包含确认号 ack=y+1。发送后,客户端进入 ESTABLISHED 状态。服务端收到这个 ACK 报文段后,也进入 ESTABLISHED 状态。

至此,双方都确认了连接的建立,TCP 连接成功创建,可以开始进行双向数据传输。

断开连接-TCP四次挥手

断开一个 TCP 连接则需要"四次挥手",缺一不可:

  1. 第一次挥手 (FIN) :当客户端(或任何一方)决定关闭连接时,它会向服务端发送一个 FIN (Finish)标志的报文段,表示自己已经没有数据要发送了。该报文段包含一个序列号 seq=u。发送后,客户端进入 FIN-WAIT-1 状态。
  2. 第二次挥手 (ACK) :服务端收到 FIN 报文段后,会立即回复一个 ACK 确认报文段。其确认号为 ack=u+1。发送后,服务端进入 CLOSE-WAIT 状态。客户端收到这个 ACK 后,进入 FIN-WAIT-2 状态。此时,TCP 连接处于**半关闭(Half-Close)**状态:客户端到服务端的发送通道已关闭,但服务端到客户端的发送通道仍然可以传输数据。
  3. 第三次挥手 (FIN) :当服务端确认所有待发送的数据都已发送完毕后,它也会向客户端发送一个 FIN 报文段,表示自己也准备关闭连接。该报文段同样包含一个序列号 seq=y。发送后,服务端进入 LAST-ACK 状态,等待客户端的最终确认。
  4. 第四次挥手 :客户端收到服务端的 FIN 报文段后,会回复一个最终的 ACK 确认报文段,确认号为 ack=y+1。发送后,客户端进入 TIME-WAIT 状态。服务端在收到这个 ACK 后,立即进入 CLOSED 状态,完成连接关闭。客户端则会在 TIME-WAIT 状态下等待 2MSL (Maximum Segment Lifetime,报文段最大生存时间)后,才最终进入 CLOSED 状态。

只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

网络是怎么保证安全的?

https://www.bilibili.com/video/BV1tseyzCEoF?spm_id_from=333.788.player.switch&vd_source=c815609efed4d3ffbba6f23ca86d94ae&p=3

对称加密

加密和解密使用相同密钥。

非对称加密

加密和解密使用不同密钥。

公钥加密,私钥解密,可以实现消息的保密传输,即无法被偷看到。

私钥加密,公钥解密,可以防止消息被篡改。

中间人攻击

中间人通过传过来的公钥、对称加密的密钥、伪造的公钥可以篡改加密解密过程,获取到通信密钥,可以解析传输的内容。

可靠的第三方

为了防止公钥B被篡改,可以把公钥B交给可信的第三方CA,第三方用自己的私钥X加密,就是做了一个数字签名。发送方再把数字签名和公钥B发给接收方,接收方通过第三方的公钥Y解密,可以拿到公钥B,也可以和发送方的公钥B进行对比,查看是否被篡改。如果被篡改,则拒绝后续交互。

相关推荐
网安小白的进阶之路2 小时前
B模块 安全通信网络 第一门课 园区网实现与安全-1
网络·安全
leonardee3 小时前
Spring Security安全框架原理与实战
java·后端
q***5183 小时前
Spring Cloud gateway 路由规则
java
空空kkk3 小时前
SpringMVC框架——入门
java·spring
liyi_hz20083 小时前
云原生 + 国产化适配:O2OA (翱途)开发平台后端技术栈深度解析
java·后端·开源软件
⑩-4 小时前
缓存穿透,击穿,雪崩
java·redis
合作小小程序员小小店4 小时前
web网页开发,在线%考试管理%系统,基于Idea,html,css,jQuery,java,jsp,servlet,mysql。
java·前端·intellij-idea
程序媛_MISS_zhang_01104 小时前
vant-ui中List 组件可以与 PullRefresh 组件结合使用,实现下拉刷新的效果
java·linux·ui
曹牧4 小时前
Java中处理URL转义并下载PDF文件
java·开发语言·pdf
dragoooon344 小时前
[Linux网络——Lesson2.socket套接字 && 简易UDP网络程序]
linux·网络·udp