小菜在一家互联网公司工作,负责后台开发。他们公司有一个 APP ,运营需要分析用户操作体验。为此,研发团队准备在 APP 中埋点,以便上报数据。而小菜需要提供一个后端服务,用来接收 APP 上报的数据。
小菜开发好数据接收服务后,申请了一个域名,让 APP 团队通过域名提交数据。这样一来,小菜以后可以灵活地调整后端服务,随意扩容、缩容,甚至是迁移,完全不用 APP 团队配合。
小菜在一家互联网公司工作,负责后台开发。他们公司有一个 APP ,运营需要分析用户操作体验。为此,研发团队准备在 APP 中埋点,以便上报数据。而小菜需要提供一个后端服务,用来接收 APP 上报的数据。
小菜开发好数据接收服务后,申请了一个域名,让 APP 团队通过域名提交数据。这样一来,小菜以后可以灵活地调整后端服务,随意扩容、缩容,甚至是迁移,完全不用 APP 团队配合。
本节我们通过一个玩具 TCP 服务应用,来观察 TCP 协议的通信过程,进而体会它的关键知识点:
实验应用是一个最简化的玩具应用,由服务端和客户端组成:
由于域名比 IP 地址更便于记忆,我们通常使用它来访问网络服务。网络应用客户端想要跟服务端通信,必须先向 DNS 服务器查询域名对应的 IP 地址。
举个例子,读者访问我的网站 fasionchan.com
时,浏览器需要先根据域名查询网站的 IP 地址,再和网站的 Web 服务器进行通信。
那么,如何通过编程实现域名查询呢?这是开发网络应用无法回避的问题。
我们知道,DNS 服务器和客户端之间使用 DNS 协议进行通信:客户端先向服务器发送 请求报文 ,服务器将查询结果封装成 应答报文 ,回复客户端。DNS 可以使用 UDP 或 TCP 作为传输层协议,通信端口号为 53 。
开发网络程序离不开套接字编程,基于 TCP 通信的程序也不例外。我们知道 TCP 应用可以分为 客户端( client )和 服务器( server )两种角色,本节先介绍如何编写 TCP 客户端程序。
跟 UDP 一样,想要发起 TCP 通信,必须通过操作系统提供的 套接字( socket )。
我们知道 TCP 是一个相对复杂的传输层协议,涉及的通信细节非常繁琐:
如果这些都要每个应用程序单独实现,想想就头大!因此,出于程序复用性考虑,操作系统内核实现了网络协议栈,并将编程接口以套接字形式提供给应用程序。
本章,我们系统地学习了域名系统,初步掌握了 DNS 协议和 DNS 服务器工作原理。本节,我们再接再厉,继续研究一个跟 DNS 相关的网络安全问题:DNS劫持 。
根据 DNS 服务器的工作原理,我们知道主机一般依靠本地 DNS 缓存服务器来查询域名。运营商提供互联网接入服务,宽带成功拨号后,它将本区域内的 DNS 缓存服务器提供给客户端。
上一小节,我们学习了如何编写 TCP 客户端程序,掌握了 socket 、connect 、send 、recv 和 close 等系统调用的用法。本节我们再接再厉,学习 bind 和 accept 系统调用,开发一个 TCP 服务器。
编写 TCP 服务器同样离不开套接字——服务器需要先创建一个套接字,并监听服务端口:
监听套接字保存着服务器要监听的地址和端口信息,等待处理客户端的连接请求。当客户端执行三次握手建立连接,SYNC 分组根据目的地址和端口即可找到对应的监听套接字。
今早有用户反馈一个问题:系统发送的公告邮件,在企微客户端打开标题有乱码。我们查了一下各个客户端,邮件系统 Web 端打开是正常的,PC 客户端也是正常的,企微的 PC 客户端也是正常的。因此,问题被归结为客户端兼容性问题,按惯例大概是不了了之。
虽然企微平时问题不少,但作为工作IM,重度使用。按照企微以前的尿性,问题修复很慢很慢的。因此,就算问题不是出在自己系统上,还是想看看到底为什么,能否绕过去。
Nginx 是目前最流行的 Web 服务器软件,没有之一。它不仅配置灵活,性能也不错,能够轻松支撑高并发访问。本节简单介绍一下如何在 Linux 服务器上安装、配置 Nginx 服务器。
不同 Linux 发行版,程序包安装工具略有不同。在 Ubuntu 下,可以执行 apt 命名进行安装:
|
|
Nginx 安装好后,可能还没启动。我们可以执行 service 命令查看运行状态:
|
|
QUIC ,即 快速UDP网络连接 ( Quick UDP Internet Connections ), 是由 Google 提出的实验性网络传输协议 ,位于 OSI 模型传输层。 QUIC 旨在解决 TCP 协议的缺陷,并最终替代 TCP 协议, 以减少数据传输,降低连接建立延迟时间,加快网页传输速度。
QUIC 主要特点有: