Web服务器套接字

时间:2009-12-18 03:55:48

标签: webserver

当客户端向Web服务器发送请求时。 Web服务器是否打开一个新套接字?或者是用于新请求的现有开放套接字?如果它确实为每个新请求打开了一个套接字,那么这是如何管理的,因为Http是一个无状态协议。对于所有Web服务器也是如此,或者不同的Web服务器处理这种情况有何不同?

4 个答案:

答案 0 :(得分:8)

使用Unix术语(接近通用 - 套接字在Unix的BSD风格中引入并从那里传播到任何地方),几乎任何TCP网络服务器(网络或其他)都将完成listen在绑定到“众所周知的端口”的套接字上(通常但不一定是HTTP服务器的端口80)。当客户端connect时,服务器会得到通知(以OS依赖的方式),然后它可以在侦听套接字上执行accept,这会创建一个新的套接字。

根据正在使用的HTTP协议级别(正常的1.1或旧的但仍然使用的1.0)和请求中的一些标头,客户端可能会要求一次性使用套接字(仅处理一个请求和一个响应),或者,更常见的是这些天,一个持久的(也称为,旧的术语可以追溯到HTTP晚期1.0天,作为“保持活跃”连接)。服务器不必遵守客户端对连接的持久请求,但通常会尝试,因为它使客户端性能更好。每个服务器肯定会选择他们自己的启发式方法来确定何时加载太多(一次请求的请求太多)以满足持久连接请求。

即使使用持久连接,HTTP仍然是无状态的 - 客户端可以在仍然打开的套接字上发出不同的请求,和/或尝试打开不同的套接字,而HTTP只是分别处理每个请求/响应对。套接字的持久性只能节省TCP握手和c的时间(因为HTTP在TCP之上工作,每个新的TCP连接需要自己的握手,& c)。

答案 1 :(得分:0)

基本答案:服务器将绑定到套接字并等待连接。它是无状态的,因为客户端将打开许多单独的连接,每个请求都可以独立存在。

不完全确定各种Web服务器如何处理它。

希望在某种程度上有所帮助。

答案 2 :(得分:0)

套接字侦听单个端口,并且所有请求都可能通过同一端口进入Web服务器。所以(一般来说)有一个接受所有传入请求的套接字,然后将每个请求传递给处理程序线程。通常这些处理程序线程被合并并重用,因为继续销毁和创建它们是很昂贵的。

编辑:我的立场得到了纠正。根据Alex Martelli的回应,socket.accept()创建了一个新套接字。因此,讨论持久连接确实有效。

这是一个很好的小例子(来自http://devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=396),虽然这没有使用线程池:

import java.io.*;
import java.net.*;
import java.util.*;

public final class WebServer {
    public static void main(String args[]) throws Exception {

        //Establish the listen socket
        int PORT = 5306;     //select your favorite number > 1123
        ServerSocket listenSocket = new ServerSocket(PORT);

        //Process HTTP service requests in an infinite loop
        while(true) {
            //listen for TCP connection request
            //Construct an object to process the HTTP request message
            HttpRequest request = new HttpRequest(listenSocket.accept());
            Thread thread = new Thread(request);
            thread.start();
        }
    }
}

就无国籍状态而言,Cookie和会话等内容用于识别用户从一个请求到另一个请求。 Cookie是写入客户端的数据,每次请求都会发送到服务器,会话由ID表示,可以放入URL或通过其他方式发送。

答案 3 :(得分:0)