聊聊网络的那些事

我们知道,网络是基于数据包的形式进行通信的,如下图所示,那不同的主机,可能相隔十万八千里,但是也可以互相访问,那他们之间又是怎么进行通信的呢?接下来让我来捋一捋大致的过程吧!

聊聊一些常见的网络协议

网络是分层的,可分为基于TCP/IP的五层协议和基于ISO/OSI的七层协议,如下图所示,不同层之间有着对应的网络协议

聊聊一些常见的网络协议

网络为什么要分层?

因为,是个复杂的程序都要分层。当然网络包的格式很复杂,这个程序也很复杂。复杂的程序都要分层,这是程序设计的要求。比如,复杂的电商还会分数据库层、缓存层、Compose层、Controller层和接入层,每一层专注做本层的事情。每一层都存在相对于的协议,如在应用层有最常用http协议,传输层有TCP、UDP协议,网络层有IP协议,数据链路层有MAC协议。为什么会有协议?协议类似于一种公认的约定,如果没有这种公认的约定,那一台机器将数据包发送给另一台机器后,那台机器应该是挺懵逼的,这都是啥?

数据包如何到达目的地

首先我们从浏览器输入一个链接访问页面开始,当我们输入https://www.baidu.com这一行字符串在浏览器后,会返回以下内容,就是百度的页面,那为什么会返回以下的页面呢?

聊聊网络的那些事

首先浏览器会对域名进行对应的解析,会解析出httpswww.baidu.com,解析完成后,我们的电脑要往哪里去请求数据呢?这时候需要用到DNS服务,去查询www.baidu.com对应的真实IP地址在哪,如果本地缓存DNS缓存则直接可以获取

DNS

DNS是Domain Name System,即域名系统,是互联网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库。

当发生DNS服务之前,我们的电脑会检查本地是否存在缓存,若存在则直接获取对应的IP,若不存在,则会发送请求到DNS,首先会访问根DNS,根据请求的域名为.com,会为你指路,返回.com顶级域DNS服务器的IP地址,让你去访问这个地址获取对应的地址,然后到.com的DNS服务器上去访问,此时.com让你去baidu.com区域的权威服务器上,让你去区域权威服务器上去获取对应的地址,最终,我们到达baidu.com区域的权威服务器上,终于得到了对应的IP地址,如下图所示,一级一级的去查询,最终在区域权威服务器上得到了你想要的内容。

聊聊网络的那些事

http协议

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。

获取了对应的IP,这时候需要封装http对应请求行,请求头和请求主体,在浏览器上,我们可以查看到对应的信息

聊聊网络的那些事

https协议

HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。

聊聊网络的那些事

https是使用对称加密+非对称加密去实现其安全性,在进行数据传输之前,需要进行TLS四次握手,以交换密钥,签名,证书等信息。

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的,在将 TLS 证书部署服务端时,证书文件中包含一对公私钥,其中公钥会在 TLS 握手阶段传递给客户端,私钥则一直留在服务端,一定要确保私钥不能被窃取。通过wireshark我们可以抓取TLS握手过程

聊聊网络的那些事

TCP协议

http协议是运行在TCP协议之上的。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,对于TCP的特点,可以概况为以下点

  • 顺序问题 ,稳重不乱;
  • 丢包问题,承诺靠谱;
  • 连接维护,有始有终;
  • 流量控制,把握分寸;
  • 拥塞控制,知进知退。

我们可以通过wireshark对数据包进行抓包,以下我们可以查看到TCP协议对应的内容,协议会包含源端口号、目标端口号、序号、确认序号、连接标志位、窗口大小和对应的数据等。当然tcp的具体特性,这里不展开讲,具体的细节可以自己查看相关资料。

聊聊网络的那些事

连接维护

TCP是面向连接的协议,在正式连接前会进行三次握手,断开连接时会进行四次握手,此时,客户端和服务端会根据标志位去判断连接状态,收到对应的标志位会执行对应的操作,类似状态机的模式,如下图所示,以保证连接的可靠性

聊聊网络的那些事

流量控制

对于TCP的流量控制,TCP 为了防止发送方无脑的发送数据,导致接收方缓冲区被填满,所以就有了滑动窗口的机制,它可利用接收方的接收窗口来控制发送方要发送的数据量。可以从下图看到,每次服务端发送数据都会有对应的窗口大小信息来告知客户端。

