眼熟 HTTP 协议

它位于 TCP/IP 第四层应用层的协议,HTTP 主要有请求报文、响应报文两种。

HTTP 是无状态(stateless)协议,是说他不像 TCP 一样建立长久连接,而是一来一回后,下次访问还是建立新的请求或响应。

如果用户在登录后,它就那么一刷新不得又得重新登录。照这么一看还挺麻烦,我们的HTTP不提供持久状态后来引用cookie这个技术,你登陆后服务器会向你返一个字段 set-cookie ,下次发送请求就会把set-cookie的值追加到现有cookie后面,这样程序就能识别用户状态。

cookie 是用户登录的凭证,服务器只认 cookie 不认人。如果盗取了管理员 cookie 就相当于拥有直接操作权限,不用输入密码了直接操作你的账户。

这个 cookie 一般保存在客户端,是一个文本文件。

由于cookie安全性问题现在Web应用都采用 session,与 cookie 区别在于存储位置不同,cookie 存在本地 session 存在服务器,用户登录后 session 产生一串随机 id 值,在响应包中写上set-cookie字段作为它的值进行返回,客户端收到后将 id 值写入 cookie 文件到本地。

在 HTTP1.0 中没有持久连接的能力,意思是访问一个网页时有多个请求就会先建立 TCP 三次握手、发送HTTP请求、响应请求、断开 TCP 连接;周而复始的重复在现在这样效率蛮低的,因为建立连接需要一定时间。

HTTP1.1 中提供了一个持久连接的字段 Keep-Alive,双方建立 TCP 连接后只要任意一方不断开就会保持连接状态,但此时传输数据还是一个请求一个响应。不过现在的传输是管线化(并行传输数据),用户可以不用等收到响应内容再去发请求,可一次发送多个请求服务器收到一个就响应一个,这样效率大大提高不少。

什么是 URL

URL 中文是统一资源定位符,是由 Uniform Resource Locator 缩写而来的。
URL 有一个标准格式,由协议、地址、端口、地址路径、发送数据、锚点(Hash)、几个内容组成。

URL.png

关于 URI 与 URL 的区别

这个问题让我困扰不少时间,不过有人已经写的挺不错啦,这里就不浪费地方写了。

总结 URI 与 URL:一个 URL 应该是路径,URN 是资源的名字,URI=URL+URN,只要一个资源能够被唯一标识那么它就是 URI。

用户如何访问站点的

用户通过浏览器访问 www 域名浏览器发送请求给 DNS 服务器,此时 DNS 返回一个解析后的域名(正向查找),也就是 IP 啦,通过 IP 找到服务器,Web 容器会查看浏览器发送的 HTTP 请求数据包中资源名字,来确定请求内容,如果有涉及到数据库查询(用户登录等等),则与数据库先进行查询,查询后将结果返回服务器,服务器会把请求的页面返回给浏览器,浏览器通过解析返回的 HTTP 包中的 Content,来呈现一个炫丽的页面。

待补充:DNS 缓存和 TCP 三次握手

请求报文

请求行、请求头、空行(空行前面都是响应头)、请求内容

GET http://www.relived.net/ HTTP/1.1 #请求方法、请求路径、用的协议(请求行)
Host: www.relived.net #你请求的目标主机  请求头
Connection: keep-alive #持久连接
Cache-Control: max-age=0 #缓存控制,眼熟就行。
Upgrade-Insecure-Requests: 1 #不知道。。。
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0 #浏览器标识
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 #请你优先返回我可以处理的文件
Accept-Encoding: gzip, deflate, sdch #采用什么算法来编码内容
Accept-Language: zh-CN,zh;q=0.8 #使用什么语言

#请求内容

关于上面的报文意思,在下面的表中都有解释。

HTTP1.1请求方法解释
GET获取资源。我们通常在浏览器地址栏里看到的就是GET请求。
POST传输实体主体,比较常见的有表单发送数据。
PUT传输文件
HEAD获取报文头部
DELETE删除文件
OPTIONS向服务器询问支持什么方法
......

