大家好,我是Leo。

之前聊过了 ​​MySQL​​ ,​​Redis​​,​​秒杀系统​​,​​RocketMQ​​。

近2个月聊聊 计算机网络基础原理

思路

整篇思路就是从体系结构开始,利用一个实际场景一步一步介绍每一层的含义与作用。

在五层交互过程中,有一个高频问题就是TCP的沾包问题,我们从沾包入手。分别介绍了什么是沾包,为什么沾包,怎么处理沾包,UDP为什么不沾包等顺序。

一系列交互,展开了介绍了影响网络性能的指标。

3万字聊聊计算机网络(一)_计算机网络

计算机网络体系结构

体系结构

OSI对比TCP/IP去掉了表示层和会话层,把网络层和物理层合二为一,变成了TCP/IP的网络接口层

3万字聊聊计算机网络(一)_计算机网络_02

TCP/IP结构介绍

  • 应用层:HTTP,SMTP,DNS,RTP,POP3,RPC,GTP,DHCP
  • 运输层:TCP,UDP
  • 网际层:IP,ICMP
  • 网络接口层:PPP,网络接口1-n

OSI结构负责的任务

  • 应用层:解决通过应用进程的交互来实现特定网络应用的问题
  • 运输层:解决进程之间基于网络的通信问题
  • 网络层:解决分组在多个网络上传输(路由)的问题
  • 数据链路层:解决分组在一个网络(或一段链路)上传输的问题
  • 物理层:解决使用何种信号来传输比特的问题
  • 表示层:解决通信双方交换信息的表示问题【已合并】
  • 会话层:解决进程之间进行会话问题【已合并】

输入....回车流程

网上冲浪,肯定都会,比如早期的4399小游戏。当我们输入 ​​www.4399.com​​,它会自动在前面自动补齐 https。https这部分的知识暂时跳过,这里主要介绍一下我们是如何看到数据的一个流程。

​www.4399.com​​ 是一个域名,也是url。浏览器只知道名字,但是不知道具体的ip地址,所以不知道应该如何访问。于是,它打开地址簿去查找。可以使用一般的地址簿协议DNS去查找,还可以使用另一种更加精准的 地址簿查找协议HTTPDNS。

不管什么方式查询,它会得到一个ip为 ​​49.71.74.18​​ 。有了ip地址就等于在互联网中知道了这个网站的门牌号

C:\Users\AOLang>ping www.4399.com

正在 Ping www.4399.com.lxdns.com [49.71.74.18] 具有 32 字节的数据:
来自 49.71.74.18 的回复: 字节=32 时间=8ms TTL=55
来自 49.71.74.18 的回复: 字节=32 时间=7ms TTL=55
来自 49.71.74.18 的回复: 字节=32 时间=9ms TTL=55
来自 49.71.74.18 的回复: 字节=32 时间=8ms TTL=55

49.71.74.18 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位): 最短 = 7ms,最长 = 9ms,平均 = 8ms

应用层

根据OSI七层协议模型,有了ip浏览器会首先在 ①应用层 组装他的请求包了,组装完成之后会通过Socket编程转到下一层进行处理。

4399使用的是https协议。无论是http和https请求包里都是告诉服务端我要拿到4399的首页数据。

https与http不同的地方就是https采用了443端口,他会首先向服务器提交一个可支持的校验算法列表。拿到列表后会通过http的80端口交互数据。

3万字聊聊计算机网络(一)_计算机网络_03

传输层

应用处理完,到了②传输层。传输层有两种协议

  1. 无连接的UDP
  2. 面向连接的TCP

面向连接:会保证这个包能够到达目的地,如果不能到达就会重新发送,直至到达。

无连接:尽管发其他不管。

对于安全性高的网站一般会选用TCP协议来保证安全

TCP协议里有两个端口,一个是浏览器端口,另一个是这个浏览器中的4399小游戏的端口。操作系统通过端口号判断数据包分发给哪个程序。

3万字聊聊计算机网络(一)_计算机网络_04

网络层

传输层封装完成之后,继续通过Socket转发给 ③网络层 。网络层的协议是IP协议。在IP协议中会有本地的IP信息,有了本地的IP信息再拿到4399小游戏的目标IP信息。

3万字聊聊计算机网络(一)_计算机网络_05

有目标的IP信息远远不够,因为不可能通过一个IP去不断寻找。

对于IPv4协议,IP地址一共32位,为了方便人类阅读和分析,分成了四段,每段8位,中间用点分隔。

IP地址分成两种意义:

  1. 网络号,标识该IP地址属于哪个子网
  2. 主机号,标识同一个子网下的不同IP信息(上文介绍的IP信息就是这里的IP)

分成两种意义的依据是 子网掩码,通过子网掩码计算出IP地址的网络号和主机号。在寻址的过程中,先匹配到相同的⽹络号,才会去找对应的主机

除了具有寻址能力,还有一个重要的能力就是路由。实际场景中,两台设备并不是⽤⼀条⽹线连接起来的,⽽是通过很多⽹关、路由器、交换机等众多⽹络设备连接起来的,那么就会形成很多条⽹络的路径,因此当数据包到达⼀个⽹络节点,就需要通过算法决定下⼀步⾛哪条路径

所以寻址就是帮我们处理应该往哪个方向走,路由则是根据方向选择合适的路径。

数据链路层

网络层处理之后,转到了 ④数据链路层

