网络是怎样连接的(六)—— 协议栈内部探索步骤

380 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

往期文章

前言

在之前的文章中,我们介绍了发送消息的场景。首先浏览器解析域名,然后生成 HTTP 请求消息,并通过 DNS 服务器解析域名对应的 IP 地址,最终委托操作系统发送消息。

在接下来的文章中我们将视角切换到协议栈的内部,探索数据在协议栈内部是如何流通的。实际上是转化为电信号来传输数据。

在文本中我们捋一下协议栈内部学习的步骤:首先还是收发消息委托的四步:创建套接字、连接服务器、收发数据、从服务器断开连接并删除套接字,在介绍完 TCP 协议是如何收发消息之后,我们再来探索下实际网络包是如何收发的,以及另一个协议 UDP 的介绍。

探索步骤

创建套接字

从应用程序收到委托后,协议栈通过 TCP 协议收发数据的操作可以分为 4 个阶段。首先是创建套接字,在这个阶段,我们将介绍协议栈的内部结构、套接字的实体,以及创建套接字的操作过程。

连接服务器

接下来是客户端套接字向服务器套接字进行连接的阶段。我们将介绍“连接”具体是进行怎样的操作,在这个过程中协议栈是如何工作的,以及客户端和服务器时如何进行交互的。

比如我们经常提起的 TCP 三次握手

收发数据

两端的套接字完成连接之后,就进入收发消息的阶段了。在这个阶段,协议栈会将从应用程序收到的数据切成小块并发送给服务器,考虑到通信过程中可能会出错导致网络包丢失,协议栈还需要确认切分出的每个包是否已经送达服务器,对于没有送达的包要重新发送一次。这里我们将对收发数据的情形加以说明。

从服务器断开连接并删除套接字

收发消息的操作全部结束之后,接下来要断开服务器的连接并删除套接字。断开操作的本质是当消息收发完成后客户端和服务器相互进行确认的过程,但这个过程并不只是相互确认并删除套接字那么简单,后面我们会详细介绍。

IP 与以太网的包收发操作

在介绍 TCP 协议收发消息的操作之后,我们再来看看实际的网络包是如何进行代收发的。协议栈会与网卡进行配合,将数据切分成小块并封装成网络包,再将网络包转换成电信号或者光信号发送出去。介绍完这个过程之后,大家应该就可以对计算机网络功能有一个完整的概念了。

用 UDP 协议收发数据的操作

TCP 协议有很多方便的功能,比如网络包出错丢失时可以重发,因此很多应用程序都是使用 TCP 协议来收发数据的,但这些方便的功能也有帮倒忙的时候,在这种情况下我们还有另外一种叫 UDP 的协议。我们会介绍 UDP 的必要性以及它与 TCP 的差异。

注:QQ 的实现即以 UDP 协议为主,TCP 协议为辅。

参考文档

  • 《网络是怎样连接的》—— 户根勤