- 在请求头中有一个connection的键,它对应的值有keep-alive 和 close 两个值。
- keep-alive就是用于告诉服务器需要保持长连接。
- close就是用于告诉服务器这是个短链接。
- 底层原理
- 数据的传输使用的是传输层的TCP协议和UDP协议。而HTTP使用传输层的TCP协议进行实现。
- TCP协议只是一种协议,规定了一些东西,但具体实现是谁来实现的了?
- 具体实现是操作系统来实现这个这个协议的,一般都是使用C语言编写的。
- 实现了TCP协议后我们就能直接使用操作系统上实现TCP的一些方法和属性吗?
- 肯定是不可能的,直接让你调用操作系统的方法和属性,可能会有一些安全性问题。
- 不让直接调用,那该怎么调用系统实现的TCP的属性和方法了?
- 会有专门的开发人员对这些方法进行封装,就是在这些方法之上在套一个方法,而这个套的方法里面就会有一些列的校验和规则。
- 就一定不能直接调用系统的方法吗?
- 这个套的方法是用什么实现的?
- socket 就是实现TCP功能的类,每种程序设计语言应该都有自己实现的socket。
- 我们现在就可以使用编程语言 的Socket 去实现TCP规则了。
- 但我不是要实现HTTP协议吗?
- 所以我们在实现HTTP的有连接的规则后,还需要在这基础之上再加上HTTP协议的一些特殊规则。
- 那什么是HTTP协议的特殊规则?
- HTTP协议的特殊规则表现再 请求 和 响应 的数据格式中。我们需要去解析这些数据格式里面的内容,这些内容又代表了什么。
- 内容的意义,在HTTP协议文档中已经说明的非常清楚,这时就需要我们自己去实现这些规则。
- 让我去完成特殊规则的编写比较麻烦,所以就出现了一些开发人员编写好以后发出来给我们使用代码,这些代码我们可以叫它web应用服务器。为什么这样叫了?
- 因为web应用都是使用HTTP协议发送接收数据,而将HTTP协议实现的框架(代码) 就可以解析HTTP协议。这个框架给这些web应用提供HTTP协议解析的服务,所以这个框架就可以叫web应用服务器。
- 如果使用Tomcat(框架)当web应用服务器。
- tomcat在接受到客户端发送的HTTP协议格式的数据,首先会对其内容解析,然后判断connection的值为keep-alive 或 close。
- tomcat里面会有一个while(one)循环,connection的值为keep-alive就会将one值设置为true,从而保证一直循环获取客户端发送的请求。
- 这里有个疑问服务端会一直获取客户端发送的数据吗?就是一直保持这个socket连接不断开。
- 答案是:不会的服务端可以设置最大解释请求次数,例如:接受10次请求这个socket就会断开。
- 还可以设置最大响应时间,就是客户端多长时间之内没有给服务端发送请求,服务器也会默认断开。
- 默认断开就是将 one设置成false,给客户端发送connection:close的响应头
- connection的值为keep-alive就会将one值设置为false,就会跳出循环,不在获取客户端请求。会关闭socket,然后再给客户端发送connection:close的响应头,这个被浏览器解析后就知道了服务器关闭了连接。说明这个socket连接不能再次使用,下次发送请求需要从新创建个socket连接。
其中的tomcat我并没有去看过源代码,不清楚是怎么实现的我猜想是这样是这样实现的。欢迎大家指出其中错误。