操作系统首先会判断内网还是外网,如果是内网的话,转发过去(不是立马发,只是处理封装一层一层数据)。

如果是外网,我们知道了IP地址,但是无法锁定到这个IP地址对应的设备号。于是我们需要借助数据链路层来为我们提供链路级别传输的服务。

数据链路层套的是ARP协议,路由器计算出下一个目的地的IP地址,再通过ARP协议寻找目的地的网关,也就是MAC地址。网卡再将包发出去。由于这个包里有MAC地址,因此它能够到达网关。

网关:操作系统启动的时候,就会被 DHCP 协议配置 IP 地址,以及默认的网关的 IP 地址 192.168.20.1

无线局域网适配器 WLAN:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::980a:fd91:faf0:1d6e%23
IPv4 地址 . . . . . . . . . . . . : 192.168.20.7
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.20.1

3万字聊聊计算机网络(一)_计算机网络_06

网关往往是一个路由器,网关收到包之后,会直接判断要转发给哪个网关(路由)。不会再判断是否内网转发了,因为内网转发是 ​​内网IPA​​ 与 ​​内网IPB​​ 直接通信。

判断的依据就是路由表信息

网关与网关之间的沟通和通信采用路由协议。常用的路由协议有 OSPF 和 BGP

3万字聊聊计算机网络(一)_计算机网络_07

物理层

数据链路层处理之后,就转到了 ⑤物理层 。物理层就是把上面的四层打包好的数据,转换成电信号,让其可以在物理介质中传输,它主要是为数据链路层提供⼆进制传输的服务。

按照上面路由器计算IP,然后获取MAC的方式不断转发。最后MAC地址与目的地的MAC地址相同,就不做路由转发了。取下MAC头部信息, send for 操作系统的网络层,网络层解析IP地址也对应上了就取下IP头部信息。

网络层取下了IP头部信息后就转发给传输层了,IP头部信息封装了一层TCP头部信息,取到了TCP头部信息。

由上图可知,TCP头部信息包含端口号,我们通过端口号找到了这个4399系统。4399系统通过这个包里的HTTP内容后会去对相应的程序处理。

查询到的数据放入TCP报文中,然后从应用层到物理层一层一层封装原路 ⑥回传!。

到底目的地后,收到的每个包都会有一个回复的包说明已经收到了。这个回复的包仅仅是TCP层的一个说明,会沿着刚才来的方向走回去报个平安。

结构流程图

3万字聊聊计算机网络(一)_计算机网络_08

参考,引用CSDN的FYR博主

TCP沾包

什么是沾包

在组包过程中,把上一个包的内容与下一个包里的粘在了一起被错误地当成了一个数据包解析了出来。这就是所谓的粘包

3万字聊聊计算机网络(一)_计算机网络_09

为什么会出现粘包?

字节流可以理解为一个双向的通道里流淌的数据,这个数据其实就是我们常说的二进制数据,简单来说就是一大堆 01 串。这些 01 串之间没有任何边界。 应用层传到 TCP 协议的数据,不是以消息报为单位向目的主机发送,而是以字节流的方式发送到下游,这些数据可能被切割和组装成各种数据包,接收端收到这些数据包后没有正确还原原来的消息,因此出现粘包现象。

什么是TCP协议?

TCP,Transmission Control Protocol。传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。

怎么处理粘包?

粘包出现的根本原因是不确定消息的边界。接收端在面对"无边无际"的二进制流的时候,根本不知道收了多少 01 才算一个消息。一不小心拿多了就说是粘包。其实粘包根本不是 TCP 的问题,是使用者对于 TCP 的理解有误导致的一个问题。

只要在发送端每次发送消息的时候给消息带上识别消息边界的信息,接收端就可以根据这些信息识别出消息的边界,从而区分出每个消息。

很多时候我们会采用加入包头,包尾,消息长度,校验信息等方式来处理沾包

3万字聊聊计算机网络(一)_计算机网络_10

扩展:UDP为什么不沾包

UDP是基于数据报的传输层通信协议,TCP是基于字节流的传输层通信协议,数据报格式不会出现首尾不区分,所以不会沾包。

影响网络性能指标

  • 速率:连接在计算机网络上的主机在数字信道上传送比特的速率,也称为 比特率数据率
  • 带宽:表示网络的通信线路所能传送数据的能力,因此网络带宽表示在单位时间内从网络中的某一点到另一点所能通过的最高数据率
  • 吞吐量:表示在单位时间内通过某个网络的数据量,受网络的带宽和额定速率的限制
  • 时延 : 分发送时延,传播时延,处理时延。
  • 时延带宽积 :传播时延和带宽的成绩,若发送端连续发送数据,则在所发送的第一个比特即将到达终点时,发送端就已经发送了时延带宽积个比特
  • 往返时间: 在许多情况下,因特网上的信息不仅仅单方向传输,而是双向交互,我们有时很需要知道双向交互一次所属的时间
  • 利用率: 利用率分信道利用率和网络利用率,信道利用率表示某信道有百分之几的时间是有数据通过的。网络利用率表示全网络的信道利用率的加权平均。利用率并发越高越好,利用率越大,时延也会越大。但是也不能太低,会使资源白白浪费。
  • 丢包率: 丢包率也是分组丢失率,指在一定的时间范围内,传输过程中丢失的分组数量与总分组数量的比率。影响这个数值的重要因素是分组误码,结点交换机缓存队列满