写在前面

本文为科普性质的文章,不会关注细节,因此肯定有不严谨的地方,加之本人水平有限,文章内容很可能会有错误

如果想了解详细内容可自行查询资料。

正文

当我们按下回车发送一条QQ消息时都发生了什么呢?

击键信息的处理

图片加载失败

名词解释:

  • 翻译芯片:电脑内的芯片,可以将键盘发出的电信号转化为键码,并通知CPU。
  • 键盘中断:一种通知CPU的有按键被按下的方式。
  • 键码:一个数字,每个键码都唯一对应一个按键。
  • 击键信息:对键码进一步处理,比如判断是否是 Ctrl+C 这种快捷键或者只是单纯地按下了 C 键。
  • 击键信息队列:所有的击键信息先来后到地在队列中排队。
  1. 当我们敲击键盘时键盘会通过线路发送一个电信号,每个按键对应的电信号都不同。
  2. 翻译芯片会识别出不同的电信号并转化为键码临时存储在芯片内。
  3. 然后翻译芯片会向 CPU 发出一个信号,告诉 CPU 有一个按键被按下了。
  4. CPU 接到信号后会自动执行一段代码,这段代码的功能是操作系统决定的。
  5. 这段代码的功能可以概括为从芯片中读取出键码,做了必要处理后交给操作系统的内核处理。
  6. 内核收到键码后会判断一些信息,如判断用户的输入窗口所在程序便于准确发送信息,以及综合之间的击键历史,判断是否为组合键。
  7. 判断完毕后会对将给键码添加一些额外信息组成“击键事件”,并将其放到指定程序的“击键消息队列”中。
  8. QQ 会定期从“击键消息队列”中取出“击键事件”,并给予用户反馈。

消息发送过程(你的电脑里)

图片加载失败

名词解释:

  • 信息[1]:添加诸如发送方 QQ 号和接收方 QQ 号等信息。
  • 信息[2]:添加本机的IP地址以及网卡需要识别的信息。
  • 信息[3]:添加网卡地址、纠错码等信息。
  • 某台网络设备:通常是家用路由器,如果用流量的话则是基站,最终转到某台专业路由器。
  1. QQ 会在聊天信息的基础上添加一些额外信息,如发送时间和接收方 QQ 号,然后将信息加密,生成信息[1],交给操作系统处理。
  2. 操作系统拿到信息后会添加本机的 IP 地址和一些网卡识别所需的信息,生成信息[2],并发送给网卡。
  3. 网卡拿到信息后会继续添加一些信息,如网卡地址,纠错码等,生成信息[3],最终通过网线或者WIFI发送出去给家用路由器或基站等设备。

消息发送过程(传输到QQ服务器)

图片加载失败

名词解释:

  • 专业路由器:专业路由器的功能和家用路由器区别很大,专业路由器是专门用来转发信息的,处理能力通常远大于家用路由器。
  • 选择转发线路:通往QQ服务器的线路可能有多条,有些线路很慢,容易出错,有些则不是,路由器会尽量选择状况良好的线路转发信息。
  1. 家用路由器内的网卡拿到信息后会读取发送方网卡生成的信息(即信息[3])并做出一些动作,如读取纠错码判断数据是否在传输过程中出错,如果出错则通知重传。
  2. 网卡处理完毕后会交给路由器内的软件判断这个信息的去向,这时的判断根据时发送方操作系统生成的信息,即信息[2],如果数据去向是互联网而不是局域网(局域网可以理解为连接在同一个路由器下的设备组成的网络),那就通过网线或者WIFI发送给小区的网络设备。
  3. 小区的路由器经过相同判断后会将其转发给运营商的专业路由器。
  4. 专业路由器会根据信息[2]以及各个线路的网络状态选择出转发线路,可能是转发给下一个专业路由器或者直接转给 QQ 服务器。
  5. 经过多次转发最终将数据转发给了 QQ 服务器。

消息发送过程(QQ服务器)

图片处理失败

  1. QQ 服务器也是一台电脑,所以依然要先由网卡读取信息[3]并进行纠错等操作,最后上交给操作系统。
  2. 操作系统读取信息[2],进行了一系列操作后将信息发送给安装在 QQ 服务器上的 QQ 消息管理程序。
  3. QQ 消息管理程序读取信息[1]后将聊天信息存储到对应的数据库中,等待消息接收方的查询请求。

消息接收过程

图片处理失败

  1. 接收方的 QQ 软件会向QQ服务器定期发送查询请求。
  2. 同样是经过 QQ 自身处理生成信息[1],接收方操作系统处理生成信息[2],接收方网卡处理生成信息[3]并发送出去。
  3. 同样是经过专业路由器的多次转发最终送到 QQ 服务器手里。
  4. 同样经过QQ服务器的网卡处理,QQ服务器的操作系统处理后将信息[1]发送给QQ消息管理程序。
  5. QQ消息管理程序读取信息[1]之后从数据库中取出对应的聊天信息发送给接收方QQ。
  6. 同样经过QQ服务器的操作系统和网卡处理生成信息[3],并将其发送出去。
  7. 同样是经过专业路由器的多次转发最终送到接收方的电脑。
  8. 最终通过接收方的网卡、操作系统和 QQ 自身处理,将聊天信息显示到屏幕上。

总结

你可能会发现在信息传输过程中网卡,操作系统和软件都在做很多相同的事情,都交给一个角色去做不好么?

如果我全部交给QQ去做,那么QQ在开发的时候起码要去适配每个网卡,这不是一个软件应该做的事情,开发效率也不允许这样。

如果全部交给操作系统去做,那基本上就是操作系统出厂自带QQ了。那么以后只要出一个新的软件都必须更新操作系统。一个公司想要开发一个软件也必须要去改动操作系统的代码,这很可怕的。因为并不是每个公司都有能力改动操作系统,其次操作系统代码的知情范围太大会导致漏洞大量暴露极大地降低安全性。

如果全部交给网卡去做,相信看到这里你也会觉得这不合适了。因为这相当于网卡出厂自带QQ,这显然不可能是吧。

所以实际上计算机工作过程中都是各个组件各司其职,软件负责处理最原始的信息同时给予用户反馈,操作系统负责适配硬件并向软件提供操作硬件的简单方法,底层硬件则履行的各自的工作。

就像我种地,你造锄头,他负责卖粮食,大家都有饭吃。