Web服务的请求方式

要想真正的学习到一些关于web的东西  我们就首先要知道web服务的http具体的请求过程 ,那么一次完整的请求过程是怎么做到了呢,下面进行一下简单的介绍:

1、拓扑图:

 

2、文字描述:

  首先了解一次完整的HTTP请求到响应的过程需要的步骤

域名解析 
发起TCP的3次握手 
建立TCP连接后发起http请求 
服务器端响应http请求,浏览器得到html代码 
浏览器解析html代码,并请求html代码中的资源 
浏览器对页面进行渲染呈现给用户

 2.1 域名解析

什么是域名解析?
    域名解析就是将网站的链接地址(网址)转换成IP地址,www.baidu.com转换成220.181.112.244

实现域名解析的方式:
    常见的就是本地的hosts文件
    DNS域名解析

 2.2 发起TCP的3次握手

什么是TCP的3次握手?
    TCP的3次握手是客户端与服务端建立连接的必经之路,整个过程的实现是:
    1、建立连接时,客户端首先会发出一个SYN的消息,并进入SYN_SENT状态,等待服务器确认(SYN消息是同步序列编号)
    2、服务器收到客户端的SYN消息,必须确认这个SYN消息,并且自己也会发送一个SYN的消息即SYN+ACK包,此时服务器进入SYN_RECV状态
    3、客户端收到服务器的SYN+ACK的消息,向服务器发送确认ACK消息,此消息发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手

  

 

   2.3 建立连接

所谓的建立连接就是发起HTTP请求(HTTP Request)
一段话来简述建立连接的整个过程:
    拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序(本文就以Nginx为例),最终建立了TCP/IP的连接。

这里涉及到端口的问题,我就对此做个简单的描述吧:
1-1024:众所周知端口,永久分配给固定的应用程序使用,属于特权端口,只有root有权使用
1024-4195:注册端口,要求略宽松,分配给某程序注册使用
41952-65535:客户端程序使用的随机端口,动态端口,又叫私有端口或随机端口

所谓的HTTP请求,也就是Web客户端向Web服务器发送信息,这个信息由如下三部分组成:
1、请求头
     HTTP头在HTTP请求可以是3种HTTP头:1. 请求头(request header)  2. 普通头(general header)  3. 实体头(entity header)
    通常来说,由于Get请求往往不包含内容实体,因此也不会有实体头。

2、请求行
    例如:GET www.baidu.com HTTP/1.1
    请求行写法是固定的,由三部分组成,
    第一部分是请求方法:
    除了常见的只有Get和Post方法,实际上HTTP请求方法还有很多,比如: PUT方法,DELETE方法,HEAD方法,CONNECT方法,TRACE方法
    第二部分是请求网址:www.baidu.com
    第三部分是HTTP版本:HTTP/1.1

3、请求内容
    只在POST请求中存在,因为GET请求并不包含任何实体

   2.4 服务器响应

所谓的服务器响应就是服务器端HTTP响应(HTTP Response)请求
当Web服务器收到HTTP请求后,会根据请求的信息做某些处理(这些处理可能仅仅是静态的返回页,或是包含Asp.net, PHP, Jsp等语言进行处理后返回),相应的返回一个HTTP响应。HTTP响应在结构上很类似于HTTP请求,也是由三部分组成:

1、响应头:
    HTTP响应中包含的头包括:1. 响应头(response header) 2. 普通头(general header) 3. 实体头(entity header)。

2、响应行:
    例如:HTTP/1.1 200 OK
    第一部分是HTTP版本:HTTP/1.1
    第二部分是响应状态码:200
    第三部分是状态码的描述:OK
        信息类 (100-199)
        响应成功 (200-299)
        重定向类 (300-399)
        客户端错误类 (400-499)
        服务端错误类 (500-599)

3、响应的内容
    HTTP响应内容就是HTTP请求所请求的信息。这个信息可以是一个HTML,也可以是一个图片。响应的数据格式通过Content-Type字段来获得:Content-Type:image/png;或者我们熟悉的Content-Type:text/html

我们常见的Content-Type字段的值有:
    text/plain
    text/html
    text/css
    image/jpeg
    image/png
    image/svg+xml
    audio/mp4
    video/mp4
    application/javascript
    application/pdf
    application/zip
    application/atom+xml
这些都是响应内容的部分

   2.5 解析html代码,请求html资源

   2.6 返回数据

3、模拟请求过程并进行分析:

  我们使用Linux中的curl来进行模拟get的请求过程,进一步直观的做下分析:

[root@BrianZhu Xuexiao]# curl -v "http://www.baidu.com"     # 执行的命令
* About to connect() to www.baidu.com port 80 (#0)
*   Trying 61.135.169.125...
* Connected to www.baidu.com (61.135.169.125) port 80 (#0)
> GET / HTTP/1.1                          # 使用GET方法请求服务器端的主页
> User-Agent: curl/7.29.0                                  # 请求方式
> Host: www.baidu.com                                      # 请求地址
> Accept: */*
> 
< HTTP/1.1 200 OK                                          # 响应行(包括了HTTP的版本、状态码、状态的描述)
< Server: bfe/1.0.8.18
< Date: Thu, 15 Mar 2018 03:59:24 GMT             # 回应报文的其它字段
< Content-Type: text/html                     # 响应的Content-Type值
< Content-Length: 2381
< Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT
< Connection: Keep-Alive
< ETag: "588604c4-94d"
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Pragma: no-cache
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
< Accept-Ranges: bytes
< 
<!DOCTYPE html>                                            # 响应的内容(具体的html代码)
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a>  <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号  <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

  

4、其实HTTP的连接有两种方式:

(1)短连接:非保持连接

(2)长连接:保持连接(持久连接)

    数量限制:多少个资源

    时间限制:最长可以保持长连接多长时间

短连接就不用过多的解释了
持久连接就是:
    有时候我们获取一个HTML页面,在对浏览器对HTML解析的过程中,如果发现额外的URL需要获取的内容,会再次发起HTTP请求去服务器获取,比如样式文件,图片。许多个HTTP请求,只依靠一个TCP连接就够了,这就是所谓的持久连接。也是所谓的一次HTTP请求完成。

  

posted @ 2018-03-15 12:16  Brian_Zhu  阅读(1215)  评论(0编辑  收藏  举报