草庐IT

HTTP协议工作流程

qq_53667037 2024-03-12 原文

概述

        HTTP协议是超文本传输协议,用于万维网服务器与本地浏览器之间传输超文本的传输协议。

        HTTP是一个属于应用层的协议,基于浏览器-服务端架构工作,浏览器作为HTTP客户端通过

        URL向HTTP服务端作为即Web服务器发送请求,Web服务器根据接收到的请求后,向客户端

        发送响应信息。

HTTP协议通信过程

        HTTP是应用程协议,它是以TCP作为底层协议,默认端口号为80.通信过程:

        1.服务端在80端口等待客户的请求。

        2.浏览器发起到服务器的TCP连接

        3.服务器接收来自浏览器的TCP连接

        4.浏览器与Web服务器交换HTTP消息

        5.关闭TCP连接

统一资源定位器(URL)

        HTTP协议使用URL来定位资源。

        格式:http://host[ ":"port][abs_path]

 HTTP报文

        请求报文

                当客户端请求一个URL时,会发送一个请求报文给目标服务器,服务器会根据请求信息

                进行处理

                请求报文结构:

                         第一行:包含请求方法,URL,协议版本;

                          之后多行为请求首部,每个首部都是一对K:V键值

                          一个空行来分割首部和内容主体

                          最后是请求内容

        响应报文

                服务器处理完请求后,会处理结果放入响应报文返回客户端。

                响应报文结构

                        第一行:协议版本号,状态码以及描述。

                        最后多行首部内容

                        一个空行来分割首部和内容主体

                        最后是响应内容

HTTP请求方法

        GET获取资源

                GET方法用于给顶的URL从指定的服务器中检索信息,即从指定资源请求数据。使用

                GET方法的请求应该只是检索数据,并且不会对数据产生其他影响。

        HEAD获取响应消息报头

                HEAD和GET方法类似,但是不返回相应内容主体部分,仅传输响应报头部分。 

        POST提交数据增加资源

                POST方法用于将数据发送到服务器以创建或更新资源。 

        PUT修改资源

                PUT方法用于来修改资源,要求在请求报文的主体中包含文件内容,然后保存到请求

                URL指定位置。使用PUT方法,如果两个请求相同,后一个请求会把第一个请求覆盖掉 

        DELETE删除资源

                DELETE方法用于来删除指定的资源。 

        OPTIONS查询支持的方法

                OPTIONS查询指定的URL能够支持的方法。 

        GET和POST的区别 

                GET和POST本质上都是通过TCP进行通信。

                GET使用URL传递请求参数,POST使用请求体提交数据 

                GET是幂等且可缓存,POST非幂等且不可缓存 

HTTP状态码

状态码类别含义
1XX信息性状态码(informational)接收的请求正在处理
2XX成功状态码(Success)请求正常处理完毕
3XX重定向状态码(Redirection)需要进行附加操作以完成请求
4XX客户端错误状态码(Client Error)服务器无法处理请求
5XX服务器错误状态码(Server Error)服务其处理请求出错

连接管理

        短连接

                每次HTTP通信,都需要建立一个独立的TCP连接,HTTP1.0默认使用短连接 

        长连接

                只需要建立一次TCP连接就能进行多次HTTP通信。HTTP1.1默认使用长连接,会在响应

                头加上Connection:keep-alive 

        管线化连接

                 将多个HTTP请求整批提交的技术,在传送过程中不需要先等待服务端的回应。

HTTPS 

        HTTP有以下安全问题:

                使用明文进行通信,内容可能会被窃听;

                不验证通信方的身份,通信方的身份有可能遭遇伪装;

                无法证明报文的完整性,报文有可能遭篡改。

        HTTPS并不是新的协议,而是让HTTP先和SSL通信,通过SSL,HTTPS具有了加密,认证

        和完整性保护

加密方式

          非对称算法:RSA、DSA

              非对称加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为公钥和私钥

              它们两个必须配对使用,否则不能够解密。

        对称性加密算法:AES、DES

                对称性加密算法就是加密方和解密方使用相同的密钥进行加密和解密。数据发送方通过  

                密钥对数据进行加密生成密文,发送给接送方,

                接收方收到密文数据后,通过密钥解密,将其恢复成明文数据。

HTTPS的工作原理

        1.浏览器请求https网站,服务器收到请求,选择浏览器支持的加密和hash算法,同时返回数

        字证书给浏览器,包含颁发机构、网址、公钥、证书有效期等信息。

        2.浏览器对证书进行校验,有问题则提示警告,否则就生成水机密钥,同时使用公钥加密发送

        给服务器

        3.服务器接收后,通过公钥解密,使用随机密钥对发送信息加密,发送浏览器。

        4.浏览器使用随机密钥解密,得到最终的页面内容。

        

 

       

 

有关HTTP协议工作流程的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  5. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  6. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  7. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  8. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. ruby - `rescue $!` 是如何工作的? - 2

    我知道全局变量$!包含最新的异常对象,但我对下面的语法感到困惑。谁能帮助我理解以下语法?rescue$! 最佳答案 此构造可防止异常停止您的程序并使堆栈跟踪冒泡。它还会将该异常作为值返回,这很有用。a=get_me_datarescue$!在此行之后,a将保存请求的数据或异常。然后您可以分析该异常并采取相应措施。defget_me_dataraise'Nodataforyou'enda=get_me_datarescue$!puts"Executioncarrieson"pa#>>Executioncarrieson#>>#更现实的

随机推荐