HTTP和TCP/IP协议关系

Http不是基于TCP/IP的吗?而这个是可以保持状态的。怎么Http就是无状态了的呢?

Http是属于最高层的应用协议,基于TCP/IP,也就是说它在TCP/IP的基础上引入了新的概念和规定。因此,无状态是Http规定的,是为了适应Web的要求而规定的。Web应用经常面对大量的访问,如果都保持TCP的连接状态那么将会消耗大量的资源。就会演变成了类似“客户端/服务端”一对一模型。因此,Http规定了它是无状态的,也就是说,处理完一个请求并返回以后,服务器端就要直接关闭掉TCP连接,不管相同的客户端是否再次发送请求。以这样的形式来实现单向的Request/response模式的。服务器在服务完成一次以后会关闭连接以节省资源。

在1.0+(1.0的各种修正版本)以及1.1中,允许HTTP设备在事务处理结束以后仍然将TCP保持在打开的状态,以便为未来的HTTP请求重用现存的连接。在事务处理结束以后仍然保持打开的连接我们就叫做“持久连接”,持久连接在1.0+和1.1中是通过不同方式确定的:

  • HTTP 1.0中通过首部插入keep-alive信息表明是持久连接
  • HTTP 1.1中默认是持久连接

下面来介绍一下这两种方式

1.keep-alive

客户端 :实现HTTP/1.0 keep-alive连接的客户端可以通过包含connection:Keep-Alive首部请求将一条连接保持在打开状态。

服务器端:如果服务器端愿意将一条连接保持在打开状态,那么就在响应头部中同样插入connection:Keep-Alive ,否则表达的意思就是我响应你这条信息后我就要把TCP连接给关闭掉。

HTTP 1.0 中keep-alive不是默认采用的,也就是说如果你不主动的往头部加入这个信息,那么就意味着是一次HTTP请求就会打开关闭一次TCP连接。客户端通过检查服务器端的响应有没有connection:Keep-Alive,就可以知道服务器发出响应以后是否会关闭连接了。

 2.和keep-alive正好相反,在HTTP1.1中持久连接默认是激活的,除非你发送了Connection:close表明可以关闭连接。HTTP1.1客户端假定在收到响应之后,除非响应中包含了Conncetion:close,否则HTTP/1.1的连接就仍然维持在打开的状态。因此,这时服务器对于关闭TCP连接就会采用两种方式,一种是当收到浏览器发送的关闭连接请求后关闭该TCP请求(意味着浏览器已经把该网页所需的请求资源已经拿完了,无需再从这条连接里获取其他资源),另一种就是当经过一段时间后,就算浏览器没有发送关闭连接的请求,服务端也会因为超时而自动关闭该条TCP连接。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------      TCP/IP 协议以字节的方式传输用户数据,并没有对其进行检查和修改。这个特点使得应用程序可以非常灵活地对其中传输的信息进行编码。TCP/IP的唯一约束是,信息必须在块(chunk)中发送和接收,而块的长度必须是8位的倍数。而字节正好是8位的,因此我们可以认为在TCP/IP协议中传输的信息是字节序列。鉴于此,我们可以进一步把传输的信息看做数字序列或数组,每个数字的取值范围是0~255(8位)。

原文地址:https://www.cnblogs.com/HuaiNianCiSheng/p/3094921.html