计算机网络:应用层

应用层协议原理

在具体的讨论所有概念之前,需要先大致知道各个部分的关系是怎么样的。

网络应用程序体系结构

应用程序研发者需要决定程序使用的体系结构,一般有以下两种:

客户-服务器体系结构(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
2
3
4
5
6
request line | method url version
header line | header_field_name value
header_field_name value
...
entity body | ...

比如:

1
2
3
4
5
6
GET /somedir/page.html HTTP/1.1
HOST: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: en
(data data ...)

请求行(Request Line)中定义了 HTTP 请求的关键参数。其中 Method 字段表示请求的方式,常用的请求方式为GET,POST。URL 字段用来定位资源,Version 字段用来说明当前使用的协议版本。头部行(Header Lines)中定义了可选的参数,用来辅助 HTTP 请求。数据域(Entity Body) 用来传输数据。

http的响应报文格式:

1
2
3
4
5
status line | version status_code phrase
header line | header_field_name value
header_field_name value
...
entity body | ...

比如

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Connection: close
Date: Wed, 12 Aug 2019 12:00:01 GMT
Server: Apache/2.2.3
Last-Modified: Wed, 12 Aug 2019 9:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data ...)

字段说明:

状态行(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 协议版本不支持。

前面的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地址,建立连接,发送请求

计算机网络:应用层
https://pactheman123.github.io/2024/09/12/应用层/
作者
Xiaopac
发布于
2024年9月12日
许可协议