计算机网络:应用层
应用层协议原理
在具体的讨论所有概念之前,需要先大致知道各个部分的关系是怎么样的。
网络应用程序体系结构
应用程序研发者需要决定程序使用的体系结构,一般有以下两种:
客户-服务器体系结构(client-server architecture)
服务器接收来自用户的请求,发送所请求的对象。服务器具有固定的ip地址。
P2P体系结构
成对间歇连接的主机彼此直接通信。P2P的体系结构具有自拓展性,随着对等方数量增加,分发时间只会趋于一定值,而非线形增长。原因是对等方不仅是消费者还是重新分发者。
BitTorrent是一种流行的P2P协议,具有一些高效机制,比如一方可以给传输速度最快的对等方优先权。
进程通信
不同端系统上的进程通过交换报文来相互通信
客户和服务器进程
在一对进程,一个标识为客户,一个标识为服务器
进程与计算机网络的接口
进程通过套接字(socket)来向网络发送报文/接收报文
进程寻址
为了让报文可以送给指定主机的指定进程,需要IP地址 + 端口号(port number)
运输服务
可以从四个方面对应用程序服务要求分类:
- 可靠数据传输
- 吞吐量
- 定时
- 安全性
internet提供的运输服务
TCP
TCP为一种面向连接的服务,在交换报文之前,会有握手阶段,即客户与服务器交换信息,完成该阶段才会建立TCP连接。
TCP确保了数据都是无差错并按顺序的。其拥有拥塞控制机制,当网络阻塞时,会抑制发送进程。
UDP
无连接,无拥塞机制,直接注入数据。
web和http
http
http定义了web客户向服务器请求网页的方式。http使用TCP协议。客户和服务器都是通过socket与TCP连接,TCP为http提供可靠的数据传输服务。当用户试图请求一个网页,发生的过程如下:
- 客户通过TCP向客户端发送http请求
- 客户端从TCP接收请求并发送http响应
注意http为无状态协议,http服务器不会保存用户的任何信息。
同时,http既可以使用非持续连接,也可以使用持续连接。非持续连接,简单理解,即每个TCP连接在服务器发送了一个对象后关闭。持续连接,服务器在发送响应后,保持TCP连接打开。
http的请求报文格式:
1 |
|
比如:
1 |
|
请求行(Request Line)中定义了 HTTP 请求的关键参数。其中 Method 字段表示请求的方式,常用的请求方式为GET,POST。URL 字段用来定位资源,Version 字段用来说明当前使用的协议版本。头部行(Header Lines)中定义了可选的参数,用来辅助 HTTP 请求。数据域(Entity Body) 用来传输数据。
http的响应报文格式:
1 |
|
比如
1 |
|
字段说明:
状态行(Status Line)定义了响应报文的关键参数。其中 Version 用来说明当前使用的协议版本,Status Code 表示请求结果的状态码,phrase 为状态码的说明。
头部行(Header Lines)中定义了可选的参数,用来辅助 HTTP 响应。
数据域(Entity Body) 用来传输数据。
常见的状态码
- 200 OK:请求成功。
- 301 Moved Permanently:资源位置永久移动,新的url在响应报文的location中。
- 400 Bad Request:错误的请求,通用的差错代码。
- 404 Not Found:请求的资源不存在服务器中。
- 505 HTTP Version Not Supported:HTTP 协议版本不支持。
cookie
前面的http服务器都是无状态的。如果想将内容与用户联系起来,可以让http使用cookie。为了支持cookie,需要修改4个地方:
- http响应报文加入cookie首部行
- http请求报文加入cookie首部行
- 用户端系统保留一个文件
- 后端数据库保留信息
web缓存
可以配置浏览器指向web缓存器,其实就是cache。web缓存器即是客户也是服务器。通过设置web缓存器可以减少用户的响应时间。但是会有新的问题,就是,当网站更新,其缓存并不会更新,导致客户请求的是旧的。
条件GET方法,允许缓存器证实请求的对象是最新的。
电子邮件
SMTP
也是用户层的协议,与http在同一层。http主要是一个拉协议,而smtp主要是一个推协议。在发邮件时会使用到smtp,而在试图访问邮件时(相当于你查看你的邮箱),需要POP3/IMAP/HTTP。
DNS
基本概念
(Domain Name System)。dns提供了将主机名到IP地址的转换的服务。包含了由DNS服务器实现的分布式数据库,和应用层协议(运行在udp上,端口为53)。
我们重新来访问一个网站,过程中发生以下事件:
- 主机上运行着dns应用的客户端
- 浏览器从url提取主机名,传给dns客户端
- dns客户端向dns服务器发送请求
- dns客户端收到包含对应ip地址的回答报文
- 浏览器收到,向该ip地址发起连接
dns具体工作机理
对于应用程序,如果需要将主机名转换为ip地址,只需要调用函数,比如gethostbyname
,而dns的具体实现被抽象。下面来研究其机理。
dns的结构层次大概为以下:
- T0:根dns服务器:根服务器提供TLD服务器的ip地址
- T1:TLD服务器:对于每个顶级域(如com、org、edu)和国家的顶级域(cn、uk、jp),都有TLD服务器。其提供权威dns服务器的ip地址
- T2:权威dns服务器:所有公共可访问主机必须提供dns记录,权威dns服务器则收藏了这些dns记录。
- T3:本地dns服务器:起到代理的作用,当主机发出dns请求时,将该请求转发到前几层。
同样的,dns也具有缓存,使得大部分的dns查询可以绕过根服务器。
dns服务器上存储了资源记录(Resource Record),每个dns回答报文中有多条RR,RR可以按下面的方法表示:
(name, value, type, ttl)
- type为A,则name是主机名,value为对应ip
- type为NS,则name为域,value是知道 如何获取 该域的主机名的ip 的权威dns的主机名(有点绕)
- type为CNAME,则value是别名为name的主机对应的规范主机名
- type为MX,则value为别名为name的邮件服务器的规范主机名
CDN
为了向全世界用户分发巨量数据,大部分视频流公司都会用内容分发网(Content Distribution Network)。CDN管理多个服务器,在服务器存储视频和其他内容,将用户请求定向到较好的CDN的位置。
CDN操作
当我们向网站请求一个视频(每个视频都有一个url)时:
- 用户点击视频链接,发送对于视频网站的dns请求
- LDNS将该dns转到权威dns服务器,但该权威服务器不返回ip地址,而是返回一个cdn服务器的主机名
- 用户的LDNS发送第二个请求给cdn服务器,并得到指定的cdn服务器
- 用户得到该cdn节点的ip地址,建立连接,发送请求