2020.07.23
HyperText Transfer Protocol (HTTP)是Web的应用层协议。它由两个程序实现:一个客户程序和一个服务器程序。在不同的端系统中的程序通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式,定义了Web客户向Web服务器请求Web页面的方式,服务器向用户传递Web页面的方式。
概念
- 对象(object):一个文件,可能是HTML文件,JPEG文件,一个Java小程序或video clip
- Web页面:也叫文档,由对象(object)组成。一个Web页面可以是多个对象的组合,比如由一个HTML(基本)文件,5个JPEG文件组成一个含有6个对象的Web页面
- URL地址:HTML文件通过页面的URL地址引用页面中的其他对象。每个URL地址含两部分:存放对象的服务器主机名、对象的路径名。例如,URL地址http://www.someweb.com/somepage/picture.gif,其中的www.someweb.com是主机名,/somepage/picture.gif是路径名。
- Web browser浏览器和Web服务器:浏览器实现了HTTP的客户端,we use Web browser and user interchangeably.服务器实现了HTTP的客户端,用于存储Web对象,每个对象由URL寻址。
HTTP对应的运输层协议
TCP,提供可靠连接,保证信息发送的完整。默认端口80。
HTTP运作流程
- 运输层建立TCP连接,在客户端和服务器之间;
- client向它的socket套接字接口发送HTTP请求报文并从socket接受相应报文。一旦client向socket发送一个request message,该message就脱离了client控制并进入TCP控制;
- server从它的socekt接收请求报文,并向socket发送响应报文,期间server不保存客户的任何状态信息,因此称HTTP为无状态协议 (stateless protocol);Web server总是打开的,具有一个固定的IP address。
非持续连接和持续连接(persistent connection)
- HTTP默认:persistent connection持续连接
- 非持续连接:每个request/response是单独的TCP连接发送
- 持续连接:所有request/response经相同的TCP连接发送
-
非持续连接的流程:
客户向服务器申请一个页面,服务器传送一个Web页面。该页面假设含有1个HTML文件和10个JPEG文件。
1. HTTP客户端在port 80发起一个向服务器的TCP连接(针对某个对象),该端口号是默认。在客户端和服务器端分别有一个socket与该连接关联。
2. HTTP客户经socket向服务器发送一个请求报文,其中包含了URL地址。
3. HTTP服务器通过socket接收报文,从其存储器中检索出URL地址指向的HTML对象,并通过socket向客户发送响应报文。
4. HTTP服务器进程通知TCP断开该连接,但直到TCP确认客户已经完整收到响应报文才会中断连接。
5. HTTP客户端接收相应报文,TCP关闭。该报文指出封装对象是HTML文件,从响应中读取该文件,检察该HTML文件,得到对JPEG图像对象的引用。
6. 对每个引用的JPEG对象重复前面步骤。
每个TCP在服务器发送一个对象后关闭,在本例中一共11个对象,即1个HTML和10个JPEG对象,故需要11次TCP连接。可通过配置browser实现并行,多数浏览器在默认时可打开5~10个并行的TCP连接。
非持续连接的往返时间 Round-Trip Time (RTT)
定义为一个短分组(package)从客户到服务器然后再返回客户所花费的时间。
非持续连接的往返时间分为,一个RTT用于建立TCP连接,一个RTT用于发送请求文件,和传输HTML文件的时间。非持续连接的缺点
1. 为每个请求的对象建立和维护一个全新的连接,在C-S两端都要分配TCP的缓冲区和保持TCP变量,给服务器带来严重负担。
2. 往返时间长,RTT*2+HTML传输时间。持续连接
一个TCP,传输多个对象。可设置超时间隔,如果一个TCP连接超过该间隔而仍未被使用,则关闭该TCP连接。HTTP默认采用persistent connection。
(2020.07.24)
HTTP 报文格式
其报文分为request和response报文。
-
request message请求报文
一个典型的请求报文
GET /some_dir/page.html HTTP/1.1
Host: www.someweb.com
Connection: close
User-agent: Mozilla/5.0
Accetp-language: fr
上面的请求报文中的第一行称为请求行(request line),其他部分称为首部行(header line)。request line有三个字段:方法字段、URL字段和HTTP版本字段。header line中的Host是请求的host name。Connection: close代表了非持续连接,服务器在发送完被请求对象后关闭TCP连接。User-agent代表用户的浏览器,服务器可以根据用户浏览器发送相同对象的不同版本,注意这些版本对应的URL地址相同。
(2022.05.24 Tues)
另外请求/响应报文中会有content-type
字段,对应的值有text/html
,application/json
等,表示的是报文内容的形式。即,请求报文的头部出现content-type: application/json
表示该请求报文的形式是json
。
- 一个请求报文的通用格式
即在上面的GET报文后,加入实体体(entity body, eb)。使用GET时,eb一般为空;有时会有信息,传递给URL。使用POST方式,则eb包含的是用户在表单字段中的输入值。 -
请求报文的方法
GET/POST/HEAD/PUT/DELETE- HEAD类似于PUT,服务器收到HEAD请求将会用一个HTTP报文响应,但不返回请求对象。可用于调试跟踪。
- PUT方法和Web发行工具联合使用,允许用户上传对象到指定的Web服务器上的指令路径。
- POST方法常用于提交表单。
- DELETE方法允许用户或程序删除Web服务器上的对象。
请求报文方法的区别:
(2022.05.23 Mon)
- GET用于查询
- POST/PUT/PATCH:都用于修改服务器上的数据,差别在于,POST是创建新的资源,PUT和PATCH用于修改服务器上的资源,其中PUT每次更新资源时上传完整的资源,而PATCH只上传更新部分的资源。
方法在安全性和幂等性上的对比。安全性指的是是否修改服务器上的资源数据,显然,读操作都是安全的而写操作不安全。幂等性(idempotency)指的是一次操作和多次操作的结果一致,客户端重复调用返回的是一个结果。
方法 | 安全性 | 幂等性 | 注释 |
---|---|---|---|
GET | Y | Y | 只读,不改变数据 |
POST | N | N | 每次创建新资源 |
PUT/PATCH | N | Y | 每次上传(相同的)完整/更新资源 |
DELETE | N | Y | 删除相同的资源 |
- HTTP响应报文
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 July 2020 10:00:00 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Wed, 10 Jun 2020 10:00:00 GMT
Content-Length: 9999
Content-Type: text/html
(entity body data)
第一行初始状态行(status line),其他是首部行(header line)。entity body包含了所请求的对象本身。Date和Last-Modified的区别:Date表服务器从文件系统中检索到该对象,将对象插入报文并发送该报文的时间;LM是对象创建或最后修改的日期,该日期对web cache server非常重要。Content-Type: text/HTML表示HTML文本。
- 响应报文的常用状态码
- 200 OK: 请求成功,信息在返回报文中。
- 300 Moved permanently: 请求对象被转移,新的URL在响应报文的Location: 首部行中。客户软件将自动获取新URL。
- 400 Bad Request: 通用差错代码,指示该请求不能被服务器理解。
- 404 Not Fond: 请求文档不在服务器上。
- 505 HTTP Version Not Supported: 服务器不支持请求报文使用的HTTP协议版本。
(2021.07.03 Sat)
状态码 | 描述 |
---|---|
1** | 相关信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
(2022.05.23 Mon)
-
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
- 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
- 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
- 204 NO CONTENT - [DELETE]:用户删除数据成功。
-
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
- 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
- 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
- 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
- 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
- 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
查看响应报文内容
使用telnet这个功能
telnet some_web.com 80
GET /some_url/xxx.php HTTP/1.1
Host: some_web.com
在terminal输入上面指令回车就可看到报文。
- 用户与服务器的交互Cookie
前面提到HTTP是stateless protocol,服务器不保存用户的动作与信息。通过在报文中添加Cookie,可以实现HTTP与用户的交互,服务器可保留用户一些信息。- Cookie位置
在请求和响应信息的首部行header line。 - Cookie存储
用户端,保留一个cookie文件,由用户的浏览器管理。服务器端,Web站点的后端数据库。 - Cookie生成过程
用户第一次访问某web,网站的响应报文在首部行添加Set-cookie: a_number
,用户接收到响应,读到cookie信息,便在本地的cookie文件中添加一行,该行包含服务器的主机名和在Set-cookie
的识别码。当用户再次浏览该网站,请求页面都会在首部行加入Cookie: a_number
的内容。网站根据cookie信息将用户的行为/信息存入后端数据库。
- Cookie位置
(2021.07.03 Sat)
浏览器访问一个网站的大致流程
以访问简书网站为例
- DNS解析www.jianshu.com为网站IP
- TCP发起3次握手请求,建立可靠连接
- 用户端发送HTTP请求
- 服务器发送HTTP响应
- 客户端将响应得到的HTML代码和资源渲染,并发给前端使用
st=>start: Start
op=>operation: Your Operation
cond=>condition: Yes or No?
e=>end
st->op->cond
cond(yes)->e
cond(no)->op
HTTP和HTTPS的对比
HTTP的缺点在于信息的明文传输容易被窃取,没有身份验证存在冒充风险等。
HTTPS针对HTTP的缺点,加入了SSL (Secure Socket Layer),通过SSL证书验证服务器的身份,为客户端和服务器之间的通信加密。HTTPS简单理解为HTTP+SSL/TLS.
SSL位于应用层协议和TCP/IP协议之间,为数据通信提供安全支持。
明文、密钥、数字证书
- 明文:HTTP协议是明文传输的,明文就是未被加密过的原始数据。
- 密钥:通常是一个字符串或数字,进行加密/解密算法时使用。公钥和私钥都是密钥,只不过一般公钥是对外开放的,加密时使用;私钥是不公开的,解密时使用。
- 数字证书:主要包含证书发布机构,证书有效期,公钥,证书所有者,签名使用的算法,指纹以及指纹算法。数字证书可以保证里面的公钥一定是证书持有者的。
HTTPS流程
客户端发起一个http请求,告诉服务器自己支持哪些hash算法。
服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。证书中有一个公钥来加密信息,私钥由服务器持有。
验证证书的合法性
客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。生成随机密码(RSA签名)
如果验证通过,或用户接受了不受信任的证书,浏览器就会生成一个随机的对称密钥(session key)并用公钥加密,让服务端用私钥解密,解密后就用这个对称密钥进行传输了,并且能够说明服务端确实是私钥的持有者。生成对称加密算法
验证完服务端身份后,客户端生成一个对称加密的算法和对应密钥,以公钥加密之后发送给服务端。此时被黑客截获也没用,因为只有服务端的私钥才可以对其进行解密。之后客户端与服务端可以用这个对称加密算法来加密和解密通信内容了。
Reference
- 计算机网络(自顶向下方法)原书第7版,James F. Kruose and etc., 陈鸣 译, 机械工业出版社,2019年