一次完整的浏览器请求响应过程

来源:互联网 发布:centos下安装jdk1.8 编辑:程序博客网 时间:2024/06/16 12:22

  • 写在前面
  • 域名解析获取IP地址
  • 建立TCP连接浏览器发送html请求
    • 建立TCP连接
      • socket
        • socket建立连接
    • 请求报文
      • 请求行
      • 请求头部
      • 空行
      • 请求数据
  • 服务器web相应发回html响应
    • 响应报文
      • 状态行
      • 响应头部
      • 空行
      • 响应数据
  • 释放TCP连接浏览器解析html渲染呈现页面
  • 参考文献

写在前面

本篇博客旨在理解在浏览器中输入url地址后,浏览器和服务器之间都干了些什么。
整个流程如下:

  1. 域名解析,获取IP地址
  2. 建立TCP连接,浏览器发送html请求
  3. 服务器web相应,发回html响应
  4. 释放TCP连接,浏览器解析html,渲染呈现页面

域名解析,获取IP地址

这里写图片描述
输入网址后,浏览器会根据域名获取IP地址怎么获取IP地址呢?
浏览器要首先获取DNS那什么是DNS呢?
DNS(Domain Name System)即网络名称系统,它是一个将域名和IP地址相互映射的分布式数据库。简单地说,DNS就是一种域名和IP地址查对表,通过搜寻DNS法则,获得当前域名对应的IP地址,反之亦然。
浏览器查询DNS缓存的方式采用递进式查找,即
浏览器缓存–>系统缓存–>路由器缓存–>ISP DNS缓存

建立TCP连接,浏览器发送html请求

浏览器通过DNS查找到url对应的ip地址之后,通过握手协议与服务器建立TCP连接,随后向服务器发送http请求。

建立TCP连接

socket

socket是对TCP/IP协议的封装,本身不是一个协议,而是一个调用接口(API),是对TCP/IP协议的抽象,提供了方便的基本函数接口。

socket建立连接

建立socket连接至少需要一对*套接字,其中一个运行在客户端,称为ClientSocket。另一个运行在服务器端,称为ServerSocket
套接字连接过程如下:
1. 服务器监听:服务器端处于实时监控状态,等待客户端连接请求。
2. 客户端请求:客户端套接字提出连接请求,提供要连接的服务器套接字的地址和端口号。
3. 连接确认:当服务器监听到客户端请求后,就建立一个新的线程,把服务器端套接字的描述发送给客户端,等待客户端确认。建立连接后,服务器继续保持监听状态,等待接受其他客户端套接字请求。

请求报文

一个http请求报文由请求行< request-line >、请求头部< headers >、空行< blank-line >、请求数据< request-body >4个部分组成。下图是请求报文的一般格式。
HTTP请求报文

请求行

请求行由请求方法字段URL字段HTTP协议版本三个字段组成,用空格分开。例如

GET /index.html HTTP/1.1#常见的请求方法除了GET还有POST,两者区别是前者将数据存放在url中并以?间隔,后者将数据封装在HTTP请求数据中,以名称/值的形式出现。

请求头部

请求头部通知服务器有关客户端请求的信息,由关键字/值对组成,每行一对,关键字和值之间用分隔。

空行

最后一个请求头部之后需要一个空行,发送回车符和换行符,通知服务器以下不再有请求头部。

请求数据

请求数据不用于GET方法 ,而用于POST方法中。

服务器web相应,发回html响应

响应报文

一个http响应报文由状态行< status-line >、响应头部< headers >、空行< blank-line >和响应数据< response-body >4个部分组成,响应报文的一般格式如下图:
这里写图片描述

状态行

状态行由HTTP协议版本、服务器返回的响应状态码以及对应的文本描述组成。
状态码由三位数字组成,第一位定义了响应的类别。
1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。
2xx:成功状态码,表示服务器已成功接收到请求并进行处理。
3xx:重定向状态码,表示服务器要求客户端重定向。
4xx:客户端错误状态码,表示客户端的请求有非法内容。
5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。

响应头部

语法规则与请求头部相同,略。

空行

响应数据

服务器返回给客户端的文本信息。

释放TCP连接,浏览器解析html,渲染呈现页面

略。

参考文献

网页响应流程浅析
socket浅析

原创粉丝点击