通过网上资料参考结合个人理解,这里对HTTP生命周期进行一个较为全面的介绍,也进一步加深自己的理解吧。

首先还是介绍一下计算机网络模型以及每层对应的设备和协议,如图其中TCP/IP五层模型结合了OSI参考模型和四层模型的优点,在网络模型中使用最广泛。在这里顺便复习一下TCP的三次握手和四次挥手。

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的全双工的传输层通信协议。Java中通过socket(套接字:IP地址+端口号)编程来建立TCP连接。

TCP三次握手:在建立TCP连接的时候,客户端和服务端需要总共发送三个数据包来确认连接的建立,在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:

第一次握手:Client将标志位SYN置为1,随机产生一个值seq=n,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=n+1,随机产生一个值seq=k,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:Client收到确认后,检查ack是否为n+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=k+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,连接建立。

TCP四次挥手:在断开一个TCP连接时,需要客户端和服务端总共发送4个数据包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如图所示:

第一次挥手:Client发送一个FIN和seq=u,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ack=u+1给Client,Server进入CLOSE_WAIT状态。

第三次挥手:Server发送一个FIN和seq=w,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ack=w+1给Server,Server进入CLOSED状态,完成四次挥手。

接下来开始介绍HTTP请求的生命周期,从发起到如何被处理,以及摧毁的过程。

1.客户端(如浏览器)与web服务器建立连接

1.1键入域名,如www.baidu.com,浏览器通过DNS解析出对应的IP

1.2根据解析出的IP和web服务器端口(默认是80),建立TCP连接(三次握手)。

2.发送HTTP请求

2.1 一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。如图所示

2.2   请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。

2.2.1请求方法:这里主要介绍get和post

get:当客户端要读取服务端的文档,点击网页上的链接或者在地址栏输入网址时,默认都是使用get方法。通过get传递的数据直接放在地址中,所以get方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开,显然这种方式不适合传送私密数据。 此外,get在url中传送的参数是有限制的,对参数的数据类型,get只接受ASCII字符。

post:post方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,post对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。POST方式大多用于页面的表单中。此外,post对参数的数据类型没有限制。

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

组成:<协议>://<主机>:<端口>/<路径>       格式如图:

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

2.3 请求头部,组成和对应内容如图:

2.4 请求数据:post方法适用,get方法的请求数据直接放在URL中。

3.服务器接受请求并返回HTTP响应

HTTP响应报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成,这里不再介绍各部分细节,有兴趣可自行百度。

4.释放TCP连接

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

5.客户端渲染解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

6.HTTP协议的其他补充

6.1基于请求——响应模式

HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,先有客户端发起请求,再有服务器端发送响应,在没有接收到请求之前服务器端不会发送响应。

6.2 无状态保存

HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。换而言之,HTTP协议对于发送过的请求或响应都不做持久化存储处理。

6.3 无连接

无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,提高并发性能,不能和每个用户建立长久的连接,请求一次响应一次。但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,如果用户在这几秒钟之内有新的请求,那么还是通过之前建立的连接通道来收发消息,如果没有新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的。

7.例子(对HTTP请求完整流程的一个简单梳理,以浏览器访问百度首页为例)

(1) 浏览器获取输入的域名www.baidu.com 
(2) 浏览器向DNS请求解析www.baidu.com的IP地址 
(3) 域名系统DNS解析出百度服务器的IP地址 
(4) 浏览器与该服务器建立TCP连接(默认端口号80) 
(5) 浏览器发出HTTP请求,请求百度首页 
(6) 服务器通过HTTP响应把首页文件发送给浏览器 
(7) TCP连接释放 
(8) 浏览器将首页文件进行解析,并将Web页显示给用户。

相关协议:

(1) 应用层:HTTP(WWW访问协议),DNS(域名解析服务) DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话,然后通过运输层TCP协议封装数据包,在TCP协议基础上进行传输。

(2) 传输层:TCP(为HTTP提供可靠的数据传输),HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作。