聊聊网络的那些事

对于复杂的网络环境,服务端可能会存在各种情况,缓存空间可能会慢慢被占满,这时不能一次性发送大量数据给客户端,所以会通过滑动窗口字段来告诉客户端,这次数据包发送的大小,客户端也可以做相应的调整。

顺序保证

一次http请求可能会分为多个tcp数据包组成,服务端根据数据内容并根据自身的缓存空间情况,将内容分割为多个数据包发送给客户端,客户端通过拼接传输的数据包,以完成数据传输,这其中由于网络问题,可能传输过来的数据包顺序是不一致的,这时候就需要判断数据包的序列号,来确认数据包的顺序

聊聊网络的那些事

重传机制

由于服务端会分割多个数据包进行传输,在复杂的网络环境下,可能会存在丢包的问题,所以在客户端接收到服务器的数据包后,需要发送确认应答的信息给服务器,让服务端知道客户端已经接收到了,不然超过一定的时候,会触发机制,服务端会认定可能存在丢包的现象,会重新发送没有收到确认应答的数据包

聊聊网络的那些事

拥塞控制

在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大….

于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。 为了在「发送方」调节所要发送数据的量,定义了一个叫做「拥塞窗口」的概念。

拥塞窗口 cwnd是发送方维护的一个 的状态变量,它会根据网络的拥塞程度动态变化的

IP协议

IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。

TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。

在wireshark工具上,我们可以查看到IP协议的内容,其中包含了源地址IP和目标地址IP,还有一些其他的信息如首部校验和、协议信息、标志信息、数据等信息。

聊聊网络的那些事

MAC协议

接下来,我们来到数据链路层,在 MAC 包头里需要发送方 MAC 地址和接收方目标 MAC 地址,用于两点之间的传输。

以下是wireshark工具上,查看的MAC协议的内容,包含了发送方的MAC地址和接收方的MAC地址。

聊聊网络的那些事

MAC地址相当于网络世界的身份证,每台主机的MAC地址都是唯一的,到了这里,我们需要添加发送方的MAC地址,这个好办。直接从自己的机器获取即可,可是对于目标主机的MAC地址,我们该如何获取呢?这时候就需要ARP协议了。

ARP协议

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

为了获取目标的MAC地址,ARP协议会在以太网中以广播的形式,对以太网的所有设备进行呼叫,这个IP是谁的呀?当存在设备响应后,我们就可以获取目标的MAC地址。

聊聊网络的那些事

网卡

IP 生成的网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。

经过一系列不可描述的操作,最终网卡会将包转化为电信号,通过网线发送出去。

网关

在任何一台机器上,当要访问另一个IP地址的时候,都会先判断,这个目标IP地址,和当前机器的IP地址,是否在同一个网段。在这里我们返回百度的网址,很明显不是在同一网段上面,那接下来该怎么办呢?

这时候我们需要将请求发送到默认网关上。如何发往默认网关呢?网关不是和源IP地址是一个网段的么?这个过程就和发往同一个网段的其他机器是一样的:将源地址和目标IP地址放入IP头中,通过ARP获得网关的MAC地址,将源MAC和网关的MAC放入MAC头中,发送出去。网关所在的端口,例如192.168.1.1/24将网络包收进来,然后接下来怎么做,就完全看网关的了。

MAC地址是一个局域网内才有效的地址。因而,MAC地址只要过网关,就必定会 改变,因为已经换了局域网。两者主要的区别在于IP地址是否改变。不改变IP地址的网关,我们称为转发网关;改变IP地址的网关,我们称为NAT网关。(细节太多,就不一一介绍了)

聊聊网络的那些事

小结

综上所述,数据包通过一层层协议的封装,在网线中进行传输,如下图所示,类似套娃的形式,上层协议必要依赖于下层协议,下层协议可以没有上层协议,但上层协议不能没有下层协议。

聊聊网络的那些事

参考

探究!一个数据包在网络中的心路历程

趣谈网络协议

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

有很多不懂的内容,但是我大受震撼

2年前 评论
oliver-l (楼主) 2年前

补了一点内容 :stuck_out_tongue_winking_eye:

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!