本文原载于我的博客:https://www.seekingmini.top/archives/计算机网络笔记一应用层
写在前面
根据《计算机网络——自顶向下方法(第6版)》相关内容进行整理。主要是为了面试用的,都是一些很简单的基础知识…
1. 网络应用程序体系结构
1.1 客户-服务器体系结构
该体系结构的主要特征有:
- 有一个主机称为服务器,接受其他称为客户的主机的请求,并向其发送所请求的对象作为响应。
- 服务器具有固定、周知的地址称为IP地址,客户通过向服务器的IP地址发送分组来与其联系。
1.2 P2P体系结构
该体系结构的主要特征有:
- 应用程序在间断连接的主机对之间使用直接通信,这些主机被称为对等方。
- 自扩展性。例如,在一个P2P文件共享应用中,尽管每个对等方都由于请求文件产生工作量,但每个对等方通过向其他对等方分发文件也为系统增加服务能力。
2. 进程通信
在多个端系统上互相通信的主体是进程,通过跨越计算机网络交换报文而相互通信。进程之间通过被称为套接字的软件接口向网络发送报文和从网络接受报文。应用程序开发者对于套接字的运输层的控制权仅限于:①选择运输层协议;②也许能设定几个运输层参数,如最大缓存和最大报文段长度等。
3. Web和HTTP
Web浏览器实现了HTTP的客户端,而Web服务器实现了HTTP的服务端,用于存储Web对象,每个对象由URL寻址。HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。
3.1 客户端与服务端之间通信的过程:
-
HTTP客户首先发起一个与服务器的TCP连接;
-
一旦连接建立,该浏览器和服务器进程就可以通过套接字访问TCP;
-
客户向它的套接字接口发送了一个请求报文,该报文就脱离了客户控制并进入TCP控制;
-
服务器接受请求报文并发出响应报文通过套接字返回给客户。
3.2 非持续连接和持续连接
非持续连接
每个TCP连接在服务器发送一个对象后就关闭,即该连接并不为其他的对象而持续下来。
持续连接
服务器在发送响应后保持该TCP连接打开。
3.3 HTTP
3.3.1 请求报文
HTTP请求报文主要由请求行、请求头部、请求正文三部分组成。
- 请求行
由三部分组成,分别为:请求方法、URL以及协议版本,之间由空格分隔。
- 请求头部
为请求报文添加了一些附加信息,由键值对组成,每行一对,键和值之间使用冒号分隔。
请求头 | 说明 |
---|---|
Host | 接受请求的服务器地址 |
User-Agent | 发送请求的应用程序名称 |
Connection | 指定与连接相关的属性(如Connection: Keep-Alive ) |
Accept-Charset | 通知服务端可以发送的编码格式 |
Accept-Encoding | 通知服务端可以发送的数据压缩格式 |
Accept-Language | 通知服务端可以发送的语言 |
- 请求正文
可选部分,比如GET请求就没有请求正文。
3.3.2 响应报文
HTTP响应报文主要由状态行、响应头部、响应正文三部分组成。
- 状态行
由三部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔。
常见状态码 | 说明 |
---|---|
200 | 响应成功 |
301 | 永久重定向,搜索引擎将删除源地址,保留重定向地址 |
302 | 暂时重定向,重定向地址由响应头中的Location属性指定 |
304 | 缓存文件并未过期,还可继续使用,无需再次从服务端获取 |
400 | 客户端请求有语法错误,不能被服务器识别 |
403 | 服务器接收到请求,但是拒绝提供服务(认证失败) |
404 | 请求资源不存在 |
500 | 服务器内部错误 |
- 响应头部
与请求头部类似,为响应报文添加了一些附加信息。
响应头 | 说明 |
---|---|
Server | 服务器应用程序软件的名称和版本 |
Content-Type | 响应正文的类型(是图片还是二进制字符串) |
Content-Length | 响应正文长度 |
Content-Charset | 响应正文使用的编码 |
Content-Encoding | 响应正文使用的数据压缩格式 |
Content-Language | 响应正文使用的语言 |
- 响应正文
3.3.3 长连接与短连接
当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问的 HTML 页面资源,还会请求图片资源。如果每进行一次HTTP通信就要新建一个TCP连接,那么开销会很大。长连接只需要建立一次TCP连接就能进行多次HTTP通信。
- 从HTTP/1.1开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用
Connection : close
- 在HTTP/1.1之前默认是短连接的,如果需要使用长连接,则使用
Connection : Keep-Alive
。
3.3.4 HTTP/1.1新特性
- 默认长连接
- 支持流水线
- 支持同时打开多个TCP连接
- 支持虚拟主机
- 新增状态码
100
- 支持分块传输编码
- 新增缓存处理指令
max-age
3.3.5 HTTPS
HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPS 使用了隧道进行通信。通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
3.3.6 HTTP的安全性问题
- 使用明文进行通信,内容可能会被窃听。
- 不验证通信方的身份,通信方的身份有可能遭遇伪装。
- 无法证明报文的完整性,报文有可能遭篡改。
3.3.7 HTTPS 采用的加密方式
- 使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key,从而保证安全性;
- 获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率。
3.3.8 Get和Post的区别
- Get用来获取数据,Post用来提交数据。
- Get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而Post无限制。
- Get请求的数据会附加在URL上 ,以
?
分割URL和传输数据,多个参数用&
连接,而Post请求会把请求的数据放在HTTP请求体中。- Get是明文传输,Post是放在请求体中,但是开发者可以通过抓包工具看到,也相当于是明文的。
- Get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中。
注意:Get和Post在本质上都是tcp链接,但由于HTTP协议和浏览器或者服务器的限制,从而使它们在应用过程中产生了差别,但是它们中还有一个较大的区别:Get在请求时发送一个数据包,会将Header和Data一起发送过去,而Post会产生两个数据包先发送Header,服务器返回100,然后在发送Data,服务器返回200。
3.4 Cookie
HTTP是无状态的,它可以使用Cookie来允许站点对用户进行识别与跟踪。
Cookie技术的4个组件
- 在HTTP响应报文中的一个cookie首部行
- 在HTTP请求报文中的一个cookie首部行
- 在用户端系统中保留一个cookie文件并由浏览器进行管理
- 位于Web站点的一个后端数据库
Cookie的作用
-
标识用户
-
追踪用户活动
如上图所示,当客户端向服务器发送请求报文时,服务器会产生一个唯一识别码,并以此作为索引在其后端数据库中产生一个表项,然后在返回的响应报文的响应头部中加入一行Set-cookie:1678
,浏览器在它管理的特定cookie文件中添加一行,该行包括主机的地址以及这个识别码。以后每当客户端访问这个网站,浏览器都会从这个cookie文件中获取客户端对这个网站的识别码,并加入请求报文。在这种方式下,服务器可以追踪客户端在该Web站点的活动。服务器数据库还能保存登录账号、密码等信息,与cookie相关联。这样的话,以后客户浏览同一个网站就不需要再次输入信息了。