(3)网络层:IP(IP数据数据包传输和路由选择), 为数据包选择路由,IP协议进行主要工作。

(4)数据链路层:ICMP(提供网络传输过程中的差错检测),ARP(将本机的默认网关IP地址映射成物理MAC地址) 相邻结点的可靠传输,ARP协议将IP地址转成MAC地址

8.参考资料

https://www.cnblogs.com/an-wen/p/11180076.html

https://www.cnblogs.com/zgq123456/articles/10361395.html

HTTP请求生命周期相关推荐

  1. [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)

    不使用特殊方法来处理请求生命周期事件 HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件.那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢, ...

  2. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    阅读目录 一.Django请求生命周期: 二.WEB开发模式: 三.cbv源码分析: 四.认识RESTful 补充知识:跨域 五.基于原生django开发restful的接口 六.drf安装.使用.A ...

  3. Django05: 请求生命周期流程图/路由层

    请求生命周期流程图 扩展知识: 缓存数据库 路由层 路由匹配 url(r'^test/', views.test), 1. 第一个参数是正则匹配. 只要第一个匹配了,就不会执行下面. 输入url会默认 ...

  4. [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)

    使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest.举 ...

  5. [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)

    ASP.NET 请求生命周期 全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架.ASP.NET 框架会创建一个定义在 Global.asax 文件中 ...

  6. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post ...

  7. python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post ...

  8. php 追查框架生命周期,thinkPHP5.0框架应用请求生命周期分析

    本文实例讲述了thinkPHP5.0框架应用请求生命周期.分享给大家供大家参考,具体如下: 本篇内容我们对ThinkPHP5.0的应用请求的生命周期做大致的介绍,以便于开发者了解整个执行流程. 1.入 ...

  9. Day083 web请求生命周期分析

    一.web请求生命周期分析 1.概述 ​ web请求是基于http协议的,而http协议是基于请求/响应的模式,即一个请求对应一个响应,那么一个web请求(或者说http请求)的生命周期就是指从发起一 ...

最新文章

  1. IO口多路查理复用:三个单片机IO口控制六个LED
  2. C#程序输出信息到调试窗口的几种方式
  3. struct 数组
  4. 8086汇编学习小记-王爽汇编语言实验12
  5. android之Fragment(官网资料翻译)二
  6. 「starter推荐」简单高效 Excel 导出工具
  7. go语言中goroutine池
  8. 如何理解 C# 中的 System.Void 类型?
  9. css 图片换行_好程序员web前端学习路线分享CSS浮动-文档流篇
  10. C++读写注册表的问题
  11. 【报告分享】2022中国人工智能人才培养报告.pdf(附下载链接)
  12. c语言使用位运算符包含头文件,C语言的运算符
  13. php mysql 模型_ThinkPHP数据库与模型
  14. 树莓派计算机视觉环境搭建
  15. PADS 去除走线折角处提示和过孔提示
  16. 电脑声卡维修经验和实例完全分析
  17. aspcms用mysql_关于ASPCMS标签调用的一些总结
  18. 微信CRM六大模块详解
  19. Scratch3.0----数据类型
  20. Fe原子辐照轰击多层石墨烯模拟代码

热门文章

  1. jqdatasdk用pyechart画图生成网页并保存到本地
  2. nvidia-docker2完成tensorflow/serving深度学习模型在线部署
  3. 【Axure高保真原型】画图画板
  4. 云 文件 服务器 文件怎么恢复出厂设置密码,云服务器数据怎么恢复出厂设置密码...
  5. 2021山东省大学生网络技术大赛网络安全赛道决赛WP
  6. 基于Unity编辑器开发技能编辑器(三)
  7. “降频门”终结篇 你真的会因为续航给手机降频吗?
  8. MapReduce-案例共同好友分析
  9. 显现eclipse编辑器的任务栏
  10. 龙迅LT86102UX产品概述,提供技术支持