HTTP

通信流程

HTTP使用TCP协议在客户端和服务器间传输数据,从而保证传输的可靠性,使得HTTP应用无需关注传输细节。

HTTP程序从URL获取服务器域名和端口号,并通过DNS得到服务器的IP地址。

DNS查询

  1. 查询浏览器DNS缓存
  2. 查询本机hosts文件
  3. 查询DNS服务器

HTTP报文

HTTP报文由起始行、头部和主体组成。

行终止符:CRLF0x0D0A);标准要求行终止符为两个字符,但应用程序也应该接受单个字符作为行终止符。

起始行

请求报文的起始行由方法、URL(路径)和HTTP版本组成:

GET /index.html http/1.1

响应报文的起始行由HTTP版本、状态码和状态信息组成:

http/1.1 200 OK

状态码

所有处理过程都使用响应码而非其文本描述。

1xx信息提示
2XX成功

200:returns with a response body

201:Created

204:no content

3XX重定向

301 Moved Permanently:请求资源已经被永久移动,返回资源的新地址;

302 Found:请求资源被暂时修改,客户端随后应该使用该URI请求更新内容;

304 Not Modified:请求的资源未被修改过,客户端可使用已缓存内容;

4XX客户端错误

400 Bad Request:服务器无法解析请求数据;

401 Unauthorized:需要输入用户名和密码;

403 Forbidden:拒绝访问;

404 Not Found:no item matches the requested URL

5XX服务器错误

5xx:Unhandled exceptions

头部字段

User-Agent

让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。

User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions>
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)
User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)
Content-Type

用于指示资源的MIME类型。

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

boundary由1~70个字符组成(known to be very robust through email gateways),用于封装消息的多个部分的边界,对于多部分实体(multipart entities,具有一组而不是单个内容体)是必需的。通常头部边界前缀添加--,尾部边界后缀添加--

Content-Disposition

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition

Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"
Content-Disposition: form-data
Content-Disposition: form-data; name="fieldName"
Content-Disposition: form-data; name="field2"; filename="example.txt"
Content-Encoding

媒体数据的压缩编码。通常尽可能压缩数据,但对于已经压缩过的类型(如jpeg)则不必要。

Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
Content-Encoding: br
Content-Encoding: deflate, gzip
Content-Language

用于设定内容的目标观众所适用的语言。

Content-Language: en-US
Content-Language: de-DE, en-CA

服务器向客户代理发送cookie,从而客户代理随后能将其返回给服务器。要设置多个cookies,则设置多个该字段。

Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Secure; HttpOnly; SameSite=Strict

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie

Web资源

URI

URI(Uniform Resource Identifier)分为URL(Uniform Resource Locator)和URN(Uniform Resource Name)

URL

URL描述一台特定服务器上特定资源的位置及其访问方式。

The components of a URL - IBM Documentation

Uniform Resource Identifier - Wikipedia

URL格式

URL通常由协议、服务器地址和路径(服务器上资源的位置)组成。

scheme://user:password@host:port/path;params?query#frag
query:key1=value1&key2=value2&...

frag(片段)并不会发送给服务器,服务器将资源返回后,客户端通过片段决定显示的资源内容。

相对URL

相对于当前文档路径的URL。

URL编码

URN

URN作为特定内容的全局唯一标识,与资源位置无关(例如DOI)。

资源类型

MIME (Multipurpose Internet Mail Extension)类型最初用于电子邮件系统,在HTTP中用于标识媒体资源类型(Content-Type)。

Web服务架构

代理

缓存

网关

隧道

HTTP/SSL

代理

代表用户发起HTTP请求的程序(客户端),例如浏览器、爬虫。

HTTP方法

GET

获取记录。

GET https://localhost:5001/api/TodoItems
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 4241178d-38d3-4b68-a7e1-6d2540938bdb
Host: localhost:5001
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
-------------------------------------
HTTP/1.1 200 OK
Date: Fri, 08 Jan 2021 13:05:35 GMT
Content-Type: application/json; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked
[{"id":1,"name":"walk dog","isComplete":true}]
POST

添加记录。

POST https://localhost:5001/api/TodoItems
Content-Type: application/json5
# User-Agent/Accept/Postman-Token/Host/Accept-Encoding/Connection
Content-Length: 47
{"name":"walk dog","isComplete":true}
---------------------------------------
HTTP/1.1 201
Date: Fri, 08 Jan 2021 13:05:22 GMT
Content-Type: application/json; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked
Location: https://localhost:5001/api/TodoItems/1
{"id":1,"name":"walk dog","isComplete":true}
PUT

更新记录

PUT https://localhost:5001/api/TodoItems/1
Content-Type/User-Agent/Accept/Postman-Token/Host/Accept-Encoding/Connection/Content-Length
{"id":1,"name":"walk cat","isComplete":true}
--------------------------------------------
HTTP/1.1 204
Date: Fri, 08 Jan 2021 13:53:03 GMT
Server: Kestrel

在URL和请求数据中都需要包含id

DELETE
DELETE https://localhost:5001/api/TodoItems/1
---------------------------------------------
HTTP/1.1 204
Date: Fri, 08 Jan 2021 14:00:06 GMT
Server: Kestrel

HTTP cookies

附录

HTTP版本

HTTP/0.9:只支持GET方法,不支持MIME类型、HTTP首部和版本号。

HTTP/1.0:添加了版本号,HTTP首部和多媒体对象处理。

HTTP/1.0+:很多特性被加入,包括:keep-alive连接、虚拟主机、代理连接。

HTTP/1.1:校正设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。

HTTP/2.0:性能优化,服务逻辑远程执行框架。

HTTP: Why a new protocol? (w3.org)

Web Architecture from 50,000 feet (w3.org)