HTTP请求流程

hhtp请求流程

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

http请求与响应的步骤如下:

  • URL解析、域名解析
    输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP。如果url里不包含端口号,则会使用协议的默认端口号。

    浏览器根据访问的域名找到其IP地址。DNS查找过程如下:

    1)浏览器缓存:浏览器会缓存DNS记录一段时间。 但操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。

    2)系统缓存:如果在浏览器缓存里没有找到需要的域名,浏览器会做一个系统调用(windows里是gethostbyname),这样便可获得系统缓存中的记录。

    3)路由器缓存:如果系统缓存也没找到需要的域名,则会向路由器发送查询请求,它一般会有自己的DNS缓存。

    4)ISP DNS缓存:如果依然没找到需要的域名,则最后要查的就是ISP缓存DNS的服务器。在这里一般都能找到相应的缓存记录。

  • 产生请求数据

    根据返回的IP和URL解析得到的参数,结合应用层的协议,确定发送的数据内容,将这些数据放到一个缓冲区内,然后形成了应用层的报文data。

    此时,将应用层的报文data发送到传输层。经过传输层处理,如报文打上了传输头的包头(主要包含端口号,以及tcp的各种信息),得到tcp的数据传送单位segment。

  • 建立网络连接并发送请求包

    拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024< 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。

    采用ip地址+协议+端口号唯一标示网络中的一个进程,利用socket进行通信。基于socket进行TCP三次握手,建立TCP连接。然后浏览器发起了http的请求。

    将传输层的数据段送到网络层,在网络层被打包,这样封装上了网络层的包头,包头内部含有源及目的的ip地址,该层数据发送单位被称为packet。网络层开始负责将这样的数据包在网络上传输,如何穿过路由器,最终到达目的地址。

  • 返回响应数据

  • 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)

  • 浏览器对页面进行渲染呈现给用户

  • 断开网络连接

    若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

HTTP请求格式和返回格式

  • 请求格式

    HTTP请求格式主要有四部分组成,分别是:请求行、请求头、空行、消息体,每部分内容占一行

    1
    2
    3
    4
    5
    6
    <request-line>
    <general-headers>
    <request-headers>
    <entity-headers>
    <empty-line> // (用于分割请求头和消息体)
    [<message-body>]
    • 请求行中包含的请求方法:

      1
      2
      3
      4
      5
      GET: 完整请求一个资源 (常用)
      HEAD: 仅请求响应首部
      POST:提交表单 (常用)
      PUT: 上传
      DELETE:删除
  • 响应格式

    为了告知浏览器,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开

    HTTP响应格式
    服务器接收处理完请求后返回一个HTTP相应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。

    1
    2
    3
    4
    5
    6
    <status-line>
    <general-headers>
    <response-headers>
    <entity-headers>
    <empty-line>
    [<message-body>]
常用的HTTP头信息有([一个http请求的详细过程](https://www.jianshu.com/p/aa97810e5fa4)):

① 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体信息的长度(字节)。

Socket

WEB Server都是基于Socket编程,又称之为网络编程,网络协议通过一个叫做socket的对象抽象出来,socket可以建立网络连接,读数据,写数据。socket模块定义了一些常量参数,用来指定socket的的地址族、socket的类型、以及支持的TCP/IP协议。

利用ip地址+协议+端口号唯一标示网络中的进程,然后利用socket进行通信。

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

通常传输层的服务通过系统调用的方式提供,以socket的方式。对于客户端,要想建立一个socket连接,需要调用这样一些函数socket() bind() connect(),然后就可以通过send()进行数据发送。

参考:

  1. 一次完整的HTTP请求过程
  2. 一个http请求的详细过程
  3. TCP与SOCKET的三次握手的对应关系
  4. 三次握手 四次握手 与socket函数的关系
  5. http请求与响应全过程
  6. 写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket