Http协议

作者: Zoe陈亚亚 | 来源:发表于2017-01-04 16:19 被阅读0次

    HTTP构建于TCP/IP协议之上,默认端口号80

    HTTP是无连接无状态的

    请求报文

    HTTP协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范。规范把HTTP请求分为三个部分:状态行请求头请求主体

    GET请求报文示例

    >

    GET /books/?sex=man&name=Professional HTTP/1.1

    Host: www.example.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Connection: Keep-Alive

    >

    原谅我不知道怎么在简书里贴代码

    POST表示可能修改变服务器上的资源的请求

    POST / HTTP/1.1

    Host: www.example.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Content-Type: application/x-www-form-urlencoded

    Content-Length: 40

    Connection: Keep-Alive

    sex=man&name=Professional

    响应报文

    HTTP 响应与 HTTP 请求相似,HTTP响应也由3个部分构成,分别是:

    状态行响应头响应主体

    200正常 400客户端语法错误 500内部服务器错误。

    持久连接

    我们知道 HTTP 协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive 模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用 Keep-Alive 模式(又称持久连接、连接重用)时,Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接

    在 HTTP 1.0 版本中,并没有官方的标准来规定 Keep-Alive 如何工作,因此实际上它是被附加到 HTTP 1.0协议上,如果客户端浏览器支持 Keep-Alive ,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有 Connection: Keep-Alive 的请求时,它也会在响应头中添加一个同样的字段来使用 Keep-Alive 。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过 Keep-Alive 规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。

    在 HTTP 1.1 版本中,默认情况下所有连接都被保持,如果加入 "Connection: close" 才关闭。目前大部分浏览器都使用 HTTP 1.1 协议,也就是说默认都会发起 Keep-Alive 的连接请求了,所以是否能完成一个完整的 Keep-Alive 连接就看服务器设置情况。

    由于 HTTP 1.0 没有官方的 Keep-Alive 规范,并且也已经基本被淘汰,以下讨论均是针对 HTTP 1.1 标准中的 Keep-Alive 展开的。

    注意:

    HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。

    HTTP 长连接不可能一直保持,例如Keep-Alive: timeout=5, max=100,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开。

    HTTP是一个无状态协议这意味着每个请求都是独立的Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的,在HTTP1.1版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于Keep-Alive的保持连接特性,否则会有意想不到的后果。

    使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1. 判断传输数据是否达到了Content-Length 指示的大小;2. 动态生成的文件没有 Content-Length ,它是分块传输(chunked),这时候就要根据 chunked 编码来判断,chunked 编码的数据在最后有一个空 chunked 块,表明本次传输数据结束,详见这里

    相关文章

      网友评论

        本文标题:Http协议

        本文链接:https://www.haomeiwen.com/subject/cfbovttx.html