计算机网络与通信笔记(二)
二、应用层
2.1 应用层协议原理
2.1.1 进程通信
客户与服务器进程
网络应用程序运行后,就变成了网络应用进程
两个在不同端系统的进程,通过跨越计算机网络交换报文而相互通信
网络应用程序由成对进程组成,在一对进程的通信会话场景中,发起通信的进程称为客户,等待联系的进程称为服务器
进程与计算机网络的接口
- 进程通过一个称为套接字$(Socket)$的软件接口向网络发送报文和从网络接收报文
- 套接字是同一台主机内应用层与运输层的接口,也成为应用程序和网络之间的应用程序编程窗口
进程寻址
- 为了与目的主机上进程的通信,需要定义目的主机的地址和目的主机中指定接收进程的标识符
- 目的主机地址由$32$位的$IP$地址标识
- 目的进程地址由$16$位目的地端口号$Port\enspace Number$标识,如$Web$服务器的端口号为$80$,$SMTP$的端口号为$25$
- 套接字长度为$48$位
2.1.2 运输服务简介
$TCP$服务
- 面向连接:在报文流动前,$TCP$让客户和服务器互相交换运输层控制信息以为分组运输做好准备(握手),此时,一个$TCP$连接在两个进程的套接字直接建立
- 可靠性:无差错、无字节丢失与冗余、顺序地传输分组
- 拥塞控制机制:当网络拥塞时,抑制发送进程
- 不提供加密机制
$UDP$服务
- 没有握手过程
- 不可靠数据传送服务
- 没有拥塞控制机制
- 不提供加密机制
$SSL$安全套接字层
- 提供加密的$TCP$连接
- 提供数据完整性和端点鉴别
应用层协议与支撑的运输层协议
应用 | 应用层协议 | 支撑的运输层协议 |
---|---|---|
电子邮件 | $SMTP$ | $TCP$ |
远程终端访问 | $Telnet$ | $TCP$ |
$Web$、流式多媒体 | $HTTP$ | $TCP$ |
文件传输 | $FTP$ | $TCP$ |
因特网电话 | $SIP$、$RTP$ | $UDP$或$TCP$ |
2.2 $Web$和$HTTP$
2.2.1 $HTTP$概述
相关概念
$HTTP$全称为超文本传输协议$(HyperText\enspace Transfer\enspace Protocol)$
$Web$页面由对象组成,如$HTML$文件,$JPEG$图像
通过$URL$地址引用对象,$URL$地址由存放对象的服务器地址和对象的路径组成
如对于$URL$地址http://cloudchewie.com/index.html:
$cloudchewie.com$为主机名,$/index.html$为对象路径
$Web\enspace Browser$实现了$HTTP$的客户端,$Web\enspace Server$实现了$HTTP$的服务端,用于存储$Web$对象,每个对象由$URL$路径访问,因此$Web$是典型的$C/S$模式
$HTTP$负责定义客户向服务器请求$Web$页面的方式以及服务器向客户返回$Web$页面的方式,其传递的报文称为$HTTP$报文
客户向其套接字接口发送$HTTP$请求报文并从其套接字接口接收$HTTP$响应报文;当客户发送报文后,该报文即脱离客户控制而进入$TCP$控制,从而使得应用层协议$HTTP$无需关心报文丢失和运输层的实现细节
$HTTP$服务器不保存关于客户的任何信息,是一个无状态协议
非持续连接
每个$TCP$连接只传输一个请求报文和一个响应报文
当客户接收$HTTP$响应报文后,$TCP$连接关闭
如果需要继续发送请求,需要建立全新的$TCP$连接
可以使用并行的连接改善缩短响应时间
$TCP$服务是建立在连接之上的,每次建立连接前,都需要进行三次握手过程,如下图所示:
- 客户端向服务器发送一个小的$TCP$报文段
- 服务器用一个小的$TCP$报文段进行确认和响应
- 客户向服务器返回确认并发送$HTTP$请求报文
- 在这之后,服务器开始发送文件到客户
其中,环节$1-2$占用了一个往返时间$RTT$,环节$3-4$占用了一个往返时间$RTT$并且耗费了传输文件的时间
因此,在非持续连接的HTTP下,每传送一个对象,就需要经受两个RTT的交付时延
持续连接
- 服务器发送$HTTP$响应报文后保持$TCP$连接,使得客户的后续请求继续使用该连接进行传送
- 当该连接经过一定时间间隔(可配置的超时间隔)仍未使用,其服务器就将关闭该连接
2.2.2 $HTTP$报文
$HTTP$请求报文(在线交互程序)
1
2
3
4
5
6
7
8
9
10
11#典型的HTTP请求报文
GET /index.html HTTP/1.1\r\n
Host: www-net.cs.umass.edu\r\n
User-Agent: Mozilla/5.0\r\n
Accept: text/html,application/xhtml+xml\r\n
Accept-Language: en-us,en;q=0.5\r\n
Accept-Encoding: gzip,deflate\r\n
Accept-Charset: ISO-8859-1,utf-8;q=0.7\r\n
Keep-Alive: 115\r\n
Connection: keep-alive\r\n
\r\n- 请求报文的第一行称为请求行,包括方法字段、$URL$字段、$HTTP$版本字段
方法字段 | 主要作用 |
---|---|
$GET$ | 向服务器请求指定$URL$的对象 |
$POST$ | 用于向服务器提交表单数据也可以同时请求一个$Web$页面 |
$DELETE$ | 返回响应报文,不包含请求的对象 |
$PUT$ | 上传的文件放在实体主体字段中,目标路径由$URL$字段标明 |
$HEAD$ | 删除$URL$字段中指定的文件 |
其余行称为首部行
- $Host$指明了对象所在的主机
- $Connection$指明非持续连接$(Close)$和持续连接$(keep-alive)$
- $Keep-Alive$指明持续连接的超时间隔
- $User-agent$指明用户浏览器类型,有助于服务器根据不同的用户代理发送相同对象的不同版本
- $Accept-*$指用户想要得到特定语言、编码格式、字符集的该对象
结尾单独一行回车、换行表示报文首部结束
实体体,在首部行之后的请求体
- 当发送$GET$请求时,实体体为空;
- 当用户填写表单并发送$POST$请求时,实体体即为用户填写的表单;
- 当用户填写表单时,也可以使用$GET$方法,如
/learning/search?key=banana&lang=zh
$HTTP$请求报文的通用格式
$HTTP$响应报文(在线交互程序)
1
2
3
4
5
6
7
8
9
10
11
12
13#典型的HTTP响应报文
200 OK\r\n
Date: Sun, 26 Sep 2010 20:09:20 GMT\r\n
Server: Apache/2.0.52 (CentOS)\r\n
Last-Modified: Tue, 30 Oct 2007 17:00:02 GMT\r\n
ETag: "17dc6-a5c-bf716880"\r\n
Accept-Ranges: bytes\r\n
Content-Length: 2652\r\n
Keep-Alive: timeout=10, max=100\r\n
Connection: Keep-Alive\r\n
Content-Type: text/html; charset=ISO-8859-1\r\n
\r\n
data data data data data ...- 响应报文的第一行称为初始状态行,包括协议版本字段、状态码、状态信息
状态码 | 状态信息 | 说明 |
---|---|---|
$200$ | $OK$ | 请求成功 |
$301$ | $Moved\enspace Permanently$ | 请求的对象被永久转移,新的$URL$定义在$Location$首部行 |
$400$ | $Bad\enspace Request$ | 通用差错代码,请求不能被服务器理解 |
$404$ | $Not\enspace Found$ | 被请求的对象不在服务器 |
$500$ | $HTTP\enspace Version\enspace Not\enspace Supported$ | 服务器不支持请求报文中的$HTTP$协议版本 |
其余行称为首部行
- $Date$指示服务器发送响应报文的日期时间
- $Server$指示服务器类型,类似于请求报文中的$User-agent$
- $Last\enspace Modified$指示对象创建或最后修改的日期时间
- $Content-Length$指示被发送对象的字节数
- $Content-Type$指示实体体中对象为$HTML$文本
实体体包含被请求的对象
$HTTP$响应报文的通用格式
2.2.3 $Cookie$
- $Cookie$的意义
- 限制用户的访问
- 将内容与用户身份相关联
- 在无状态的$HTTP$上建立用户会话层
- $Cookie$的组成
- $HTTP$响应报文中的$Cookie$首部行
- $HTTP$请求报文中的$Cookie$首部行
- 端系统中保留$Cookie$文件
- $Web$服务器的$Cookie$数据库
- $Cookie$的使用
- 客户向服务器发送普通请求报文
- 服务器为客户创建$ID$如
U202073245
并放置在响应报文的首部行 - 客户存储$Cookie$
- 客户将$Cookie$放置在请求报文的首部行
- 服务器根据$Cookie$采取指定动作,并返回普通响应报文
2.3 电子邮件
2.3.1 电子邮件系统的构成
- 用户代理
- 用户可以撰写编辑邮件、查看邮件
- 如网易邮箱大师、$FoxMail$
- 邮件服务器
- 存储用户邮件的服务器
- 在报文队列中维护需要发送的邮件报文
- 简单邮件传输协议$SMTP$
- 将邮件从发送方的客户端发送到发送方的邮件服务器
- 将邮件从发送方的邮件服务器发送到接收方的邮件服务器
2.3.2 $SMTP$协议
基本介绍(在线交互程序)
- 使用$TCP$运输协议进行可靠的邮件传送,端口号为$25$
- 不使用中间邮件服务器发送邮件,而是直接在发送方服务器和接收方服务器间进行传输
- 使用持续连接
- 要求报文(首部和信体)全部使用$ 7-bit\enspace ASCII$码
- $SMTP$服务器用$CRLF.CRLF $表示邮件报文的结束
报文格式
1
2
3From: alice@qq.com
To: Bob@google.com
Subject: Searching for the meaning of life.与$HTTP$协议的对比
$HTTP$ | $SMTP$ | |
---|---|---|
协议类型 | 拉协议 | 推协议 |
报文编码格式 | 不限制 | $ 7-bit\enspace ASCII$ |
多对象 | 每个对象分装在各自的响应报文中 | 多个对象在多分部的报文中 |
使用$telnet$指令访问$QQ$邮箱
1
2
3
4
5
6
7
8
9
10
11
12telnet smtp.qq.com 25
auth login
base64-mail
base64-authentication-code
helo qq.com
mail from:<xxx@xx.xx>
rcpt to:<xxx@xx.xx>
data
Hello World!
Hello World!
.
quit
2.3.3 $POP3$协议
运行在端口$110$的邮件访问协议
运行方式
特许阶段:用户代理发送用户名和口令以鉴别用户
主要命令:user
和pass 服务器的响应回答有$+OK$、$-ERR$
事务处理阶段:用户代理取回报文,同时可以对报文做删除标记的更改,获取邮件统计信息
$list$——列出报文号码
$retr$——用报文号码取回报文
$dele$——用报文号码删除邮件
更新阶段
$quit$——结束$POP3$会话,服务器删除被标记为删除的邮件
使用$telnet$指令访问$QQ$邮箱
1
2
3
4
5
6
7telnet pop.qq.com 110
user QQ-ID
pass authentication-code
list
retr 1
dele 1
quit
2.3.4 $IMAP$协议
允许用户在服务器上组织自己的邮件目录
维护$IMAP$会话的用户信息:目录名以及报文$ID$与目录名之间的映射关系
使用$telnet$指令访问$QQ$邮箱
1
2
3
4
5
6
7telnet imap.qq.com 143
a01 login QQ-ID authentication-code
a02 list "" *
a03 select inbox
a04 create folder
a05 delete folder
a06 rename oldfolder new folder
2.4 $DNS$
2.4.1 $DNS$服务
- $DNS$简况(在线交互程序)
- $DNS$能够将主机名解析为主机的$IP$地址
- $DNS$是一个分布式数据库,由很多$DNS$服务器按照层次结构组织
- $DNS$运行在端到端系统上,且使用$UDP$协议($53$号端口)进行报文传输
- $DNS$解析过程
- 用户请求$URL$
http://cloudchewie.com/index.html
- 浏览器抽取出主机名
cloudchewie.com
并发送给$DNS$客户端 - $DNS$客户端向$DNS$服务器发送查询请求报文
- $DNS$服务器返回包含主机名对应$IP$地址的响应报文
- $DNS$客户端将$IP$地址传送给浏览器
- 浏览器向$IP$地址所在$Web$服务器发起$TCP$连接
- 用户请求$URL$
- 其他服务
- 主机别名:获取主机别名对应的主机规范名
- 邮件服务器别名:获取邮件服务器主机别名对应的主机规范名
- 负载分配:将一个$IP$地址集合与同一个规范主机名相联系
2.4.2 $DNS$工作机理
采用单台$DNS$服务器
- 单点故障:一旦崩溃,因特网瘫痪
- 通信容量:该台服务器不得不处理所有$HTTP$请求报文和电子邮件报文
- 时延严重:集中式数据库将造成严重的拥塞与时延
- 难以维护:不得不持续更新以适应数据更改
采用分布式层次化数据库
- 根服务器提供$TLD$服务器的$IP$地址
- $TLD$服务器提供权威服务器的$IP$地址,负责所有顶级域名和所有国家顶级域
- 权威服务器提供域名到$IP$地址的映射服务
- 本地$DNS$服务器(默认$DNS$服务器)
- 当一台主机需要做一个域名查询的时候,查询请求首先被发送到本地域名服务器
递归查询与迭代查询(在线交互程序)
$DNS$缓存(在线交互程序)
- 一旦 (任何) 域名服务器得知了某个映射, 就将其缓存
- 在一定的时间间隔后缓存的条目将会过期(自动消除)
- $TLD$服务器的地址通常被缓存在本地$DNS$服务器中,以减少根服务器负载
2.4.3 $DNS$记录
格式为四元组$(Name,Value,Type,TTL)$,其中$TTL$表示记录的生存时间
$Type$ | $Name$ | $Value$ |
---|---|---|
$A$ | 主机名 | $IP$地址 |
$CNAME$ | 主机别名 | 规范主机名 |
$NS$ | 域 | 该域权威域名服务器的主机名 |
$MX$ | 邮件服务器的主机别名 | 邮件服务器的规范主机名 |
1 | #使用nslookup进行DNS解析 |