请求有GET、POST等等,这是打交道最多的两种。

请求头内的首部字段表,这个表有些内容很复杂需要掌握加粗的内容

字段名说明
Accept客户端可处理的类型文件。
值:text/html;q=0.9,image/webp;q=0.8
q代表权值最大1优先返回权值高的类型,用分号分隔。
Accept-Charset客户端可处理的字符集。值:也有q来表示优先级与Accept一致不写了。
Accept-Encoding客户端可支持的内容编码。值:gzip,compress,deflate,identity(不压缩)。可用*表示任意编码格式,也用q调整优先级。
Accept-Language优先使用的语言。值:zh-cn,zh;q=0.7,en-us,en;q=0.3
也用q表示优先级。
AuthorizationWeb认证信息。
Expect期待服务器的特定行为。仅做了解
From用户的电子邮箱地址
Host请求资源所在服务器(你请求的那个地址IP或域名)
If-Match比较实体标记(ETag)。If-xxx是条件请求只有服务器判断为真时才执行请求,服务器判断请求的ETage值与服务器是否一致,不一致范围 412 P热conditionFailed,一致则接受请求
If-Modified-Since比较资源的更新时间。用于判断资源是否更新,服务器将这个值与自己文件的值进行比对如果服务器更新了,就处理这个请求将文件返回过去,否则返回304 Not Modified
If-None-Match比较实体标记(与If-Match相反),当ETag不一致时处理请求。
If-Range资源未更新时发送实体Byte的范围请求,仅做了解。
If-Unmodified-Since比较资源的更新时间(与If-Modified-Since相反),仅做了解。
Max-Forwards最大传输逐跳数,仅做了解。
Proxy-Authorization代理服务器要求客户端的认证信息,仅做了解。
Range实体的字节范围请求(请求数据的范围),获取指定范围的数据。
Referer对请求中URI的原始获取方,是从哪个页面发起的请求,有些写程序的依照这个数据进行限制登录,别忘了包可以修改。这个字段的应写做Referrer,由于错误一直延续至今。
TE传输编码的优先级,仅做了解
User-AgentHTTP客户端浏览器程序信息(你用的什么浏览器)
Cookie客户端返回给服务器证明用户状态的信息(头:值;成对出现)
DNT(非标RFC定义的字段)拒绝个人信息被收集(Do Not Track)主要针避免广告追踪。值:0同意,1拒绝。

响应报文

响应行、响应头、空行(空行前面都是响应头)、内容

HTTP/1.1 200 OK #状态行(协议 状态码 对状态码的解释)
Date: Sat, 19 May 2018 07:34:24 GMT #响应报文的时间
Server: Apache #服务器信息
X-Frame-Options: SAMEORIGIN #预防点击劫持
Vary: Accept-Encoding #缓存管理信息
Content-Length: 12237 #响应内容的字节
Keep-Alive: timeout=5, max=100 # 5秒内没请求就关闭连接,最多请求100次每请求一次-1为0就断开连接
Connection: Keep-Alive #持久连接
Content-Type: text/html; charset=UTF-8 #内容什么类型的数据采用什么编码

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="x-dns-prefetch-control" .............................................

响应头内的首部字段表,这个表有些内容很复杂,需要掌握加粗的内容。

字段名说明
Accept-Ranges是否接受自检范围请求
Age推算资源创建经过时间
ETag资源匹配信息
Location将用户重定向到指定的URI(3xx重定向)
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次发起请求的时机要求
ServerHTTP服务器的安装信息(Web服务器的名称,这个在服务端可修改。)
Vary代理服务器缓存的管理信息
WWW-Authenticate服务器对客户端的认证信息
X-Frame-Options(非标RFC定义的字段)主要终于防止点击劫持(clickjacking)。值:SAMEORIGIN仅同域名的frame才可加载该链接,DENY拒绝。这个首部字段IE8以下不支持,主流浏览器都支持。
X-XSS-Protection(非标RFC定义的字段)用于控制浏览器过滤XSS。值:1过滤,0不过滤。
P3P(非标RFC定义的字段)用于将网站网的个人隐私转换成程序能懂的格式

