目录
1、Application
2、Web and HTTP
3、File and FTP
4、Email and SMTP
5、DNS
正文
1、Application
(1)网络应用的常见架构
网络应用一般采用两种架构模式,一种是 CS (Client/Server) 架构,一种是 P2P (Peer-To-Peer) 架构
对于 CS 架构 而言,网络中的每个节点是不对称的,具体而言可以分为服务端和客户端两类
简单来说,服务端拥有资源,可以为客户端提供服务,而客户端需要资源,需要向服务端申请服务
对于 P2P 架构 而言,网络中的每个节点都是对称的,也可以说每个节点都是服务端和客户端
因为每个节点都拥有资源,每个节点都可以提供服务,同时每个节点也都需要资源,每个节点也都需要申请服务
(2)网络应用的通信方式
不同应用之间的通信,其实就是不同进程之间的通信,如果两个进程在同一主机上,则通信过程由操作系统定义
假如两个进程不在同一主机上,则它们之间的通信需要通过网络,这时通信过程由一系列层次化的网络协议定义
而站在 应用层 这一层次上,我们只需要定义好消息的内容,以及指定好把消息发给谁(目标进程)即可
一个进程可以通过套接字将消息交给底层,然后通过底层提供的服务,另一个进程可以通过套接字从底层得到消息
至于底层是如何把消息 (message) 从一个套接字传到另一个套接字,不是应用层需要关心的内容
(3)如何定位进程
一个运行在网络上的进程怎么定位呢?我们可以通过 IP 地址定位网络中的主机,然后通过端口定位主机上的进程
一些常见的应用层协议会带有 默认的 端口号:
协议 | 端口 | 用途 |
HTTP | 80 | 网页传输 |
FTP | 21 | 文件传输 |
SMTP | 25 | 邮件发送 |
POP3 | 110 | 邮件接收 |
IMAP | 143 | 邮件接收 |
Telnet | 23 | 远程登陆 |
2、Web and HTTP
(1)通信过程
对于网页 (Web) 应用,通常使用 HTTP (Hypertext Transfer Protocol) 控制通信规则,其依赖于 TCP 提供的服务
根据标准的不同,HTTP 协议可以分为 HTTP/1.0 和 HTTP/1.1,其中 HTTP/1.1 由 HTTP/1.0 改进而来
在 HTTP/1.0 中,使用的是 非持续性连接 (Non-persistent Connection),对于 CS 架构通信过程如下:
- 客户端请求与服务端建立 TCP 连接
- 服务端同意建立 TCP 连接
- 客户端发送请求,在请求信息中指定需要获取的资源
- 服务端返回响应,在响应信息中包含资源实体,之后关闭 TCP 连接
- 客户端收到响应,解析拿到资源实体
- 如果发现资源实体还要引用其它资源,那么重复以上步骤
而在 HTTP/1.1 中,使用的是 持续性连接 (Persistent Connection),对于 CS 架构通信过程如下:
- 客户端请求与服务端建立 TCP 连接
- 服务端同意建立 TCP 连接
- 客户端发送请求,在请求信息中指定需要获取的资源
- 服务端返回响应,在响应信息中包含资源实体,但是不会关闭 TCP 连接
- 客户端收到响应,解析拿到资源实体
- 如果发现资源实体还要引用其它资源,那么重复步骤 3~ 5
假设我们需要传输一个 HTML 文件,在文件中引用十个 JEPG 图片,计算传输时间?
- 若使用非持续性连接:T = (2RTT + Ttransfer) + (2RTT + Ttransfer) * 10
- 如果使用持续性连接:T = (2RTT + Ttransfer) + (RTT + Ttransfer) * 10
(2)消息格式
HTTP 采用 请求/响应 格式,客户端提交请求 (Request),服务端返回响应 (Response)
请求消息的格式请看下面的图片,其中常见的 请求方法 如下:
- GET:请求指定资源,返回资源实体
- POST:向指定资源提交数据,可能导致新资源的建立或旧资源的修改
- HEAD:类似 GET 请求,只是返回的响应没有具体的内容,常常用于获取报头
- DELETE:删除指定的资源
- PUT:使用提交的数据取代指定的资源
- TRACE:返回服务端收到的请求,常常用于测试
- OPTIONS:返回服务端针对特定资源所支持的请求方法,也能用于查看服务端的性能谈谈 GET 和 POST 的区别?
1、约定的作用不同,GET 用于从服务器上查询数据,POST 用于在服务器上修改数据
2、参数的位置不同(浏览器实现),GET 请求的参数放在 URL,POST 请求的参数放在 Body
GET 请求的参数大小可能会有限制,因为浏览器可能会对 URL 的长度有限制
GET 请求的参数会被完整保留在浏览器历史记录中,POST 请求的参数不会
3、产生的效果不同(浏览器实现),GET 请求是幂等的、没有副作用,POST 请求不是幂等的、有副作用
点击回退按钮或者刷新页面的时候,GET 不会产生任何影响,POST 会重新提交请求
GET 请求得到的结果可以作为浏览器书签,但是 POST 不行
GET 请求得到的结果会被浏览器主动缓存,但是 POST 不会
响应消息的格式请看下面的图片,其中常见的 状态代码和状态信息 如下:
1**:信息,服务端收到请求,要求客户端继续执行操作
2**:成功
200:OK,服务器已成功处理请求,并返回请求的资源
3**:重定向
301:Moved Permanently,永久重定向,请求的资源永久移动到新位置
302:Moved Temporarily,临时重定向,请求的资源暂时移动到新位置
4**:客户端错误
400:Bad Request,请求报文存在语法错误
403:Forbidden,对请求资源的访问被服务器拒绝
404:Not Found,在服务器上没有找到请求的资源
5**:服务端错误
500:Internal Server Error,服务器在执行请求时发生错误
502:Bad Gateway,作为网关的服务器在执行请求时,从远程服务器收到一个无效的响应
503:Service Unavailable,由于服务端超载或停机维护,服务器暂时无法处理客户端的请求
谈谈 301 和 302 的区别?
它们都是表示重定向的,也就是说浏览器在拿到 301 或 302 的时候会自动跳转到一个新的地址
然后它们的不同之处如下:
301 表示旧地址的资源永久移除,搜索引擎在抓取新内容的同时,会用新地址替换掉旧地址的记录
302 表示旧地址的资源其实还在,只是暂时跳转到新地址,搜索引擎会抓取新内容,但保留旧地址
(3)Cookies
由于 HTTP 协议是 无状态的,因此服务器想要跟踪用户状态,可以使用 Cookies 技术
Cookie 其实就是一个特殊的值,它由服务端创建和维护,并发送给客户端
之后,客户端在每次请求时带上 Cookie,服务端通过 Cookie 就能判断用户状态
(4)Caches
Caches 技术可以降低客户端获取响应的时间,也能减少服务端处理请求的压力,可以说是一举两得
使用 Caches 其实就是建立一个或多个 代理服务器 (proxy server),由代理服务器帮助响应客户端的请求
客户端直接发送请求到代理服务器,如果请求的资源在代理服务器上,那么直接返回给客户端
如果不在,那么代理服务器先向服务器请求资源,得到资源后保存在本地,之后再返回给客户端
简单描述一下 HTTP 协议的发展过程?
HTTP/0.9【1991 年】
- 最简单的版本,只能访问 HTML 格式资源,没有头部,请求方法只有 GET
HTTP/1.0【1996 年】
- 增加 HTTP 版本号
- 增加状态代码和状态信息
- 增加请求方法,包括 POST 和 HEAD
- 增加头部,无论是请求或者是响应都要有头部
- 在头部中通过设置 Content-Type 支持传输其它类型的文件
HTTP/1.1【1997 年】
- 增加持久性连接,能让 HTTP 请求复用 TCP 连接
- 支持流水线传输,允许在一个 TCP 连接中同时发送多个请求
- 增加请求方式,包括 DELETE、PUT、OPTIONS 等等
HTTP/2.0【2015 年】
- 二进制分帧:将传输的数据划分为更小的帧,并对它们采用二进制编码
- 服务端推送:允许在客户端没有请求的情况下,主动给客户端发送资源
- 压缩头部:多次请求的很多头部其实是重复的,有必要对头部进行处理
- 一是使用压缩工具对头部进行压缩后再发送,二是对于重复的字段可以使用索引号来代替