基础知识-计算机网络-应用层
1 应用层协议原理
1.1 网络应用程序体系结构
-
客户机/服务器体系结构
服务器:提供服务,IP地址永久,可扩展为数据中心
客户机:请求服务,动态IP地址,彼此间不能直接通信
-
纯P2P体系结构
无打开的服务器,任意端系统可以直接通信,对等方间歇的连接,IP不固定
文件共享,可拓展性高但是管理复杂
-
客户机/服务器与P2P的混合体系结构
例如:即时讯息应用
服务器记录动态的用户地址
1.2 进程通信
不同主机中进程间的通信:通过网络交换报文进行
-
客户机和服务器进程
客户机进程:发起通信的进程
服务器进程:等待进程联系的进程
P2P结构也可以看成客户机和服务器
-
套接字(socket)
同一台主机内应用层与运输层之间的接口(API)
-
进程选址
识别网络上的目的主机,识别目的主机上的目标进程
进程识别信息:IP地址+端口号
常用的应用程序被指派固定的端口号
创建一个新的网络应用程序时,必须分配一个新的端口号。不重复。
-
用户代理
是用户与网路应用程序间的接口。(如浏览器,邮件阅读器)
1.3 应用层协议
定义了运行在不同端系统上的应用程序进程间的传递报文的格式和方式
具体包含
- 交换报文的类型:如请求报文和响应报文
- 各种报文类型的语法:报文中各个字段及描述
- 字段的语义:字段包含的信息的含义
- 进程何时、如何发送报文及对报文进行响应的规则
公共领域协议:标准文档RFC定义,如HTTP
专用层协议:如Skype使用的协议
应用层协议是网络应用的一部分
1.4应用程序所需要的服务(运输服务)
根据应用的实际情况,对不同的运输需求有差距
- 可靠的数据传输:有的应用需要,有的应用可以容忍数据丢失
- 带宽(数据传输速率):有带宽敏感应用和弹性应用
- 定时(数据传输的时间限制):交互式实时应用,非实时应用
- 安全性
1.5 因特网运输协议提供的服务
两个运输层协议:
-
TCP服务:
面向连接,可靠的传输服务,有拥塞控制(对整个网络有利)
不确保最小传输速率,不保证时延保证
-
UDP服务:
无连接,轻量级(不提供不必要的服务),
无拥塞控制机制,不可靠数据传输,不提供时延保证
适于实时应用
2 Web和Http
2.1 HTTP概况
是一个应用层协议,Web的核心,超文本传输协议
HTTP由两个程序实现:客户程序和服务程序运行在不同的端系统中,通过交换HTTP报文进行会话。
Web常用术语:
- 对象:是一个文件,通过URL地址来寻址
- HTML文件:也是一个对象
- URL:主机名+路径
- 浏览器
- Web服务器:用于存储Web对象
HTTP用的是TCP
工作过程:创建TCP连接→交换报文→关闭连接
HTTP是无状态协议:服务器不保存关于用户的任何信息
2.2 HTTP连接
-
非持续HTTP连接
每个TCP连接上只传送一个Web对象,只传送一个请求/响应对
-
持续的HTTP连接
一个TCP连接可以传送多个Web对象
工作过程:《p66》
可以并行或者串行连接
往返时延RTT:一个短分组从客户端到服务器到客户端的时间
非持续连接的缺点:服务器负担重,传输时间长(包含两个RTT)
持续连接两种方式:
非流水线:接收到响应后再发下一个请求
流水线:客户机一个接一个连续请求,服务器一个接一个连续发送响应对象
2.3 HTTP报文格式
2.3.1 请求报文
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, /
Referer: http://www.google.cn/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: www.google.cn
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
2.3.2 响应报文
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Connection: Keep-Alive
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
2.4用户与服务器的交互:Cookie
Http服务器是无状态的,不保存客户信息
Cookie:
- 允许Web站点跟踪识别用户。
- 可以把内容和用户身份关联。
- 允许站点对用户进行跟踪。
Cookie组件:
- Http响应报文带cookie首部行
- Http请求报文带cookie首部行
- 用户端保留一个cookie文件,由浏览器管理
- Web站点有后端数据库管理
缺陷:不利于用户隐私保护
2.5 Web缓存
起始服务器:对象最初存放并且始终保持器拷贝的服务器。
Web缓存器/代理服务器:
- 能够代表起始服务器来满足HTTP请求的网络实体。
- 保存最近请求过的对象的副本
- 可以在客户机工作,也可以在中间系统工作
优点:明显降低用户请求时延,成本明显
2.6 条件GET方法
允许缓存器证实它的对象是最新的
通过缓存器对起始服务器发送GET请求报文来实现
3 文件传输协议FTP
本地主机上的客户,向远程主机上传或者下载文件。
用户通过FTP用户代理与FTP服务器交互
FTP和HTTP比较:
- 都是文件传输协议,运行在TCP连接
- FTP用两个并行的TCP连接:控制连接,数据连接。客户机与服务器都有控制进程和数据传输进程。
- 控制信息,FTP带外传输,HTTP带内传输
- FTP是有状态连接,HTTP是无状态连接
控制连接:
客户机与服务器在21号端口建立
始终保持连接
数据连接:
服务器收到文件传输命令后在20号端口发起一个到客户机的连接。
传送一个文件后就关闭。
4 电子邮件
4.1 英特网电子邮件系统总体结构:
用户代理和邮件服务器组成,邮件服务器中包含输出报文队列和用户邮箱
邮件发送过程:
邮件先保存到发送方报文队列,再通过SMTP发送到接收方对应的邮件服务器
4.2 简单邮件传送协议SMTP
用的是TCP,在端口25号。
SMTP不使用任何中间服务器。
SMTP和HTTP比较:
- 都用于从一台主机向另一台主机传送文件
- SMTP是持续连接,HTTP不一定
- HTTP是拉协议,SMTP是推协议。
- SMTP使用7位ASCII码,HTTP数据没有该限制。
- HTTP把每个对象封装在各自得HTTP报文,SMTP把所有的对象封装在同一个报文。
4.3 邮件报文结构
4.4 邮件访问协议
用户代理用SMTP发报文到发送方邮件服务器,发送方邮件服务器再用SMTP发到接收方邮件服务器。(SMTP是推协议)
4.4.1 POP3
工作步骤:
5 DNS
主机名:便于记忆,路由器处理困难。
IP地址:由四个字节组成,有着严格的层次结构,难记忆但是路由器处理简单。
域名系统DSN提供进行主机名和IP地址的转换
- 一个分层的DNS服务器实现的分布式数据库
- 允许主机查询分布式数据库的应用层协议
说明:
- DNS运行在UDP上,一般使用53号端口(以便于降低时延)
- DNS通常直接由其他的应用层协议使用,用户只是间接使用
- 主机可有多个别名,也即DNS所做的主机名到IP地址的映射可以是多对一映射。
- 主机名也可以是对应一个IP地址组成的集合,一般在大型站点离多见。
分布式,层次数据库(有利于抗故障,以及高拓展性)
-
根DNS服务器:
全球几百个,由权威的机构负责运营。
提供顶级DNS服务器的IP地址。
-
顶级DNS服务器:
如com DNS服务器,org DNS服务器,以及国家DNS服务器等等。
提供权威DNS服务器的IP地址。
-
权威DNS服务器
由一些组织机构运营
提供具体主机的IP地址。
本地DNS服务器:位于本地局域网中,对于架构非常重要。
请求主机查询本地DNS服务器,本地DNS服务器依次查询根DNS,顶级DNS,权威DNS服务器。
6 P2P文件共享
位于网络边缘的端系统互相之间可以直接获取对象,最流行的P2P文件分发协议:BitTorrent。
过程:
- 运行一个P2P文件共享应用程序,收搜索一个文件。
- 选择一个对等方发送文件请求
- 两个用户直接建立TCP连接
- 传输文件
特点:
- 直接在对等方传输
- 可扩展性特别强
- 使用客户机/服务器模式
7 TCP套接字编程
运行在不同机器的进程彼此通过套接字传递报文来进行通信,TCP连接一边与客户端的套接字相联系,一边与服务器的套接字相联系。
客户端代码:
from socket import *
serverName = 'serverName'
serverPort = 12000
# 创建了客户套接字,第一个参数是选择的底层网络,第二个参数表示套接字类型
clientSocket = socket(AF_INET, SOCK_STREAM)
# 与服务器实现TCP连接,这条代码执行的时候,即执行了三次握手
clientSocket.connect((serverName,serverPort))
# 获取用户输入的句子,直到回车结束
sentence = raw_input('Input lowercase sentence:')
# 发送句子,这里无需显式的创建分组
clientSocket.send(sentence.encode())
# 字符到达服务器后,被存放在字符串中
modifiedSentence = clientSocket.recv(1024)
# 打印
print('From Server: ', modifiedSentence.decode())
# 关闭了套接字,就相当于关闭了连接
clientSocket.close()
服务端代码
from socket import *
serverPort = 12000
# 创建一个套接字
serverSocket = socket(AF_INET,SOCK_STREAM)
# 将端口号和套接字关联起来
serverSocket.bind(('', serverPort))
# 让服务器聆听来自客户的TCP请求,定义了最大连接数
serverSocket,listen(1)
print('The server is ready to receive')
while True:
# 用户敲门后,创建新的套接字专门供其使用
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024).decode()
capitalizeSentence = sentence.upper()
connectionSocket.send(capitalizeSentence.encode())
connectionSocket.close()
8 UDP套接字编程
服务器实现
from socket import *
# 创建udp套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
# 绑定地址
server_addr = ('0.0.0.0',8888)
sockfd.bind(server_addr)
# 收发消息
while True:
data,addr = sockfd.recvfrom(1024)
print("From %s Msg:%s"%(addr,data.decode()))
sockfd.sendto(b'Thanks',addr)
# 关闭套接字
sockfd.close()
客户端实现
from socket import *
# 服务端地址
ADDR = ('127.0.0.1',8888)
# 创建udp套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
# 循环发送消息
while True:
data = input("Msg>>")
if not data:
break
# 向服务器发送
sockfd.sendto(data.encode(),ADDR)
msg,addr = sockfd.recvfrom(1024)
print("From Server:",msg.decode())
sockfd.close()