http服务器_http服务器监听工具 - CSDN
精华内容
参与话题
  • WEB/HTTP服务器搭建

    万次阅读 2019-01-20 10:03:33
    HTTP 对于软件都有服务和客户,有服务端和客户端 服务 就是在操作系统运行一个或者多个程序,并为客户端提供相应所需的服务 协议 就是计算机网络中进行数据交换而建立的规则、标准或约定的集合。只有遵守这个...

    HTTP

    对于软件都有服务和客户,有服务端和客户端

    服务

    就是在操作系统运行一个或者多个程序,并为客户端提供相应所需的服务

    协议

    就是计算机网络中进行数据交换而建立的规则、标准或约定的集合。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。

    1.WEB服务器

    web服务器一般指网站服务器,他是一个驻留于Internet的一个计算机程序,用于向浏览器提供文档,网站等信息,也可以在其中放置各种文档数据供世界下载,当然也可以放置文档供世界浏览。

    1.1 WWW

    环球信息网,又名“万维网”,其可分为Web客户端和Web服务器程序。可以让客户端(常用浏览器)访问浏览Web服务器上的页面。由许多互相链接的超文本组成,通过互联网互相访问。

    Internet提供的主要服务有万维网WWW)、文件传输FTP)、电子邮件(E-mail)、远程登录Telnet)、手机 (3GHZ) 等。

    1.2 Http

    (HyperText Transfer Protocal)超文本传输协议,是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准。

    它使得浏览器的传输访问更高效,使网络传输减少。

    1.3 网页、网页文件和网站

    网页是网站的基本信息单位,是组成WWW的基本文档。由文字、图片、动画、声音等多种媒体信息以及链接组成,用HTML编写,通过链接实现与其他网页或网站的关联和跳转。

    网页文件是用HTML(标准通用标记语言下的一个应用)编写的,在WWW上传输,能被浏览器识别显示的文本文件。其扩展名是.htm.html

    网站由众多不同内容的网页构成,网页的内容可体现网站的全部功能。通常把进入网站首先看到的网页称为首页或主页(homepage)

    1.4 apache

    是一种当今流行的linux Web服务器,起初由Illinois大学Urbana-Champaign的国家高级计算程序中心开发,后来Apache被开放源代码团体的成员不断地发展和加强。

    1.5网站架构lamp    

    lamp=Linux+apache+mysql+php\python\jsp\perl

    静态网页:html

    动态网页 : 和后台数据库实现一些交互  php jsp python perl …

    本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,该软件开发的项目在软件方面的投资成本较低,70%以上的访问流量是LAMP来提供的,LAMP是最强大的网站解决方案。

    访问标准:通过访问ip地址及端口号访问服务器               

    2.HTTP协议运行原理

    HTTP报文结构

    请求报文由请求行,请求头部,空行和请求数据组成

    如下图

    1).请求行

    请求行分为三个部分:请求方法、请求地址和协议版本

    请求方法

    请求地址

    URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。

    端口和路径有时可以省略(HTTP默认端口号是80)

    如下例:

    协议版本

    协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

    2).请求头部

    请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

    请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。

    3).请求数据

    可选部分,比如GET请求就没有请求数据。

    下面是一个POST方法的请求报文:

    POST  /index.php HTTP/1.1    请求行

    Host: localhost

    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

    Accept-Language: zh-cn,zh;q=0.5

    Accept-Encoding: gzip, deflate

    Connection: keep-alive

    Referer: http://localhost/

    Content-Length:25

    Content-Type:application/x-www-form-urlencoded

      空行

    username=aa&password=1234  请求数据

    HTTP响应 

    代理服务器: S和C之间的访问实体        

    缓存服务器: 特殊的代理服务器

    网关服务器: 一个http/FTP网关服务器C---http -- 8080 (FTP<-->HTTP )-----S FTP

                           <源ip地址><源端口号> <目标ip地址><端口> 

    HTTP关键字段

    UA字段

    SERVER字段

    Referer字段

    HTTP重定向

    Session

    Session是可以存储针对于某一个用户的浏览器以及通过其当前窗口打开的任何窗口具有针对性的用户信息存储机制。 通常大家认为,只要关闭浏览器,session就消失,其实这是错误的理解。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留。由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间.

    (1)第一次访问某个web站点资源时,客户端提交没有带SessionID的请求(请求报文头没有Cookie头域信息)。  而web服务器会检查是否有SessionID过来,没有则创建SessionID,并根据web程序自身定义在请求哪个资源时添加属于当前会话的信息(也可为空),这个信息列表以SessionID作为标识。然后将SessionID返回给客户端(通过响应报文头的Set-Cookie头域)。 (2 )客户端再次访问同个web站点时,提交带有SessionID的请求(通过Cookie头域存储SessionID)。由服务端判断session是否失效,如果未失效,可查询属于当前会话的信息列表。如果失效,则创建新的session(产生新的SessionID),而原先的session(包含session带的信息列表)则丢失,无法访问。

    Cookie

    Cookie 保存SessionID的方式可以采用Cookie,这样在交互过程中浏览器可以自动的按照规则把这个SessionID发回给服务器。Cookie的命名方式类似于SessionID。有时Cookie被人为的禁止,所以出现了其他机制以便在Cookie被禁止时仍然能够把SessionID传递回服务器。这种技术叫做URL重写,就是把SessionID直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://www.wantsoft.com/index.asp;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 。 另一种是作为查询字符串附加在URL后面,表现形式为http://www.wantsoft.com/index?js ... 99zWpBng!-145788764 。

    软件安装

    [root@imoemoe ~]# yum install httpd                  安装http服务器

    [root@imoemoe ~]# systemctl stop firewalld       关闭防火墙

    [root@imoemoe ~]# setenforce 0                        关闭selinux防火墙

    [root@imoemoe ~]# mkdir /{xixi,haha}                创建文件夹

    [root@imoemoe ~]# mkdir /usr/local/hehe          创建虚拟目录文件夹

    [root@imoemoe ~]# mkdir /xixi/100                    创建用户名登陆的虚拟目录

    [root@imoemoe ~]# echo '嘻嘻' > /xiaopang/100/index.html

    [root@imoemoe ~]# echo ‘我是嘻嘻’ > /xiaopang/index.html

    [root@imoemoe ~]# echo ‘哈哈’ > /dapang/index.html

    [root@imoemoe ~]# echo '虚拟目录' > /usr/local/hehe/index.html

    vim /etc/httpd/conf.d/httpd.conf                        ——编写主配置文件

    ServerName 0.0.0.0:80 

    vim /etc/httpd/conf.d/vhosts.conf                      ——编写辅助配置文件

    <Directory /xixi>                                ——设置xixi目录

            AllowOverride none                  ——允许覆盖

            Require all granted                   ——设置访问目录权限

    </Directory>

    <Directory /haha>                             ——设置haha目录

            AllowOverride none

            Require all granted

    </Directory>

    <Directory /usr/local/hehe>               ——设置hehe目录

            AllowOverride none

            Require all granted

    </Directory>

    Listen 10000    ——监听10000端口

    <VirtualHost 192.168.10.100:80>   端口号必须写

            DocumentRoot /xixi/100           ——指定当前主机访问网站根目录

            ServerName 192.168.10.100   ——指定访问网站名称

    </VirtualHost>

    <VirtualHost 192.168.10.100:80>       

            DocumentRoot /xixi

            ServerName www.xixix.com                             ——基于域名寻址

            ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"                               ——错误日志

            CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common        ——访问日志

    </VirtualHost>

    <VirtualHost 192.168.10.100:80>

            DocumentRoot /haha

            ServerName www.haha.com

            Alias /hehe /usr/local/hehe

            ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"

            CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common

    </VirtualHost>

    <VirtualHost *>   ——如想表示所有主机则使用 * 号

    [root@imoemoe ~]# systemctl restart httpd

    [root@imoemoe ~]# vim /etc/hosts

       192.168.10.100  www.xixi.com

       192.168.10.100 www.haha.com

    [root@imoemoe ~]# curl http://192.168.10.100

    嘻嘻

    [root@imoemoe ~]# curl http://www.haha.com

    哈哈

    [root@imoemoe ~]# curl http://www.haha.com/hehe/

    虚拟目录

    [root@imoemoe ~]# curl http://www.xixi.com

    我是嘻嘻

    展开全文
  • 基于HTTP协议实现的小型web服务器

    万次阅读 多人点赞 2017-08-12 08:44:43
    1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源 2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面...

    我们先了解一下这个项目最终能达到的一个目标,然后以这个来进行项目的分析:
    1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源
    2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面)
    3、服务器能进行简单的cgi运行。比如当客户在表单中输入数据后,服务器能够将运行结果返回个客户
    4、能够通过页面对数据库进行操作,如增删查改等操作

    一、http服务器实现的基本框架

    • 关于HTTP协议
      即超文本传输协议,是互联网上应用最广泛的网络协议。它是应用层的协议,底层是基于TCP通信的。HTTP协议的工作过程:客户通过浏览器向服务器发送文档请求,浏览器将请求的资源回应给浏览器,然后关闭连接。即:连接->请求->响应->关闭连接。
    • 关于URL
      即统一资源定位符,每个网页都对应一个URL地址(俗称网址),具有全球唯一性。它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个完整的URL包括协议类型、主机类型、路径和文件名。
      http协议的URL格式: http: //host[:port][abs_path] ,http表示使用http协议来进行资源定位;host是主机域名;port是端口号,一般有默认的;abs_path代表资源的路径。
      这里我主要介绍项目中涉及的URL的两种格式—URL带参数和不带参数的。
      这里写图片描述
      GET方法使用的是带参数的URL,即传递的参数会使用?连接在资源路径后边;POST方法使用的是不带参数的URL,它的参数是通过http请求报头中的请求消息体传递给服务器的。
    • 关于HTTP的请求与响应格式
      这里写图片描述
      响应报头中的状态码和状态码描述,例如:当请求的资源不存在时,会收到“404 NotFound”的页面,404就是状态码,“NotFound”就是状态码描述,即请求的文件不存在。

    二、服务器实现的基本思路

    1、http协议是基于TCP通信的协议,因此,实现web服务器的第一步至少要能实现两个主机不同进程之间的TCP通信。
    2、接下来的部分就是比较主要的处理逻辑了,当服务器收到请求后,首先应该分析请求方法(因为web服务器是要支持cgi的,但请求方法不同处理cgi也不同,这里我们只处理GET和POST方法)。
    3、当方法确定后,应该拿到请求的URL,这一步是为了我们后边能处理GET和POST方法的cgi(GET和POST的参数位置不同,GET的参数在URL中,POST的参数在请求正文中)
    4、判断资源是否存在,如果存在,判断这个资源是一个目录、普通文件还是一个可执行程序。之前几步我们已经提取到URL以及参数。GET方法:如果没有参数,就直接将请求的资源返回(即进入非cgi模式运行);否则,进入cgi模式内部运行;只要是POST方法就需要支持cgi:直接进入cgi函数内部运行。

    非cgi模式:
    进入非cgi模式时一定是GET方法且没有参数,此时进入echo_www()函数内部即可,该函数会将所请求的资源以html的格式返回给浏览器。

    cgi模式:
    这里写图片描述
    上述这张图描述了运行cgi时的过程,首先服务器要从浏览器上读取参数,然后需要fork出一个子进程进行cgi部分的处理,父进程通过环境变量的方式将参数转交给子进程,子进程运行完成后,将结果交给父进程,父进程再将数据输出给浏览器。在这个过程中可以将父进程看作一个所谓的中间量,只进行了参数的转交,因此可以将子进程的输入输出文件描述符进行重定向,即子进程直接与浏览器“联系”。

    下面总结出父子进程内部各自需要干的事情:
    这里写图片描述

    三、错误处理

    错误处理这部分的实现可以参考echo_www()函数,但需要改变响应的消息报头的格式,即改变状态码,状态码描述,以及返回的页面。例如当请求的资源不存在时,服务器需要返回给浏览器一个默认的404页面,告诉客户请求的资源不存在。效果如图:
    这里写图片描述

    四、项目文件

    这里写图片描述
    目录:
    cgi:运行cgi部分的实现代码
    conf:配置文件,存放需要绑定的服务器的ip和port
    log:shell的日志文件以及http错误处理的日志文件
    lib:mysql需要的lib库
    sql_client:mysql部分的API及CGI实现
    wwwroot:web服务器工作的根目录,包含各种资源页面(例如默认的index.html页面,差错处理的404页面),以及执行cgi的可执行程序

    文件:
    configure.sh:sheel脚本,运行该shell脚本后需要自动生成Makefile文件
    http_ctl.sh:服务器控制脚本,需要实现服务器的启动、暂停以及重新启动
    httpd.pid:与http_ctl.sh配合使用。如果把服务器变成守护进程在后台运行,重新启动时就需要检测服务器是否启动,该文件存放服务器启动以后的进程id
    httpd.h:服务器的方法声明
    httpd.c:方法实现
    main.c:服务器的主逻辑

    五、实现结果

    请求资源存在:
    这里写图片描述

    运行cgi后:
    这里写图片描述

    六、源码:

    https://github.com/lybb/Linux/tree/master/httpd

    附:
    这里是我遇到的一些问题,粘出来,也可能是你遇到的问题:
    1、本地环回测试ok,Linux下的浏览器测试也可以,但不能接外部的浏览器访问(没有设置桥接模式)嗯~要是在外部浏览器测试的话千万别忘记关闭防火墙
    2、服务器应答时,没有将html格式的页面发送,而是将底层的实现代码展示在浏览器,并且在调试时将本来要打印的调试信息会打印到网页上(在回应空行时将send期望发送的数值写的太大,本来只需要发送两个字节的内容)
    解决:先检查代码,思路正确,在容易出现问题的地方加入调试信息,最后将问题定位在echo_www()函数内
    3、不能显示图片(这个问题是没有将所有发送的情况考虑完全,只考虑到目录、可执行程序,但没有考虑到如果请求的是一个路径明确的普通文件)
    解决:测试请求一个路径明确的test.html文件,加入调试信息 ,将问题定位在:如果请求的资源存在,应该如何处理。对于普通文件,找到后并回显给浏览器;如果是目录,应答的是默认页面;如果是可执行程序,执行后返回结果
    4、能显示图片后,但显示的不完整(原因:echo_www中,期望读取一行信息的line值太小,不能存下一张图片)
    5、运行cgi模式时,每次提交数据并进行submit后都会自动出现提醒下载的页面
    原因:在响应报头中,将Content-Type中的”text”写成”test”。而浏览器对于不能识别或解析的实体,都会提醒用户下载。

    展开全文
  • 基于HTTP实现的小型web服务器

    千次阅读 2018-09-12 22:26:09
    主要流程为:服务器获得请求–&gt;响应并处理请求–&gt;返回结果。 完整的HTTP过渡到TCP实现客户端与服务器的交互过程 1.当客户端执行网络请求的时候,从url中解析出url的主机名,并将主机地址转换成ip 2....

    主要流程为:服务器获得请求–>响应并处理请求–>返回结果。

    完整的HTTP过渡到TCP实现客户端与服务器的交互过程
    1.当客户端执行网络请求的时候,从url中解析出url的主机名,并将主机地址转换成ip
    2.从url解析出服务器的所用端口号
    3.客户端用TCP连接服务器
    4.连接成功后 获取输出流,将数据以报文的形式传递给服务器
    5.当服务器接收到数据之后,进行判断和解析码,并回应一条响应报文
    6.客户端从输入流中获取报文,然后进行解析
    7.关闭网络连接

    HTTP的特点


    1、支持客户端/服务器的模式
    2、简单快捷 客户向服务器发送请求服务时,只需要传送请求方法和路径,每种方法规定了客户与服务器联系的类型的不同,由于HTTP协议简单,使得HTTP服务器的规模小,因此通信速度很快.
    3、灵活  允许传送各种类型的数据,数据类型用Content-Type标记
    4、无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,收到客户的应答后,随即断开连接,这种方式节省传输时间,请求应答机制会断开
    5、无状态  HTTP协议是无状态的协议,即对事务处理没有记忆功能

    关于URL


    即统一资源定位符,每个网页都对应一个URL地址(俗称网址),具有全球唯一性。它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个完整的URL包括协议类型、主机类型、路径和文件名。 
    http协议的URL格式: http: //host[:port][abs_path] ,http表示使用http协议来进行资源定位;host是主机域名;port是端口号,一般有默认的;abs_path代表资源的路径。 
    这里我主要介绍项目中涉及的URL的两种格式—URL带参数和不带参数的。

    HTTP的请求与响应格式


    响应报头中的状态码和状态码描述,例如:当请求的资源不存在时,会收到“404 NotFound”的页面,404就是状态码,“NotFound”就是状态码描述,即请求的文件不存在。

    1.实现支持GET和POST方法的小型http服务器
    GET方法:如果GET方法只是简单的请求一份资源,而不传递参数的话则由服务器直接将资源返回即可。如果GET方法的url中带有参数的话,则就要使用CGI模式进行处理。 
    POST方法:POST方法要使用CGI模式进行处理,POST的参数在消息中文中出现。
    使用GET方法使用的是带参数的url,传递的参数会使用?连接在资源后面POST方法使用的是不带参数的url 它的参数是通过http请求正文传递给服务器的,http的请求和响应模式


    响应报头中的状态码和状态码描述,举个例子,当请求的资源不存在的时,会收到"404 NotFound"的页面,404就是状态码,

    "NotFound"就是状态码描述,既请求的文件不存在

    状态码表示响应类型

    1×× 保留

    2×× 表示请求成功地接收

    3×× 为完成请求客户需进一步细化请求

    4×× 客户错误

    5×× 服务器错误 

    响应头的信息包括:服务程序名,通知客户请求的URL需要认证,请求的资源何时能使用

     

    HTTP服务器实现框架


    1.面向链接:http协议是基于TCP通信协议,因此实现web服务器的第一步至少要能实现两个主机不同进程之间的TCP通信,并且需要解决高并发问题所以这里推荐使用多线程服务器来构建,每次创建出来一个新线程出来的时候将线程分离,然后让这个新线程去处理这个请求.
    2.分析出请求行: 当服务器接收到请求后,首先知道的是HTTP服务器版本号,和请求方法。web服务器是要支持cgi模式: 请求的方法不同,cgi可能也不同,我们实现的知识比较简单单的处理GET和POST方法
    3.判断cgi模式
    //    1)当我们判断出来是GET请求时候,并且url中没有参数的话,就用非CGI模式,非CGI模式处理//起来比较简单,首先解析出来请求路径,判断是不是合法资源,如果是就直接返回这个资源。
    //    2)当是CGI模式处理请求的时候,我们要fork一个子进程,对子进程exec替换CGI程序,这个
    //过程中使用pipe进行父子进程之间的通信。所有需要的参数在exec之前,都将这些参数导出为环境变//量,就算exec的话,子进程还是能够通过环境变量获取所需的参数。
    4.响应客户端:此时我们已经知道了方法以及是否为cgi模式,然后开始读取URL,这里有一个细节非cgi模式 请求参数会跟在url当中,如果cgi模式的话,参数在消息正文中,然后我们读取到路径,判断路径当中资源是否存在,如果存在判断这个资源是一个目录,普通文件还是一个可执行程序

    这里分情况分析
        1)如果是cgi模式,直接进入cgi内部运行;只要是POST方法就需要支持cgi,直接进入cgi函数内部运行.
        2)如果是非cgi模式时一定是GET方法并且没有参数,此时进入wwwroot()函数内部即可,该函数会将所请求的资源以html的格式返回给浏览器.

     

    接下来是解释运行cgi模式,首先服务器要从浏览器读取参数,然后创建出来一个子进程去执行cgi部分的可执行资源,父进程通过环境变量的方式传递给子进程,子进程运行完成之后呢,将结果交给父进程,父进程再将数据输出给浏览器. 所以父进程在这个例子当中就向是一个中介,只进行参数和结果的转交实际上并不会执行任何资源,因此将子进程的输入输出文件描述符重定向,就可以让子进程直接与浏览器"联系".



    父进程做的事情

    1. 1.创建两个管道,并关闭相应的文件描述符 
    2. 2.POST方法:继续读取数据,直到读完POST的参数部分GET方法:直接从子进程读取结果
    3. 3.将数据和方法全部交给子进程后等待子进程的结果

    子进程做的事情

    1. 1.关闭管道适当的文件描述符
    2. 2.对标准输入输出进行重定向
    3. 3.通过环境变量传递参数
    4. 4.进行exec程序替换

     

    一次完整的http请求的流程

    项目文件

    目录: 
    python:爬取小说和招聘信息的代码

    sql_connect:存放mysql需要的lib库   连接mysql程序文件
    wwwroot:web服务器工作的根目录,包含各种资源页面(例如默认的index.html页面,差错处理的404页面),以及执行cgi的可执行程序

    文件: 

    makefile:编译整个项目
    httpd.h:服务器的方法声明 
    httpd.c:方法实现 
    main.c:服务器的主逻辑

     

    数据库中的操作
    没有索引的时候会进行整个表的扫描
    添加索引 索引会形成一颗二叉树  利用二分查找的方法。

    遇到的问题:
    1.运行cgi后不能显示在页面上,便尝试着写一个简单的CGI程序看自己的CGI是否真的能跑完,结果CGI没有问题,后来尝试用telnet工具模拟一次http,看看是否真的收到了网页回复,后来分析结果,对比之后发现返回的东西不能显示,之后给html加了一些p标签,便可以显示出来。
    2. 经常会出现类似于:undefined reference to `sql_connecter::~sql_connecter()'的问题,文件编译的路径不对。
    3.调用数据库的数据显示到html文件中出现乱码的问题,最初以为自己编码格式有问题,后来发现是数据库编码格式和浏览器的编码格式不一样,数据库使用utf8编码方式,浏览器是GB2312,后来浏览器使用utf8编码格式,能够正常显示。

    4.代码中会需要int *和 void*的转换,用到C++强制转换形如  int*  data = reinterpret_cast<int*>(arg);

    5.本地环回测试ok,Linux下的浏览器测试也可以,但不能接外部的浏览器访问(没有设置桥接模式) 在外部浏览器测试的话千万别忘记关闭防火墙 

    6.运行程序时会提醒挺行下载页面,因为在响应报头有问题中。而浏览器对于不能识别或解析的实体,都会提醒用户下载。

    展开全文
  • 什么是http服务器

    万次阅读 多人点赞 2019-02-25 10:13:43
    本篇文章旨在从服务器后台开发的角度剖析一个简单的http服务器的运行原理. 我们知道浏览器是http(s)的客户端,目的是连接远程的http服务器,然后服务器返回浏览器数据.浏览器接收数据解析数据之后展现出来.我们看到的...

    本篇文章旨在从服务器后台开发的角度剖析一个简单的http服务器的运行原理.

    我们知道浏览器是http(s)的客户端,目的是连接远程的http服务器,然后服务器返回浏览器数据.浏览器接收数据解析数据之后展现出来.我们看到的外在表现就是,浏览器访问一个url,然后就得到相应的web页面.

    同样我们知道,浏览器与http服务器是通过http协议,传输层是tcp协议,因为他是有连接,可靠的协议.关于http协议简单的介绍一下:


    一个标准的HTTP请求由以下几个部分组成

    <request-line>
    <headers>
    <CRLF>
    [<request-body><CRLF>]

    在HTTP请求中,第一行是请求行(request-line),用来说明请求类型、要访问的资源(URL)以及使用的HTTP版本;
    紧接着是多行头部(headers)信息,用来说明服务器要使用的附加信息;
    头部信息之后是一个回车换行符(\r\n),用于标明头部信息的结束。
    以上是必须内容,根据需要可在头部信息结束之后增加主体数据(request-body);

    主体数据之后是一个回车换行符(\r\n),用于标明主体数据的结束。

    例如,我们可以在IE浏览器上输入下面的网址:

    http://localhost:8000/hello/index.html

    HTTP请求的头部信息如下:

    GET /hello/index.html HTTP/1.1
    Accept: */*
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    Host: localhost:8000
    Connection: Keep-Alive
    Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6

    收到请求数据之后,服务器解析,毕竟是明文字符,这个简单.然后服务器就知道了客户端的要求--获取目录hello/index.html文件.服务器读取文件内容发送给浏览器就好了.

    后来随着业务逻辑越来越复杂,单单获取某个html文件功能早已不能满足需求,个性化需求呼之欲出.比如在线问卷调查表,他究竟是怎么把我们填写的数据传递给服务器的呢?

    你可能会说那不是一样,客户端发送什么内容,服务器就接收什么内容.可是你想过没有,每个网站的需求是不一样的,本来服务器接收到浏览器的请求数据已经是够复杂的了,还让服务器来解析数据并响应不同的数据处理,这不太现实.

    一般的,服务器最好只接收数据,如果让服务器也处理数据逻辑,势必会让服务器变得很复杂,稳定性也得不到保证.

    另外一个角度是为了让程序复用,提高生产效率.也就是说,如果不关注业务逻辑,只注重接收数据,那么服务器程序可以给任何一个开发者使用.换句话说,我们不用从头开始写.直接使用现有的高性能的服务器就可以满足需求了.例如公司白领中午要吃饭,不可能跑回家自己去做饭吃,自己叫外卖就好了.

    但是现实问题仍然没有解决,通过什么方式去处理业务逻辑呢?

    你要给手机充电时,把插头插入插线板就能获取电了.插线板有接口,提供了电.

    同理服务器程序最好也提供接口,浏览器通过统一的接口给服务器,然后我们从服务器接口中获取我们想要的数据.获取数据之后我们可以把数据交给第三方程序来处理逻辑,这样就做到与服务器业务分离了,good iead.

    事实上,现在的http服务器就是这么做的,不过很复杂而已.下一篇开始为您介绍这些接口.

    附录:HTTP Request Header 请求头

     

    Header 解释 示例
    Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html
    Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5
    Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip
    Accept-Language 浏览器可接受的语言 Accept-Language: en,zh
    Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
    Authorization HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
    Connection 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) Connection: close
    Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new;
    Content-Length 请求的内容长度 Content-Length: 348
    Content-Type 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
    Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
    Expect 请求的特定的服务器行为 Expect: 100-continue
    From 发出请求的用户的Email From: user@email.com
    Host 指定请求的服务器的域名和端口号 Host: www.zcmhi.com
    If-Match 只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
    If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
    If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
    If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards: 10
    Pragma 用来包含实现特定的指令 Pragma: no-cache
    Proxy-Authorization 连接到代理的授权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Range 只请求实体的一部分,指定范围 Range: bytes=500-999
    Referer 先前网页的地址,当前请求网页紧随其后,即来路 Referer: http://www.zcmhi.com/archives/71.html
    TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
    Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
    User-Agent User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
    Via 通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
    Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning


    --------------------- 
    作者:Shonm 
    来源:CSDN 
    原文:https://blog.csdn.net/zxm342698145/article/details/79995039 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • HTTP服务器(一)

    千次阅读 2019-02-01 22:10:58
    基本疑问知识点荟萃
  • http服务器实现(一)

    千次阅读 2017-12-29 15:49:05
    深入学习http服务器,这是本文的目的,而不是实现一个真正可用的http服务器。毕竟实现一个成熟可用http服务器的难度很大。软件都经历过很多版本的迭代,在不断测试、bug调试和完善功能的过程中,最终才变得成熟可用...
  • 简易HTTP服务器

    千次阅读 2017-07-22 21:45:22
    1.支持客户/服务器模式。...由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接:无连
  • 从零实现一个http服务器

    万次阅读 多人点赞 2018-05-23 14:38:33
    我始终觉得,天生的出身很重要,但后天的努力更加重要,所以如今的很多“科班”往往不如后天努力的“非科班”。...我面试过很多求职者,一说到http协议,他们能滔滔不绝,然后我问他http协议的具...
  • 美国 免费服务器

    万次阅读 2017-10-15 16:47:16
    美国 免费服务器  http://www.fastly.com/ http://www.cloudflare.com/ http://www.rackspace.com/
  • 接收邮件服务器 常用邮箱登陆入口: http://mail.163.com/ http://mail.sina.com.cn/ http://mail.sohu.com/ http://mail.tom.com/ http://mail.sogou.com/ http://www.126.com/ http://mail.10086.cn/ ...
  • 【合集】用Raspberry Pi(树莓派)打造各种服务器 Raspberry Pi(树莓派)有很多的应用,其中搭建服务器是大家应用比较多的,今天就整理一个合集用Raspberry Pi(树莓派)打造各种服务器。 欢迎大家提出宝贵意见...
  • 在之前的博文中, 我陆续说过如何搭建ftp, sftp, tftp服务器, 在本文中, 我们来继续聊如何实战搭建一个http服务器http服务器有很多种, 如tomcat,apache等, 然而, 很多新手无法搭建和配置成功, 颇为受挫,...
  • 常见HTTP错误代码大全

    万次阅读 多人点赞 2011-06-24 15:10:00
    一些常见的状态码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码 说明100 (继续) 请求者应当继续提出请求...
  • 常见邮件服务器(接收服务器和发送邮件服务器)地址 ,平时设置ootlook的时候可以查看。 腾讯QQ邮箱 接收服务器:pop.qq.com 发送服务器:smtp.qq.com  网易126邮箱 接收服务器:pop3.126.com ...
  • 常用的POP3和SMTP邮件服务器

    万次阅读 2011-05-22 12:16:00
    常用POP3和SMTP服务器地址
  • http://blog.51cto.com/sopace/1422520
  • 各类邮箱服务器地址

    万次阅读 2018-07-20 19:43:29
    各类邮箱服务器地址 一般地,邮箱 POP3 服务器(端口110) SMTP 服务器(端口25)。 163免费邮箱 126免费邮箱 网易其他邮箱 sina邮箱 搜狐邮箱 雅虎邮箱 Gmail邮箱 其他邮箱 一般地 邮箱 POP3 服务器(端口...
  • 数据库服务器一般都装有数据库如oracle,mssql,mysql等,如:oracle的linux服务器, 应用服务器是你的应用得服务器,提供应用服务,如你的j2ee中间件:基于jboss,weblogic等的应用,也可以是自己的网络应用服务器...
  • Linux设置代理服务器

    万次阅读 2018-08-30 10:03:29
    Windows搭建代理服务器 参考百度文档 Linux设置全局代理 打开/etc/skel/.bash_profile添加 http_proxy=http://192.168.5.100:8080 https_proxy=http://192.168.5.100:8080 export http_proxy https_proxy 执行...
  • 各类邮箱服务器

    万次阅读 2012-11-15 16:53:51
    另:欢迎各位加群:206981178,共同学习交流 网易126免费邮 接收服务器:pop3.126.com 110  发送服务器:smtp.126.com 25 网易163免费邮  接收服务器:pop.163.com 110 ... 发送服务器:smtp.gma...
1 2 3 4 5 ... 20
收藏数 2,444,983
精华内容 977,993
关键字:

http服务器