• HTTP-web服务器接收到client请求后的处理过程(很详细)



        1. 客户发起情况到服务器网卡;

        2. 服务器网卡接受到请求后转交给内核处理;

        3. 内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程

        4. Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)

        5. 内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘

        6. 内核调度磁盘,获取需要的资源

        7. 内核将资源存放在自己的缓冲区中,并通知Web服务器进程

        8. Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中

        9. Web服务器进程形成响应,通过系统调用再次发给内核以响应用户请求

        10. 内核将响应发送至网卡

        11. 网卡发送响应给用户

    通过这样的一个复杂过程,一次请求就完成了。

    简单来说就是:用户请求-->送达到用户空间-->系统调用-->内核空间-->内核到磁盘上读取网页资源->返回到用户空间->响应给用户。上述简单的说明了一下,客户端向Web服务请求过程,在这个过程中,有两个I/O过程,一个就是客户端请求的网络I/O,另一个就是Web服务器请求页面的磁盘I/O。

    我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切。

    首先http是一个应用层的协议,在这个层的协议,只是一种通讯规范,也就是因为双方要进行通讯,大家要事先约定一个规范。

    1.连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的(tcp链接),所以之前还有一个DNS解析过程,把www.mycompany.com变成ip,如果url里不包含端口号,则会使用该协议的默认端口号。

    DNS的过程是这样的:首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,该请求将一直发送到根直到得到结果。现在已经拥有了目标ip和端口号,这样我们就可以打开socket连接了。

    2.请求 连接成功建立后,开始向web服务器发送请求,这个请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:  GET 路径/文件名 HTTP/1.0
    文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。现在可以发送GET命令:

    GET /mydir/index.html HTTP/1.0,

    3.应答 web服务器收到这个请求,进行处理。从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。

    为了告知浏览器,,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。
    常用的HTTP头信息有:
      ① HTTP 1.0 200 OK  这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码"200 OK"表示请求完成。
      ② MIME_Version:1.0 它指示MIME类型的版本。
      ③ content_type:类型 这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html指示传送的数据是HTML文档。
      ④ content_length:长度值 它指示HTTP体信息的长度(字节)。

    4.关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。

    浏览器一般是图形界面的,因此我们并不了解在这华丽表面后面所发生的一切。当你点击一个连接时,浏览器首先找到站点的IP地址,这是通过DNS来实现的。在找到IP地址后可以建立TCP连接了,连接建立后我们就可以发送请求了,但这个请求是什么样子呢?我们现在假设点击了一个从WWW.WEBMONKEY.COM/HTML/96/47/INDEX2A.HTML点击了WWW.GRIPY.ORG/MATTMARG/,这时浏览器会发出下面的请求:

    Get /mattmarg/ HTTP/1.0
    User-Agent: Mozilla/2.0 (Macintosh; I; PPC)
    Accept: text/html; */*
    Cookie: name = value
    Referer: http://www.webmonkey.com/html/96/47/index2a.html
    Host: www.grippy.org

    第一行称为请求,它告诉服务器从MATTMARG取得文件,这里的目录一般是要加/的。下面几行通知服务器你所使用的浏览器是什么类型,你所接收的数据是什么类型。如果你以前访问过这个站点,站点可能向你发送了cookie,如果你已经有了一个这样的cookie,浏览器会将这个cookie返回给服务器。referer行通知服务器用户从哪一页到达此页的。

    下面服务器就要返回文件了,每次服务器返回文件时,都要返回一个http/1.0响应,同时带有状态码,在此之后是一些描述内部的头信息。下面就是一个响应:

    HTTP/1.0 200 Found
    Date: Mon, 10 Feb 1997 23:48:22 GMT
    Server: Apache/1.1.1 HotWired/1.0
    Content-type: text/html
    Last-Modified: Tues, 11 Feb 1997 22:45:55 GMT

    不同数据可能返回不同的content-type,因此不同的内容需要不同的content-type,因此有时候这个过程是很慢的。
    ---------------------
    作者:哎呦、不错哦
    来源:CSDN
    原文:https://blog.csdn.net/l1394049664/article/details/82313414
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Groovy新手教程
    cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    病毒木马查杀第002篇:熊猫烧香之手动查杀
    Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)
    白话经典算法系列之六 高速排序 高速搞定
    UVA580-Critical Mass
    FPGA 时序问题
    SVD神秘值分解
    Java中Integer类的方法
  • 原文地址:https://www.cnblogs.com/coolYuan/p/9968505.html
Copyright © 2020-2023  润新知