在HTTP等多种协议中给加前缀X-来标识非标准字段已经被RFC 6648废除。

还有一些不在RFC文档内定义的首部字段如:set-Cookie是服务器发给客户端(响应字段),cookie是客户端向服务器发送(请求字段)

Set-Cookie: BDRCVFR[x4e6higC8W6]=mk3SLVN4HKm; path=/; domain=.baidu.com
cookie字段说明
name=value键值成对出现,用分号分隔。
expires=datacookie过期时间,不指定关闭浏览器就过期
path=path限制cookie的作用范围
domain=domain适用这个cookie的域名,不指定就默认当前域名
Secure在HTTPS通信是才发送cookie
HttpOnly让cookie不能被JavaScript读取到(防XSS)

响应状态码

分为五大类,有50多个具体响应码

响应状态码解释
1xx(Informational)服务器响应的信息,通常表示服务器还有后续处理,很少出现
2xx(Success)请求被服务器成功接收冰处理后返回的响应结果
3xx(Redirection)重定向,通常在身份认证成功后重定向到一个安全页面(301永久重定向/302临时重定向)
4xx(Client Error)表示客户端请求错误
5xx(Server Error)服务器内部错误(503:服务不可用)

下面介绍常用的几种状态码

200:表示请求已成功处理,会根据请求方法的不同返回数据,GET会返回请求资源的实体(实体包含实体首部与实体主体,分别代表的是数据首部与数据),HEAD会返回实体首部没有实体主体。
204(No Content):请求成功处理,但没有任何数据返回。
206(Partial Content):请求部分内容,返回指定范围内的数据Content-Range:xxx。

301(Moved Permanently):将这个页面永久重定向到另外的地方。
302(Found):临时重定向,比如身份验证成功重定向到另一个页面。

400(Bad Request):请求报文有语法错误
401(Unauthorized):需要身份验证
403(Forbidden):禁止访问,请求被拒绝了
404(Not Found):目标未发现未访问到这个资源,服务器在拒绝你的请求也可能使用这个状态码。

500(Internal Server Error):服务器出问题啦
503(Service Unavailable):或许是负载过大无法处理这个请求,也有可能是服务器拒绝请求。 

通用首部字段表(请求与响应都会使用)

字段名说明
Cache-Control控制缓存的行为
Date创建报文的日期时间。值:Sat, 19 May 2018 07:34:24 GMT。有时返回的格式不同日期显示的是格林威治时间
Pragma报文指令。值:no-cache不返回缓存资源,仅做了解。
Connection逐跳首部、连接的管理。值:close(响应断开)、Keey-Alive(长期保持连接直到任何一断开)
Trailer报文末端的首部一览。值:Expires,在报文尾部有字段信息。
Transfer-Encoding制定报文主体的传输编码方式(仅对分块传输编码有效)。值:chunked使用块编码,仅做了解
Upgrade升级为其他协议。仅做了解
Via代理服务器的相关信息。仅做了解
Warning错误通知。仅做了解

实体首部字段(请求与响应都会使用)

字段名说明
Allow可支持的HTTP方法。值:GET,HEAD
Content-Encoding实体主体的编码方式,在不丢失实体内容的情况下进行。
Content-Language实体主体的自然语言(zh-CN)
Content-Length实体主体的大小(单位:字节)
如果用于爆破,失败的字节基本不变,成功会返回正常页面字节有大变化。
Content-Location代替对映体资源的URI
Content-MD5实体主体的报文摘要
Content-Range实体主体的位置范围(单位:字节)
Content-Type实体主体的数据类型
Expires实体主体过期的日期时间
Last-Modified资源的最后修改日期

参考链接

标签: none

讨论讨论讨论!