HTTP学习笔记

本文详细介绍了HTTP的工作原理,包括无连接、媒体独立性、无状态特性和可扩展性。HTTP协议基于TCP/IP通信,常用Web服务器有IIS、Apache。HTTP消息结构包括请求和响应消息,请求方法包括GET、POST等,状态码分为五类,如200表示成功,404表示未找到。此外,内容类型Content-Type定义了数据类型和编码。

1. HTTP工作原理

 HTTP协议(HyperText Transfer Protocol,超文本传输协议),基于TCP/IP通信协议传递数据,属于应用层协议,所有wwww文件都必须遵守这个标准。HTTP协议经历HTTP/0.9(只接受get请求方法)到HTTP/1.0(第一个在通讯中指定版本号的HTTP协议版本,在代理服务器中广泛应用)再到现在的HTTP/1.1(默认采用持久连接,能很好地配合代理服务器工作,还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度),以及下一代的HTTP/2.0,Google也提出了基于UDP实现的QUIC协议,能提供更可靠更高效的传输协议,这些都在说明更好的传输协议一直都在路上。

 Http协议应用于C/S架构上(也可以用于其他目的),客户端(通常理解为浏览器)通过URL向HTTP服务端(WEB服务器)发送请求,默认端口号为80。常用的Web服务器有IIS、Apache等;关于HTTP有一些基本性质:

  • HTTP是无连接:即限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间;
  • HTTP是媒体独立的:表示只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送,客户端以及服务器指定使用适合的MIME-type内容类型;
  • HTTP是无状态的:它对于事务处理没有记忆能力,服务器不会在两个请求之间保留任何数据(状态)。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快;但是可以使用Cookies创建有状态的会话。
  • HTTP是可扩展的:在HTTP/1.0中出现的HTTP headers让协议扩展变得非常容易。只要服务端和客户端就新headers达成语义一致,新功能就可以被轻松加入进来;

【注意】

关于HTTP和连接这两者的关系:

 一个连接是由传输层来控制的,从根本上讲连接不属于HTTP的范围,HTTP并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。在当前,两个最常用的传输层协议:TCP是可靠的,而UDP不是。因此,HTTP依赖于面向连接的TCP进行消息传递,但连接并不是必须的。

 HTTP协议的工作流程主要如下:
这里写图片描述

其实上述的流程可以直接抽象为:
这里写图片描述

客户端通过代理发出请求,这里的代理通常是指浏览器,但不局限于浏览器,这个代理可能是任何一个东西,比如是一个机器爬虫,在RequestsResponses通信之间存在许多代理,比如网关、cache等,计算机和其他设备转发HTTP消息如果表现在应用层,就称之为代理,代理的作用主要:

  • 缓存(可以是公开的也可以是私有的,像浏览器的缓存);
  • 过滤(像反病毒扫描,家长控制…);
  • 负载均衡(让多个服务器服务不同的请求);
  • 认证(对不同资源进行权限管理);
  • 日志记录(允许存储历史信息);

 HTTP良好的扩展性使得越来越多的Web功能归其控制。缓存和认证很早就可以由HTTP来控制了,到目前为止,常见可控特性还有:

  • 缓存

    文档如何缓存能通过HTTP来控制。服务端能告诉代理和客户端哪些文档需要被缓存,缓存多久,而客户端也能够命令中间的缓存代理来忽略存储的文档。

  • 开放同源限制

    为了防止网络窥听和其它隐私泄漏,浏览器强制对Web网站做了分割限制。只有来自于相同来源的网页才能够获取网站的全部信息。这样的限制有时反而成了负担,HTTP可以通过修改头部来开放这样的限制,因此Web文档可以是由不同域下的信息拼接成的(某些情况下,这样做还有安全因素考虑)。

  • 认证

    一些页面能够被保护起来,仅让特定的用户进行访问。基本的认证功能可以直接通过HTTP提供,使用Authenticate相似的头部即可,或用HTTP Cookies来设置指定的会话。

  • 代理和隧道

    通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理。

  • 会话

    使用HTTP Cookies允许你用一个服务端的状态发起请求,这就创建了会话。虽然基本的HTTP是无状态协议。这很有用,不仅是因为这能应用到像购物车这样的电商业务上,更是因为这使得任何网站都能轻松为用户定制展示内容了。

