当在浏览器中输入 www.baidu.com时,
浏览器
1 会根据http协议构造请求头,请求体组合成包装好的数据。
请求头有字段 connection:keep_alive(http1.1默认)或者connection:close(http1.0默认)
2 调用操作系统实现TCP的API(linux中tcp_connect),在实际使用中,这个方法被包装在了另一个接口内,这个接口就是socket
3 发送数据
Server端会得到相关网页,这些网页又都包含了很多Http请求,又会给浏览器发送很多个http请求这些请求都要建立新的socket吗? 不是
具体解释 Tomcat如何处理http请求
取数据–接收到字节—按照http协议解析数据----请求头—判断connection----生成request对象—交给servlet—socket.output----socket.close
1 当Tomcat接收到请求中是close的,Tomcat会作出response,其中响应头部分connection也会是close。发送response后,tomcat就会断开socket,浏览器接收到response后,由于响应头也是close所以,浏览器也会断开socket
2 如果Tomcat接受的请求头connection是keep-alive的 只要keep-alive的http请求个数 小于 MAX_KEEP_ALIVE_REQUESTS(默认值100)就会一直保持socket。如果超过tomcat的响应头就会再次发送connection:close。
为什么这样做呢?~小demo
ServerSocket serverSocket = new ServerSocket();
serversocket.bind(new InetSocketAddress("localhost",8081));
Socket socket = serversocket.accept();
syetem.in.read
可以看到这里是没有接收数据的,一直在堵塞中。但是客户端是可以正常发送数据的,发送的数据会在recvbuf中。recvbuf的值也是可以设置的参数。所以要设置好tomcat参数合适的大小。
当recvbuf满了的时候,会造成内存溢出吗?其实是不会的。 原因很简单,因为一切都是基于TCP的,TCP的滑动窗口拥塞控制会在recvbuf满了的时候,客户端停止发送。
3 最大线程数和最大连接数。
最大连接数指同时能处理最多多少个socket连接。
最大线程数其实就是Tomcat内部线程池的大小。
4 tomcat如何实现keepalive
伪代码