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