HTTP 简略介绍(-)
关于一些网络知识的总结吧,感觉面试肯定会被问到,诸如HTTP的状态码,保证TCP的可靠性连接,浏览器缓存等等,做个总结,忘记的时候过来看看,希望不要在这个上面丢分。
网络基础TCP/IP 应用层 传输层 网络层 数据链路层
应用层协议
FTP DNS HTTP
传输层
协议 TCP UDP
网络层
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方
链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network
Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输
媒介)。硬件上的范畴均在链路层的作用范围之内
确保可靠性的TCP协议
三次握手
客户端 发送标有SYN(同步)的数据包给服务器端
服务器端 回复客户端带有SYN/ACk(同步/确认)的数据包给客户端
客户端 回复服务器端标有ACK(确认)的数据包
四次挥手
客户端 发送标有FIN(结束)的数据包给 服务器端
服务器端 回复发送确认包ACK(确认)给 客户端
服务器端 发送标有FIN(结束)的数据包给 客户端
客户端 回复发送确认包ACK(确认)给 接收端
DNS协议负责域名解析的DNS服务
URI(同一资源标志符)
URI是一个用于标识某一互联网资源名称的字符串。
以 http://hackr.jp/index.htm 作为URI请求的例子
1 | GET http://hackr.jp/index.htm HTTP/1.1 |
除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以用一个 * 来代替请求
URI。下面这个例子是查询 HTTP 服务器端支持 的 HTTP 方法种类。
1 | OPTIONS * HTTP/1.1 |
告知服务器意图的HTTP方法
GET: 获取资源
请求
1 | GET /index.html HTTP/1.1 |
响应
仅返回2012年7 月12日7 点30分以后更新过的index.html页面资源。如果未有内容更新,则以状态
码304 Not Modified作为响应返回
POST:传输实体主体
POST 方法用来传输实体的主体。
虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容。
请求
1 | POST /submit.cgi HTTP/1.1 |
响应
返回 submit.cgi 接收数据的处理结果
PUT:传输文件
PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文
件内容,然后保存到请求 URI 指定的位置。
鉴于 HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的 Web 网站不使用该方法。
请求
1 | PUT /example.html HTTP/1.1 |
响应
响应返回状态码 204 No Content(比如 :该 html 已存在于服务器上)
HTTP无状态协议,所以引入Cookie,运用cookie管理状态
HTTP 协议因为是无状态的协议,所以他不会知道,你是谁,你以前发过什么,然后你发过来的内容也不会知道是你发过来的,HTTP协议就是这么无情。所以引入Cookie来管理状态,让通过HTTP协议接收的服务端知道你是谁。从而回应你,回你的话
cookie会根据从服务器端发送的响应报文中写入cookie信息来控制客户端的状态。
cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当下次客户端在往服务器端发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
第一次客户端请求的时候,--------》服务端生成cookie,然后传回给客户端响应里添加cookie(在响应报文的set-cookie里),然后客户端保存cookie 第二次客户端请求(请求里已经有了cookie信息状态),只需在请求中添加cookie后发送,服务器端检查cookie,服务端确认后响应客户端。 服务端就能知道客户端是谁了。
HTTP报文内的HTTP信息
无情的HTTP的报文组成
报文首部无情的HTTP的头
请求行
Host:hackr.jp 本机地址
User-Agent:Mozilla/5.0 浏览器版本号
Accept:text/html,application/xhtml+xml 接受文件类型
Accept-Language:ja,en-us;q=0.7 接受语言
Accept-Encoding:gzip,deflate 接受编码
DNT:1
Connection:keep-alive 关系,保持连接
Pragma:no-cache 编译指示: 不隐藏
Cache-Control:no-cache
请求行:包含用于请求的方法,请求URI和HTTP版本
首部字段:包含表示和响应的各种条件和属性的各类首部。
请求首部字段
通用首部字段
实体首部字段
其他
报文实体无情的HTTP的身体
状态行
HTTP/1.1 200 OK 转态码200ok
Date:Fri,13 jul 2012 02:45:26 GMT 发出时间
Server:Apache 服务器类型
Last-Modified:Fri,31 Aug 2007 02:02:20 GMT 最后修改时间
ETag:’asdfasfasdfasfasfdasd’
Accept-Ranges:bytes 支持单位:比特
Connection-Length:362 内容长度362比特
Connection:close 连接:关闭
Content-Type:text/html 内容类型
状态行:包含表明响应结果的状态码,原因短语和HTTP版本
首部字段:包含表示和响应的各种条件和属性的各类首部。
响应首部字段
通用首部字段
实体首部字段
其他
编码提升传输速率
HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的CPU等资源
报文主体和实体主体的差异
报文(message)
是 HTTP 通信中的基本单位,由 8 位组字节流(octet sequence,其中 octet 为 8 个比
特)组成,通过 HTTP 通信传输
实体(entity)
作为请求或响应的有效载荷数据(补充项)被传输,其内容有实体首部和实体主体组成
压缩传送的内容编码
向待发送邮件内增加附件时,为了使邮件容量变小,我们会先用 ZIP 压缩文件之后再添加
附件发送。HTTP 协议中有一种被称为内容编码的功能也能进行类似的操作。
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码
常用的内容编码有以下几种
gzip(GNU zip)
compress(UNIX系统的标准压缩)
deflate(zlib)
identity(不进行编码)
分块编码
获取部分内容的范围请求
对需要指定下载的实体范围,指定范围发送的请求叫范围请求(Range Request)
对于1000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源。
执行范围请求时,会用到首部字段Range来指定资源的byte范围。
Range:bytes = 5001~10000
从5001字节之后全部的
Range:byte=5001-
从一开始到3000字节和5000~7000字节的多重范围
Range:bytes=-3000,5000-7000
针对范围请求,响应会返回状态码206Partial Content的响应报文,另外,对于多重范围的范围请求,响应会在首部字段Content-Type表明multipart/byteranges后返回响应报文。
如果服务器端无法响应范围请求,则会返回状态码200 OK和完整的实体内容
返回结果的HTTP状态码
HTTP转态码表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常,通知出现的错误等工作。
| | 类别 | 原因短语 |
|---|---|---|
| 1XX | Informational(信息性状态码) | 接受的请求正在处理 |
| 2XX | Success(成功状态码) | 请求正常处理完毕 |
| 3XX | Redirecion(重定向状态码) | 需要进行附加操作以完成请 |
| 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
代表性的14种状态码
2XX 响应结果表明请求被正常处理了。
200 OK表示从客户端发来的请求在服务器端被正常处理了
204 No Content 请求处理成功,但没有资源可返回
206 Partial Content 客户端进行了范围请求,同时服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容
3XX 重定向 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求
301 Moyed Permanently 永久性重定向
永久性重定向:该状态码表示请求的资源已被分配了新的URI,以后使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存
发送请求时,当指定资源路径的最后忘记添加斜杆”/“,就会产生301转态码.
302 Found 临时性重定向
临时性重定向,该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
和301 Moved Permanently 状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的,换句话说,已移动的资源对应的URI将来还有可能发生改变,比如用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,而是仍旧保留返回302状态码的页面对应的URI。
303 See Other 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资
源303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用
GET 方法获取资源,这点与 302 状态码有区别.
比如,当使用 POST 方法访问 CGI 程序,其执行后的处理结果是希望客户端能以 GET 方法
重定向到另一个 URI 上去时,返回 303 状态码。虽然 302 Found 状态码也可以实现相同的功
能,但这里使用 303 状态码是最理想的。
当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删
除请求报文内的主体,之后请求会自动再次发送。
301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使用时大家都会这么做。
304 Not Modified 资源已找到,但未符合条件请求……..
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况,304状态码返回时,不包含任何响应的主体部分,304虽然被划分在3XX类别中,但是和重定向没有关系。
307 Temporary Redirect 临时重定向
临时重定向:该转态码与302Found有着相同的含义。尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守。
307会遵照浏览器标准,不会从POST变成GET,但是,对于处理响应时的行为,每种浏览器有可能会出现不同的情况
4XX 客户端错误 响应结果表明客户端是发生错误的原因所在。
400 Bad Request 该转态码表示请求报文中存在语法错误,但错误发生时,需修改请求的内容后再次发送请求,另外,浏览器会像200 OK一样对待该状态码
401 Unauthorized 未经授权
该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息,另外若之前已进行过1次请求,则表示用户认证失败。
返回含有401的响应必须包含一个适用于被请求资源的WWW—Authenticate首部用以咨询(challenge)用户信息。当浏览器再次受到401响应,会弹出认证用的对话窗口.
403 Forbidden 被禁止
该状态码表明对请求资源的访问被服务器拒绝了,服务器没有必要给出拒绝的详细理由,但如果想做说明的话,可以在实体的部分主体对原因进行描述,这样就能让用户看到了。
404 Not Found 该状态码表明服务器上无法找到请求的资源,除此之外,也可以在服务器端拒绝请求且不想说明理由时使用
5XX 服务器错误
500 Internal Server Error 网络服务错误 该状态码表明服务器端在执行请求时发生了错误,也可能是WEB应用存在的BUG或某些临时的故障。
503 Service Unavailable 服务不可用
该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入 RetryAfter 首部字段再返回给客户端
状态码和状况的不一致
不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如 Web 应用程序内部发生错误,状态码依然返回 200 OK,这种情况也经常遇到
保存资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器上的访问,因此也就节省了通行流量和通信时间。
缓存服务器是代理服务器的一种,并归类在缓存代理类型中。换句话说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本
缓存服务器的优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了
缓存代理(Caching Proxy):会预先将资源的副本(缓存)保存在代理服务器上。
缓存的有效期
当遇上源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新前的“旧”资源了
即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器上获取“新”资源。
客户端的缓存
缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。以 Internet Explorer 程序为例,把客户端缓存称为临时网络文件(Temporary Internet File)。浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读
取。
另外,和缓存服务器相同的一点是,当判定缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。
1.浏览器请求——>2.无缓存——>3.向web服务器请求——>4.请求响应、缓存协商——>5.呈现在第4个步骤,在响应消息的头字段,会有Expires、Cache-Control、缓存时间、Etag、Last-Modified等信息。
浏览器缓存优点
减少冗余的数据传输
减少服务器的负担
加快客户端加载网页的速度
协商缓存
协商缓存是利用HTTP请求头中的属性【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的。
【Last-Modified,If-Modified-Since】:If-Modified-Since就是上次请求返回的Last-Modified,服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果有变化,就正常返回资源内容。如果没有变化,就返回304,不返回资源内容,不更新Last-Modified。
一般来说,在没有调整服务器时间和篡改客户端缓存的情况下,这两个header配合起来管理协商缓存是非常可靠的,但是有时候也会服务器上资源其实有变化,但是最后修改时间却没有变化的情况,而这种问题又很不容易被定位出来,而当这种情况出现的时候,就会影响协商缓存的可靠性。所以就有了另外一对header来管理协商缓存,这对header就是【ETag、If-None-Match】。它们的缓存管理的方式是:
【ETag、If-None-Match】:浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上ETag的header,这个header是服务器根据当前请求的资源生成的一个唯一标识,这个唯一标识是一个字符串,只要资源有变化这个串就不同,跟最后修改时间没有关系,服务器再次收到资源请求时,根据浏览器传过来If-None-Match和然后再根据资源生成一个新的ETag,如果这两个值相同就说明资源没有变化,否则就是有变化;如果没有变化,返回304返回ETag不返回资源;如果有变化,返回资源。
HTTP之前的协议
FTP(File Transfer Protocol) 文件传输
NNTP(Network News Transfer Protocol) 电子会议室内传送消息的协议
Archie 搜索 anonymous FTP 公开的文件信息的协议
WAIS(Wide Area Information Servers)以关键词检索多个数据库使用的
Gopher 查找与互联网连接的计算机内信息的协议
下次在总结关于HTTP的安全问题,身份认证,报文信息等
如有写的不对的地方希望大家指正。