Http协议学习http协议主要分为请求和响应两大部分http协议之请求http协议的请求格式为如下:请求行消息报头空行(CRLF)消息体定义:SP代表空格CR代表回车即\rLF代表换行即\nCRLF代表\r\n一、请求行请求行组成格式:请求方法SP统一资源标示符(Request-URI)SPhttp版本CRLF1、请求方法常用请求方法有(大写):OPTIONSGETHEADPOSTPUTDELETEOPTIONS方法:该方法允许客户端判断与某个资源相关的选项或需求或者服务器的能力(1)如果Request-URI不是星号,OPTIONS请求只应用于与该资源通迅时的有效选项(2)如果Request-URI是星号(“*”),OPTIONS请求通常试图应用于服务器而不是特定的资源。GET方法:GET方法即获取由Request-URI标识的任何信息(以实体的形式)。如果Request-URI引用某个数据处理过程,则应该以它产生的数据作为在响应中的实体,而不是该过程的源代码文本,除非该过程碰巧输出该文本。如果请求消息包括If-Modified-Since、If-Unmodified-Since,If-MatchIf-None-Match或者If-Range头部域,则GET方法的语义变为“条件GET”。条件GET方法请只传输在条件头部域描述情形下的实体。条件GET方法试图通过允许刷新缓存的实体而不需要多次请求或传输客户端已经拥有的数据来减少非必要的网络使用。如果请求消息包括Range头部域,则GET方法的语义变为“局部GET”。局部GET请求只需传输实体的某部分.Head方法:除了服务器不能在响应中返回消息体,HEAD方法与GET相同。HEAD请求的响应中的HTTP头部中包含的元信息应该与GET请求发送的响应中的信息相同。该方法可用来获取请求暗示实体的元信息,而不需要传输实体本身。该方法常用来测试超文本链接的有效性、可用性和最近的修改。POST方法:POST方法用来请求原始服务器接受请求中封装的实体作为从属于请求行中的Request-URI标识的副属。POST设计允许完成下列功能的统一方法:*上传消息到论坛、新闻组或相似的讨论组;*向数据处理过程提供数据块,如递交表单的结果;*通过追加操作来扩展数据库。PUT方法:PUT方法请求以提供的Request-URI存储封装的实体。如果Request-URI引用已经存在的资源,该封装实体应该被认作原始服务器存储的修改版本。如果Request-URI没有指向已存在的资源,且该URI可以被请求的用户代理定义为新的资源,则原始服务器可以用该URI创建资源。DELETE方法:DELETE方法请求原始服务器删除Request-URI标识的资源。原始服务器可在人为干涉下(或其它意思)屏闭该方法2、Request-URIRequest-URI是统一资源标识符,标识应用到请求上的资源。Request-URI=*|absoluteURI|abs_path|authorityRequest-URI的4个选择取决于请求的特性。星号“*”意思是请求不应用到特定的资源,而是服务器自己,例如当Request-URI为*时:OPTIONS*HTTP/1.1当Request-URI为absoluteURI时:GET最通用的形式用于标识原始服务器或网关上的资源。在这种情况下,URI的绝对路径为abs_path,URI的网络地址(authority)在Host头部域中传送。例如,客户端希望直接从原始服务器上获取资源,可以创建端口号80的TCP连接到主机“”并发送消息行:GET/pub/:、http版本常用的的http版本为http/1.0和http/1.1二、消息报头http的请求消息报头包含三类:通用报头请求报头实体报头报头的格式如下:报头域名:值CRLF:后面有一个空格,报头类似于一个key/value对报头域名大小写不敏感每个报头域结束后有一个CRLF(\r\n)例如:Host:127.0.0.1:8080代表服务器的IP地址和端口Note:可以自定义报头域,添加到报头中,服务器会忽略,如下添加一行自定义的报头域到消息报头中:invalid:helloworld1、通用报头常用的通用报头有如下几个:Cache-ControlConnectionDatePragmaCache-Control报头:用于http/1.1中资源的缓存控制Connection报头:在http1.1中,client和server都是默认对方支持长链接的,如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close如:Connection:closeDate报头:表示http的请求或响应的生成日期Pragma报头:取值no-cache,兼容http/1.0的缓存控制2、请求报头常用的请求报头有如下这些:AcceptAccept-CharsetAccept-EncodingAccept-LanguageHostIf-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-SinceMax-ForwardsProxy-AuthorizationRangeRefererTEUser-AgentAccept报头:Accept域用来指定响应可接受的确定媒体类型例如:Accept:text/html表示客户端可接受文本类型文件中的html类型的文件Accept-Charset报头:表示客户端可接受的字符集Accept-Encoding报头:表示客户端可接受的编码内容Accept-Language报头表示客户端可接受的语言种类Host报头表示web服务器的主机和端口例如:Host:127.0.0.1:8080代表服务器在本机的8080端口监听Host:代表服务器为百度,端口默认是80端口If-Match报头:客户端请求的实体标签在服务器中是否匹配If-Match:entitytagIf-Range报头:If-Range头部允许客户端“短路”第二次请求。非正式地,其意思是,“若实体没有修改,给我发送我缺少的部分,否则,给我发送完整的新实体”。Max-Forwards报头:代表请求被代理中转的最大次数,每被中转一次次数减一。Range报头:代表请求实体的字节范围例如一个实体有1000个字节,则Range:bytes=0-999代表请求整个实体Range:bytes=0-99代表实体的前100个字节Range:bytes=499-代表实体的后500个字节可应用于断点续传Referer报头:当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTPReferer中统计出每天有多少用户点击我主页上的链接访问他的网站。Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。可应用于防盗链TE报头:TE域指出愿意在响应中接受任何扩展transfer-coding3、实体报头常用的实体报头有如下这些:AllowContent-EncodingContent-LanguageContent-LengthContent-LocationContent-MD5Content-RangeContent-TypeExpiresLast-ModifiedAllow报头:Allow域列出由Request-URI标识的资源所支持的方法集。该域的用途是严格提醒接收方与该资源相关的有效方法用法举例:Allow:GET,HEAD,PUTContent-Range报头:Content-Rangeentity-header与部分entity-body一起发送,以指定该部分主体应该应用到全部entity-body的哪个地方。RangeExpires报头:Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器就应该联系原始服务器http协议之响应http协议的响应格式为如下:响应行消息报头空行(CRLF)消息体定义:SP代表空格CR代表回车即\rLF代表换行即\nCRLF代表\r\n一、响应行响应行组成格式:http版本SP状态码SP状态码的简要描述CRLF1、http版本常用的的http版本为http/1.0和http/1.12、状态码和状态码简要描述Status-Code的首位数字定义响应的类别。最后两个数字没有任何分类。首位数字有5个值:1xx:信息性——收到请求,继续处理2xx:成功性——成功收到、理解并接受行动3xx:重定向——必须采取进一步行动来完成请求4xx:客户端错误——请求包含错误语法或不能完成5xx:服务器错误——服务器没有成功完成显然有效的请求常见的状态码和状态码描述:200OK404NotFound502BadGateway二、消息报头http的响应消息报头包含三类:通用报头响应报头实体报头报头的格式如下:报头域名:值CRLF:后面有一个空格,报头类似于一个key/value对报头域名大小写不敏感每个报头域结束后有一个CRLF(\r\n)1、通用报头见上2、实体报头见上3、响应报头常见的响应报头有:Accept-RangesAgeETagLocationProxy-AuthenticateRetry-AfterServerVary报头:Accept-Rangesresponse-header域允许服务器指出它对某个资源请求的可接受范围接受byte-range请求的原始服务器可以发送Acept-Ranges:bytes表示接受字节范围的请求服务器不接受对某个资源的任何类型的范围请求可以发送Accept-Ranges:noneAge报头:Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了ETag报头:entitytag的缩写,用来标示一个实体,类似于实体的一个名字Location报头Location域用来重定向接收方到非Request-URI的位置来完成请求或标识新的资源Retry-After报头:如果实体暂时不可取,通知客户端在指定时间之后再次尝试Server报头:web服务器软件名称Vary报头:告诉下游代理是使用缓存响应还是从原始服务器请求Requests部分Header解释示例Accept指定客户端能够接收的内容类型Accept:text/plain,text/htmlAccept-Charset浏览器可以接受的字符编码集。Accept-Charset:iso-8859-5Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型。Accept-Encoding:compress,gzipAccept-Language浏览器可接受的语言Accept-Language:en,zhAccept-Ranges可以请求网页实体的一个或者多个子范围字段Accept-Ranges:bytesAuthorizationHTTP授权的授权证书Authorization:BasicQWxhZGRpbjpvcGVuIHNlc2FtZQ==Cache-Control指定请求和响应遵循的缓存机制Cache-Control:no-cacheConnection表示是否需要持久连接