2. HTTP消息结构

 前面在第一章节中提过,HTTP是应用于C/S架构上,客户端通常是浏览器(向客户端发送请求Requests),服务端则通常是一个WEB服务(接受客户端请求返回数据Responses),这就构成了传统意义上HTPP协议的“拉拽”模型。HTTP使用统一资源标识(URI,Uniform Resource Identifiers)符来建立连接和传输数据。其中客户端发送请求和服务端响应消息需要遵循一定的格式,下面是部分摘取(以百度为例):

1.客户端发送的请求消息包括:请求行、请求头、空行和请求数据4部分,请求报文的一般格式如下:

这里写图片描述

下面是向百度发起请求的消息(非解析状态):

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: BD_UPN=12314753; BAIDUID=BF6825EA8000ED7973BCDB39508327A4:FG=1; BIDUPSID=BF6825EA8000ED7973BCDB39508327A4; PSTM=1535768001; delPer=0; BD_CK_SAM=1; PSINO=6; pgv_pvi=3248832512; pgv_si=s8929636352; H_PS_PSSID=1464_21127_26350_22157; H_PS_645EC=d06eBpcQQYGTMiTkNvsj8H7MhK1Bj%2FmXKTemNFh8neCjOehV6%2BvlAEGr21o; BDSVRTM=0
第一行`GET / HTTP/1.1`是请求行,`GET`是请求方法,`/`是URL,`HTTP/1.1`是协议版本,下面的几行如`Host`、`Connection`和`Accept-Language`都是可选头部,这玩意儿比较多,下面给出一些标准请求头的说明:





































































































Header field name Description Example Status
A-IM Acceptable instance-manipulations for the request[7]. A-IM: feed Permanent
Accept Media type(s) that is(/are) acceptable for the response. See Content negotiation. Accept: text/html Permanent
Accept-Charset Character sets that are acceptable. Accept-Charset: utf-8 Permanent
Accept-Datetime Acceptable version in time. Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT Provisional
Accept-Encoding List of acceptable encodings. See HTTP compression. Accept-Encoding: gzip, deflate Permanent
Accept-Language List of acceptable human languages for response. See Content negotiation. Accept-Language: en-US Permanent
Access-Control-Request-Method,
Access-Control-Request-Headers
[8]
Initiates a request for cross-origin resource sharing with Origin (below). Access-Control-Request-Method: GET Permanent: standard
Authorization Authentication credentials for HTTP authentication. Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== Permanent
Cache-Control Used to specify directives that must be obeyed by all caching mechanisms along the request-response chain. Cache-Control: no-cache Permanent
Connection Control options for the current connection and list of hop-by-hop request fields.[9]

Must not be used with HTTP/2.[10]

Connection: keep-alive

Connection: Upgrade

Permanent
Content-Length The length of the request body in octets (8-bit bytes). Content-Length: 348 Permanent
Content-MD5 A Base64-encoded binary MD5 sum of the content of the request body. Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== Obsolete[11]
Content-Type The Media type of the body of the request (used with POST and PUT requests). Content-Type: application/x-www-form-urlencoded Permanent
Cookie An HTTP cookie previously sent by the server with Set-Cookie (below). Cookie: $Version=1; Skin=new; Permanent: standard
Date The date and time that the message was originated (in “HTTP-date” format as defined by RFC 7231 Date/Time Formats). Date: Tue, 15 Nov 1994 08:12:31 GMT Permanent
Expect Indicates that particular server behaviors are required by the client. Expect: 100-continue Permanent
Forwarded Disclose original information of a client connecting to a web server through an HTTP proxy.[12]
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43 Forwarded: for=192.0.2.43, for=198.51.100.17 Permanent
From The email address of the user making the request. From: user@example.com Permanent
Host The domain name of the server (for virtual hosting), and the TCP port number on which the server is listening. The port number may be omitted if the port is the standard port for the service requested.

Mandatory since HTTP/1.1.[13] If the request is generated directly in HTTP/2, it should not be used.[14]

Host: en.wikipedia.org:8080

Host: en.wikipedia.org

Permanent
If-Match Only perform the action if the client supplied entity matches the same entity on the server. This is mainly for methods like PUT to only update a resource if it has not been modified since the user last updated it. If-Match: "737060cd8c284d8af7ad3082f209582d" Permanent
If-Modified-Since Allows a 304 Not Modified to be returned if content is unchanged. If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT Permanent
If-None-Match Allows
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值