Internet-Http协议格式
1.HTTP连接(短连接/长连接/多路复用)
HTTP/1.0: 一次HTTP请求响应结束后,自动断开TCP连接(TCP短连接)
HTTP/1.1: 一次HTTP请求响应结束后,保持TCP连接一段时间,下次可以重用该连接(TCP长连接)
HTTP/2.0: 多个HTTP请求和响应同时使用一个TCP连接(TCP多路复用)
2.HTTP请求
[请求行]: POST /xxx.html HTTP/1.1
GET /xxx.html?key1=val1&key2=val2 HTTP/1.1 (GET数据最大长度为1K)
[请求头]: Host: www.xxx.com 网站主机名(域名/ip)
Connection: close/Keep-Alive 是否保持TCP连接
User-Agent: 客户端软件基本信息
Accept: text/html,image/* 客户端可接受的数据类型
Accept-Charset: ISO-8859-1 客户端可接受的数据编码
Accept-Encoding: gzip,compress 客户端可接受的数据压缩格式
Accept-Language: en-us,zh-cn 客户端可接受的语言环境
Referer: http://www.lioil.win 当前HTTP请求的来源(URL),和防盗链相关
Cookie: UID = 9FE636AA6FFA43BBE 客户端用户数据
Content-Length: 1024 数据长度
Content-Type: application/x-www-form-urlencoded 数据类型
Date: Mon, 18 Jan 2017 06:26:29 GMT 当前时间
If-Modified-Since: Mon, 18 Jan 2017 06:26:29 GMT 缓存的最后获取时间
If-None-Match: "83794-1208174400000" 缓存标记
If-Range: "06132ff18495d44a40014f7202a03696" 断点下载相关
Range: bytes=22716713- 断点下载/上传文件的开始字节位置
[空行]: \r\n
[请求体]: ... (GET请求为空)
* Post请求上传文件(与一般post不同, 请求体被分界线(boundary)划分成多块区域,用于上传多个文件)
POST /xxx HTTP/1.1
Host: lioil.win
Content-Length: 1024
Content-Type: multipart/form-data; boundary=BoundarybXA7KWbsgAx0OB7z
(\r\n)
--BoundarybXA7KWbsgAx0OB7z (\r\n)
Content-Disposition: form-data; name="testFile"; filename="文件A.zip" (\r\n)
Content-Type: application/octet-stream (\r\n)
(\r\n)
文件A内容(原始二进制) (\r\n)
--BoundarybXA7KWbsgAx0OB7z-- (\r\n)
(\r\n)
--BoundarybXA7KWbsgAx0OB7z (\r\n)
Content-Disposition: form-data; name="testFile"; filename="文件B.zip" (\r\n)
Content-Type: application/octet-stream (\r\n)
(\r\n)
文件B内容(原始二进制) (\r\n)
--BoundarybXA7KWbsgAx0OB7z-- (\r\n)
3.HTTP响应
[状态行]: HTTP/1.1 200 OK
200 OK 请求处理成功
206 Partial Content(断点下载相关)
301 永久重定向(旧地址被认为永久移除,搜索引擎不保留旧地址,所以很少使用) + 响应头 Location
302 临时重定向(搜索引擎保留旧地址,所以业内很常用) + 响应头 Location
303 307 细化重定向(HTTP/1.1将302拆分为303和307,为了兼容HTTP/1.0,很少使用) + 响应头 Location
304 Not Modified 内容未修改(服务器返回响应体为空,浏览器继续使用缓存) + 响应头 Last-Modified 或 ETag
404 资源未找到
500 服务器内部错误
[响应头]: Server: apache tomcat 服务器基本信息
Connection: close/Keep-Alive 是否保持TCP连接
Content-Encoding: gzip 数据压缩格式
Content-Length: 80 数据长度
Content-Language: zh-cn 语言环境
Content-Type: text/html; charset=GB2312 数据类型/编码
Refresh: 3;url=http://www.lioil.win 定时刷新到指定url页面
Location: http://www.lioil.win 请求重定向地址 + 状态码 302
Content-Disposition: attachment;filename=f.zip 与文件下载相关
Transfer-Encoding: chunked 传输类型, chunked块传输
Set-Cookie: SS=Q0=5Lb_nQ; path=/search 设置客户端Cookie
Date: Mon, 18 Jan 2017 06:26:29 GMT 当前时间
Last-Modified: Mon, 18 Jan 2017 06:26:29 GMT 最后修改时间(配合HTTP请求头 If-Modified-Since) + 状态码 304
ETag: "83794-1208174400000" 缓存标记(配合HTTP请求头 If-None-Match) + 状态码 304
Expires: 0 缓存过期时间,0或-1代表不缓存 (HTTP/1.0)
Pragma: no-cache 缓存时长,max-age = 3600,单位s (兼容HTTP/1.0, 在HTTP/1.0中只实现 Pragema: no-cache)
Cache-Control: no-cache 缓存时长,max-age = 3600,单位s (HTTP/1.1新增)
Content-Range: bytes 22716713-1721650279/1721650280 断点下载/上传的文件位置
[空行]: \r\n
[响应体]: ...
* 缓存优先级
ETag > Last-Modified
Last-Modified缺陷:
1.最后修改时间只能精确到秒级,如果某些文件在1秒内被改多次,无法准确标记文件的修改时间;
2.某些文件会被定期生成,内容不变,日期改变
3.可能无法准确获取文件修改时间
Etag是服务器生成的缓存标记,能准确控制缓存,Last-Modified与ETag一起使用时,服务器会优先验证ETag
Cache-Control > Pragma > Expires
Expires是绝对时间,要求客户端与服务器时间一致(无法保证,不建议使用)
所以HTTP1.1引入Cache-Control来克服Expires头的限制
* HTTP/1.1中定义了5类状态码:
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
* 302劫持:
因为302是临时重定向,所以搜索引擎会保留旧地址,并把新地址的内容绑定到旧地址,如果新旧地址是不同公司/人的网站,那就会造成302劫持。
假设A站通过302重定向B站, 那么Google/百度等搜素引擎会认为A站=B站,A站域名绑定了B站内容/PR(PageRank,网页排名)等资源,
所以有些人把新域名通过302重定向到PR高的域名,从而窃取高的PR以谋取利益!!!
长时间大量使用302的网站很可能被搜索引擎判为作弊跳转,Google/百度都会封杀降低该域名,
罪名是"利用重复的内容来干扰搜索结果的网站排名"
简书: http://www.jianshu.com/p/1c72f0308212
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54585221
GitHub博客:http://lioil.win/2017/01/17/Http.html
Coding博客:http://c.lioil.win/2017/01/17/Http.html