应用层
作用阐释
不同的网络应用的应用进程之间,还需要有不同的通信规则,因此在运输层协议之上,还需要有应用层协议 (application layer protocol)。
应用层协议定义了网络通信规则,对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如支持 Web 应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。
HTTP
HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 协议进行加载的。
HTTP 使用客户端-服务器模型,客户端向服务器发送 HTTP Request(请求),服务器响应请求并返回 HTTP Response(响应),整个过程如下图所示:
HTTP 协议基于 TCP 协议,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 报文握手。目前使用的 HTTP 协议大部分都是 1.1 版本。在 1.1 的协议里面,默认是开启了 Keep-Alive
的,这样的话建立的连接就可以在多次请求中被复用了。
另外, HTTP 协议是“无状态”的协议,它无法记录客户端用户的状态,一般我们都是通过 Cookie/Session 来记录客户端用户的状态。
附:万维网
万维网 WWW(World Wide Web) 并非某种特殊的计算机网络,而是一个大规模的、联机式的信息储藏所,英文简称为 Web。万维网用链接的方法能非常方便地从互联网上的一个站点访问另一个站点(也就是所谓的“链接到另一个站点”),从而主动地按需获取丰富的信息。
每一个万维网站点都存放了许多文档,在这些文档中有一些地方的文字是用特殊方式显式的(例如用不同的颜色,或添加了下划线),而当我们将鼠标移动到这些地方时,鼠标的箭头就变成了一只手的形状,这就表明这些地方有一个链接 (link),这种链接有时也被称为超链 (hyperlink),当我们在这些地方点击鼠标,就可以从这个文档链接到可能相隔很远的另一个文档。
正是由于万维网的出现,使互联网从仅由少数计算机专家使用变为普通百姓也能利用的信息资源。万维网的出现使网站数按指数规律增长,因此,万维网的出现是互联网发展中的一个非常重要的里程碑。
万维网是一个分布式的超媒体 (hypermedia) 系统,它是超文本 (hypertext) 系统的扩充,所谓超文本是指包含指向其他文档的链接的文本 (text)。超文本是万维网的基础。超媒体与超文本的区别是文档内容不同,超文本文档仅包含文本信息,而超媒体文档还包含其他表示方式的信息,如图形、图像、声音、动画、视频图像等。
万维网把大量信息分布在整个互联网上,每台主机上的文档都独立进行管理,对这些文档的增加、修改、删除或重新命名都不需要(实际上也不可能)通知到互联网上成千上万的节点。
万维网以客户服务器方式工作。浏览器就是在用户主机上的万维网客户程序,万维网文档所驻留的主机则运行服务器程序,因此这台主机也称为万维网服务器。在一个客户程序主窗口上显示出的万维网文档称为页面 (page)。
Websocket
WebSocket 是一种基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。
WebSocket 协议在 2008 年诞生,2011 年成为国际标准,几乎所有主流较新版本的浏览器都支持该协议。此外,WebSocket 不仅能在基于浏览器的应用程序中使用,很多编程语言、框架和服务器都提供了 WebSocket 支持。
WebSocket 协议本质上是应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket 协议的常见应用场景有:
- 视频弹幕
- 实时消息推送,详见 Web 实时消息推送详解 这篇文章
- 实时游戏对战
- 多用户协同编辑
- 社交聊天
WebSocket 的工作过程可以分为以下几个步骤:
- 客户端向服务器发送一个 HTTP 请求,请求头中包含
Upgrade: websocket
和Sec-WebSocket-Key
等字段,表示要求升级协议为 WebSocket; - 服务器收到这个请求后,会进行升级协议的操作,如果支持 WebSocket,它将回复一个 HTTP 101 状态码,响应头中包含
Connection: Upgrade
和Sec-WebSocket-Accept: xxx
等字段,表示成功升级到 WebSocket 协议。 - 客户端和服务器之间建立了一个 WebSocket 连接,可以进行双向的数据传输。数据以帧的形式进行传送,WebSocket 的每条消息可能会被切分成多个数据帧(最小单位)。发送端会将消息切割成多个帧发送给接收端,接收端接收消息帧,并将关联的帧重新组装成完整的消息。
- 客户端或服务器可以主动发送一个关闭帧,表示要断开连接。另一方收到后,也会回复一个关闭帧,然后双方关闭 TCP 连接。
另外,建立 WebSocket 连接之后,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性。
SMTP
SMTP(简单邮件传输协议,Simple Mail Transfer Protocol) 基于 TCP 协议,是一种用于发送电子邮件的协议。
注意,接受邮件的协议不是 SMTP。
下面主要关注 SMTP 协议的两个问题:
- 电子邮件的发送过程?
- 如何判断邮箱是真正存在的?
电子邮件的发送过程
TCP/IP 体系的电子邮件系统规定电子邮件地址 (e-mail address) 的格式为: $$ 用户名@邮件服务器的域名 $$
比如我的邮箱是 zhangsan@163.com ,我要向 xiaoma@qq.com 发送邮件,整个过程可以简单分为下面几步:
- 通过 SMTP 协议,我将我写好的邮件交给 163 邮箱服务器(邮局)。
- 163 邮箱服务器发现我发送的邮箱是 qq 邮箱,然后它使用 SMTP 协议将我的邮件转发到 qq 邮箱服务器。
- qq 邮箱服务器接收邮件之后就通知邮箱为 xiaoma@qq.com 的用户来收邮件,然后用户就通过 POP3/IMAP 协议将邮件取出。
如何判断邮箱真实在存在
很多场景(比如邮件营销)需要判断我们要发送到的邮箱地址是否真的存在,这个时候我们可以利用 SMTP 协议来检测:
- 查找邮箱域名对应的 SMTP 服务器地址;
- 尝试与服务器建立连接;
- 连接成功后尝试向需要验证的邮箱发送邮件;
- 根据返回结果判定邮箱地址的真实性。
推荐几个在线邮箱是否有效检测工具:
POP3/IMAP
POP3 和 IMAP 两者是基于 TCP 的负责邮件接收的协议。也就是说,它们和 SMTP 协议是搭配使用的,SMTP 负责发送,POP3/IMAP 负责发送。
IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。
- IMAP 支持邮件搜索、标记、分类、归档等高级功能;
- 而且可以在多个设备之间同步邮件状态;
- 几乎所有现代电子邮件客户端和服务器都支持 IMAP。
Telnet
Telnet 是一种远程登陆协议,基于 TCP,用于通过一个终端登陆到其他服务器。
Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet,而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
SSH
SSH(Secure Shell)是一种安全的网络传输协议,基于 TCP,其通过加密和认证机制实现安全的访问、文件传输等业务。
SSH 的经典用途是登录到远程电脑中执行命令。除此之外,SSH 也支持隧道协议、端口映射和 X11 连接。借助 SFTP 或 SCP 协议,SSH 还可以传输文件。
SSH 使用客户端-服务器模型,默认端口是 22。SSH 是一个守护进程,负责实时监听客户端请求,并进行处理。大多数现代操作系统都提供了 SSH。
FTP
FTP 协议基于 TCP 协议,是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。
FTP 是基于客户-服务器(C/S)模型而设计的,其最大的特点以及独特的优势在于,它在客户端与 FTP 服务器之间使用了两条 TCP 连接:
- 控制连接:用于传送控制信息(命令和响应);
- 数据连接:用于数据传送。
其它客户-服务器应用程序一般只有一条 TCP 连接,这种将命令和数据分开传送的思想大大提高了 FTP 的效率。
但是注意,FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密,因此 FTP 传输的文件可能会被窃听或篡改。建议在传输敏感数据时使用更安全的协议,如 SFTP(一种基于 SSH 协议的安全文件传输协议,用于在网络上安全地传输文件)。
RTP
RTP(Real-time Transport Protocol)是实时传输协议,通常基于 UDP,但也支持 TCP。它提供了端到端的实时传输数据的功能,但不包含资源预留存,不保证实时传输质量,这些功能由 WebRTC 实现。
RTP 协议分为两种子协议:
- RTP(Real-time Transport Protocol,实时传输协议):传输具有实时特性的数据。
- RTCP(RTP Control Protocol,RTP 控制协议):提供实时传输过程中的统计信息(如网络延迟、丢包率等),WebRTC 正是根据这些信息处理丢包。
DNS
DNS(Domain Name System)是域名管理系统,基于 UDP 协议,端口为 53,用于解决域名和 IP 地址的映射问题。
DNS 被设计为一个联机分布式数据库系统,并采用客户服务器方式。DNS 使大多数名字都在本地进行解析,仅少量解析需要在互联网上通信,因此 DNS 系统的效率很高。
任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名 (domain name)。域名只是一个逻辑概念,并非计算机所在的物理地址。从语法上讲,每一个域名都由标号 (label) 序列组成,各标号之间用点隔开,如下图。DNS 还有这些规定:
- 域名中的标号都由英文字母和数字组成,每一个标号不超过 63 个字符(为了方便记忆,最好不超过 12 个字符),也不区分大小写字母;
- 标号中除连字符
-
外不能使用其他的标点符号; - 级别最低的域名写在最左边,级别最高的顶级域名写在最右边;
- 由多个标号组成的完整域名总共不超过 255 个字符。
在实际使用中,有一种情况下,浏览器是可以不必动用 DNS 就可以获知域名和 IP 地址的映射的。浏览器在本地会维护一个hosts
列表,其中缓存了域名和 IP 地址的映射,一般来说浏览器会先查看要访问的域名是否在hosts
列表中,如果在的话就会直接提取对应的 IP 地址。如果本地hosts
列表内没有对应记录的话,就需要用到 DNS 了。
顶级域名
通常而言,顶级域名 TLD(Top Level Domain) 共分三大类:
国家顶级域名 nTLD,到 2012 年 5 月,共有 296 个
- cn 中国
- us 美国
- uk 英国
通用顶级域名 gTLD,到 2006 年 12 月,共有 20 个,其中最先确定的为 7 个
域名 解释 com 公司企业 net 网络服务机构 org 非营利性组织 int 国际组织 edu 美国专用的教育机构 gov 美国的政府部门 mil 美国的军事部门 基础结构域名 (infrastructure domain),只有一个,即 arpa,用于反向域名解析,故又称为反向域名。
二级域名
在国家顶级域名下注册的二级域名均由该国家自行确定,我国把二级域名划分为“类别域名”和“行政区域名”两大类:
类别域名——共 7 个
域名 解释 ac 科研机构 com 工、商、金融等企业 edu 中国的教育机构 gov 中国的政府机构 mil 中国的国防机构 net 提供互联网络服务的机构 org 非营利性的组织 行政区域名——共 34 个,适用于我国各省、自治区、直辖市,如 bj(北京市),js(江苏省)等。
继续划分子域名
一旦某个单位拥有了一个域名,它就可以自已决定是否要进一步划分其下属的子域,不必由其上级机构批准。域名树的树叶就是单台计算机的名字,它不能再继续往下划分子域了。