HTTP请求生命周期

本文详细介绍了HTTP协议的工作流程,包括TCP的三次握手和四次挥手,HTTP请求的生命周期,从客户端发起请求到服务器响应,再到连接释放。同时,文章还探讨了HTTP的无状态性和基于请求-响应的模式,以及在实际操作中的应用示例,如浏览器访问百度首页的过程。
摘要由CSDN通过智能技术生成

通过网上资料参考结合个人理解,这里对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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值