前言
前不久,受领导所托,为部门的应届毕业生做了一次HTTP协议基础的培训,记录下来,时刻提醒自己基础才是最重要的。不过缺少https的部分,后期会补上。
一、HTTP网络协议栈
协议
|
网络层级 |
HTTP
|
应用层
|
TCP |
传输层
|
IP
|
网络层
|
网络接口
|
数据链路层
|
HTTPS网络协议栈
协议 |
网络层级
|
HTTP | 应用层 |
TSL/SSL | 安全层 |
TCP
|
传输层 |
IP
|
网络层
|
网络接口
|
数据链路层
|
二、TCP协议
HTTP要传输一条报文时,会以流的形式将报文数据通过打开的一条TCP连接按序传输。TCP收到数据流之后,会把数据切成段(小数据块)
并将段封装在IP分组中,通过因特网传输。
IP地址将你连接到正确的计算机,端口号将你链接到正确的应用程序上。TCP通过4个值来唯一定义一条连接:
<源IP地址 源端口号 目的IP地址 目的端口号>
三、HTTP事务流程及时延
(1)客户端需要根据URI确定服务器的IP地址和端口号。如果最近没有对URI中的主机名进行访问,通过DNS解析系统将URI中的主机名转换
成一个IP地址可能需要话费数十秒时间。
(2)接下来,客户端回想服务器发送一条建立TCP链接的请求,并等待服务器回送一个请求接受应答,每条新的TCP链接都会有连接建立时延。
这个值通常只有一两秒钟,但如果有数百个HTTP事务,这个值会快速叠加。
(3)一旦链接建立了,客户端就会通过新建立的TCP管道来发生HTTP请求,数据到达时,web服务器会从TCP连接中读取请求报文,并对请求
进行处理,因特网传输请求报文以及服务器处理请求报文都需要时间。
(4)然后,web服务器会回送HTTP响应,这也需要花费时间。
四、请求方法
get 获取某个资源
head 服务器在响应中只返回头部,不返回响应体
put 向服务器写入文档,如果文档已存在则替换它。有安全问题,所以大部分web服务器禁止响应该方法,或者要求用户输入密码
post 向服务器提交数据,如提交表单
trace 响应主体中携带它受到的原始请求报文
options 返回响应头allow:get,post 表示web服务服务器支持哪几种请求方法
delete 删除资源,客户端无法保证删除程序一定会执行,http协议允许服务器在不通知客户端的情况下撤销请求
五、状态码
(1)100-199 信息性状态码
目前仅定义了100、101
http1.1新增的状态码
100 说明收到了请求的初始部分,请客户端继续。
101 转换协议,说明服务器正在根据客户端的制定,将协议转换成update首部所列的协议
(2)200-299 成功状态码
目前仅定义了200-206
(3)300-399 重定向状态码
目前仅定义了300-307
300 Multiple Choices 客户端请求的URL指向多个资源时,服务器会返回该状态码
301 Moved Permanently 请求的资源已被移除。响应的location头部中应该包含该资源现在对应的URL方便客户端重新请求
302 Found 与301类似,表示客户端可以使用location中的URL临时定位资源,但是将来的请求依旧要使用老URL
304 Not Modified 表示客户端请求的资源没被修改过,服务器不会返回响应体。
(4)400-499 客户端错误状态码
目前仅定义了400-417
400 Bad Request 客户端发送了一个错误的请求
403 Forbidden 请求被服务器拒绝,可在响应体部分说明拒绝原因,但是通常这个状态码是在服务端不想说明原因时使用的
404 Not Found 资源没找到
405 Method Not Allowed 请求的URL不支持请求方法,通常返回该状态码的响应中应该包含Allow首部,指明该资源支持的请求方法。
408 Requet Timeout 客户端完成请求所花的时间太长,服务器可返回该状态码并关闭链接
(5)500-599 服务器错误状态码
目前仅定义了500-505
500 Internal Server Error 服务器遇到一个妨碍他为请求提供服务的错误时,响应该状态码
六、首部
从HTTP1.0开始,HTTP协议开始定义首部。
(1)通用首部
Cache-Control: no-cache
Cache-Control: max-age=0
Date: Sun, 20 Jul 2014 05:50:26 GMT
Transfer-Encoding: chunked 对报文主体执行过的编码的列表
(2)实体首部:
Content-Type: application/x-javascript
Content-Length: 2939
(3)请求首部
Accept: */*, text/*, image/gif, image/jpeg,text/css,text/html,application/xhtml+xml,application/xml; q=1
q值(质量值):内容协商。用于表明客户端的偏好。某一资源服务器如果有多个版本,该值可向服务器表明客户端希望接受哪个版本。
Accept-Charset : utf-8
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Accept-Encoding: gzip,deflate,sdch
If-Modified-Since: Thu, 03 Jul 2014 07:55:56 GMT
If-None-Match: "11e92a-457b-31345aa"
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Referer: http://appmail.mail.10086.cn/mpost2014/html/indexrecommend.html
Connection: keep-alive
HTTP1.1停止了对keep-alive连接的支持,用持久链接改进了工作机制,与1.0的keep-alive不同的是,HTTP1.1的持久链接在默认情况下是激活的,除非应用程序在报文头中添加头部connection:close要求事物处理结束之后关闭连接。在以前的版本中,keep-alive要么是可选的要么就不支持。
关于connection:close:
请求头中添加了该头部,浏览器就不会再用该链接发送其他请求,换言之,如果客户端不希望用这条连接发送其他请求,请在最后一条请求中携带该头部.
Host: appmail.mail.10086.cn:80
Cookie: OUTFOX_SEARCH_USER_ID=-317159478@10.120.182.11; YNOTE_FORCE=true;
Max-Forward: 5 只能与请求方法TRACE一起使用,自定请求所经过的代理或其他中间节点的最大数目
Pragma:no-cache
(4)响应首部
Allow: get, post, head
Content-Encoding: gzip
Expires: Mon, 21 Jul 2014 05:14:57 GMT
ETag: "11e92a-457b-31345aa"
Last-Modified: Thu, 03 Jul 2014 07:55:56 GMT
Server: nginx
Set-Cookie: RMKEY=;Path=/;Domain=mail.10086.cn;Max-Age=0;HTTPOnly
(5)扩展首部
X-Forwarded-For: 64.95.76.161 代理服务器用这个首部说明某条请求都被转发给了谁
作业:
一、问答题:
(1)139邮箱资源服务器与缓存相关的响应首部是怎么配置的?
(2)登录139邮箱web2.3,在浏览器有缓存的情况下,刷新页面,浏览器会不会重新发送请求获取静态资源?如果会,请列出与缓存相关的请求首部以及响应状态码;如果不会,请说明原因。
(3)请指出Cache-Control与Expires的区别
(4)新功能上线后,如何清空浏览器的缓存,让用户获取最新的资源文件?
问题1、问题2 可用Fiddler抓包然后截图说明。
二、编程题:
请写一个页面,并封装相应的JS代码,完成139邮箱的写信功能,无需调用邮箱组件,完成发信功能即可。
三、请按照以下步骤交作业
步骤一、将问题答案以及解题思路写成有道笔记,然后生成分享地址。
步骤二、利用编程题写好的发信页面将分享地址发送到前端开发室的邮件组(如果大家愿意写成blog,请给出blog地址)
原文:http://www.cnblogs.com/hellohuman/p/3864089.html