一次完整的HTTP请求发生了什么?

当我们在浏览器的地址栏输入 www.baidu.com,然后回车,回车这一瞬间到看到页面这一过程到底发生了什么呢?我们看一下下图:
在这里插入图片描述
关于HTTP协议可以参考以下:
HTTP协议漫谈 http://kb.cnblogs.com/page/140611/
HTTP协议概览 http://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html
了解HTTP Headers的方方面面 http://kb.cnblogs.com/page/55442/

1. 域名解析

首先浏览器会解析域名(准确的叫法应该是主机名)得到对应的IP地址,那怎么解析到对应的IP地址?
① 浏览器会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有该域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束;
② 如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束;
③ 如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功;
④ 如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器(一般是电信运营商提供的,也可以使用像Google提供的DNS服务器)发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求,它首先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),然后进一步请求;
正常情况下通过这四步基本就能解析域名获得IP了;

2. 发起TCP3次握手

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

为什么HTTP协议要基于TCP来实现?

目前在Internet中所有的传输都是通过TCP/IP进行的,HTTP协议作为TCP/IP模型中应用层的协议也不例外,TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。

3. 建立TCP连接后发起HTTP请求

进过TCP3次握手之后,浏览器发起了http的请求

HTTP请求报文格式(HTTP请求报文由3部分组成(请求行+请求头+请求体))

在这里插入图片描述

请求行:

①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
③是协议名称及版本号。

请求头:

④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
与缓存相关的规则信息,均包含在header中

请求体:

⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html?param1=value1&param2=value2”的方式传递请求参数。

什么是URL、URI、URN?

URI :Uniform Resource Identifier 统一资源标识符
URL:Uniform Resource Locator 统一资源定位符
URN: Uniform Resource Name 统一资源名称
URL和URN 都属于 URI

4. 服务器端响应http请求,浏览器得到html代码

服务器端WEB程序接收到http请求以后,就开始处理该请求,处理之后就返回给浏览器html文件

一些常见状态码

1xx: 信息性状态码(100,101)
2xx: 成功状态码

3xx: 重定向状态码

状态码描述
301永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向
302临时重定向,显式重定向, Location响应首部的值为新的URL
304Not Modified 未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,告诉浏览器,你不用请求该资源,直接使用本地的资源即可

4xx: 客户端错误状态码

5xx: 服务器端错误状态码

状态码描述
500Internal Server Error 服务器内部错误
502Bad Gateway 前面代理服务器联系不到后端的服务器时出现
504Gateway Timeout 这个是代理能联系到后端的服务器,但是后端的服务器在规定的时间内没有给代理服务器响应

5. 浏览器解析html代码,并请求html代码中的资源

浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但是由于每个资源大小不一样,而浏览器又多线程请求请求资源,所以请求成功显示的顺序并不一定是代码里面的顺序。
浏览器在请求静态资源时(在未过期的情况下),向服务器端发起一个http请求(询问自从上一次修改时间到现在有没有对资源进行修改),如果服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。

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

浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,渲染之后呈现给用户。

自此一次完整的HTTP事务宣告完成.

<think>好的,用户问的是HTTP请求的三次握手和四次挥手。首先,我需要确定用户是否了解网络基础,比如TCP协议。因为三次握手和四次挥手其实是TCP建立和断开连接的过程,而HTTP是基于TCP的。用户可能混淆了这两个层次,所以得先说明清楚。 接下来,应该分步骤解释三次握手。要讲清楚每次握手的目的,比如同步序列号、确认连接等。可能需要用生活中的例子类比,比如打电话时的确认沟通,这样用户更容易理解。同时要指出为什么需要三次而不是两次,防止旧的重复连接造成混乱。 然后是四次挥手。这里的关键在于TCP是全双工的,所以每个方向都要单独关闭。需要解释为什么是四次而不是三次,比如一方发送FIN后,另一方可能还有数据要发送,所以先确认,等数据处理完再发送自己的FIN。用户可能会疑惑为什么断开比建立多一次,这里要强调双向独立关闭的概念。 还要注意用户可能的问题,比如为什么握手是三次而挥手是四次,是否存在三次挥手的情况,或者TIME_WAIT状态的作用。虽然用户没直接问,但提前准备这些点可以让回答更全面。 另外,用户提到的HTTP请求,可能需要简要说明HTTP和TCP的关系,确保用户明白这是在传输层和应用层之间的协作。三次握手确保连接可靠,然后HTTP消息通过这个连接传输,最后四次挥手正确关闭连接。 最后,检查语言是否清晰,避免技术术语过多,使用中文表达,结构分明。可能需要用比喻或流程图辅助,但文本回答中需用文字描述清楚。确保每个步骤的逻辑正确,比如SYN、ACK的顺序,以及各个阶段的状态变化。</think>### HTTP请求的三次握手与四次挥手 **背景说明** HTTP协议本身并不直接涉及“三次握手”和“四次挥手”,这些过程实际发生在底层的TCP协议层。HTTP作为应用层协议,依赖TCP(传输层协议)建立可靠连接。以下是TCP连接管理的核心机制: --- ### 一、三次握手(建立连接) **目的**:确保客户端和服务器双方的发送和接收能力正常,并同步初始序列号(Sequence Number)。 1. **第一次握手(SYN)** - 客户端发送 `SYN=1` 标志的数据包,随机生成初始序列号 `seq=x`。 - **含义**:客户端提议建立连接,并告知自身初始序列号。 2. **第二次握手(SYN-ACK)** - 服务器返回 `SYN=1` 和 `ACK=1` 标志的数据包,生成序列号 `seq=y`,确认号 `ack=x+1`。 - **含义**:服务器同意连接,并告知自身初始序列号,同时确认客户端的序列号。 3. **第三次握手(ACK)** - 客户端发送 `ACK=1` 标志的数据包,确认号 `ack=y+1`,序列号 `seq=x+1`。 - **含义**:客户端确认服务器的序列号,双方完成同步。 **为什么需要三次?** 若只有两次握手,可能出现历史连接请求(因网络延迟重复发送的SYN包)被误认为是新连接,导致资源浪费。三次握手可唯一标识一个连接的建立。 --- ### 二、四次挥手(断开连接) **目的**:双方确认数据已传输完毕,安全关闭双向通信通道。 1. **第一次挥手(FIN)** - 主动关闭方(如客户端)发送 `FIN=1` 标志的数据包,序列号 `seq=u`。 - **含义**:客户端表示不再发送数据,但仍可接收数据。 2. **第二次挥手(ACK)** - 被动关闭方(如服务器)返回 `ACK=1`,确认号 `ack=u+1`,序列号 `seq=v`。 - **含义**:服务器确认客户端的关闭请求,但可能仍有数据未发送完毕。 3. **第三次挥手(FIN)** - 服务器发送 `FIN=1` 标志的数据包,序列号 `seq=w`(可能携带剩余数据)。 - **含义**:服务器数据发送完毕,正式发起关闭请求。 4. **第四次挥手(ACK)** - 客户端返回 `ACK=1`,确认号 `ack=w+1`,序列号 `seq=u+1`。 - **含义**:客户端确认服务器的关闭请求,连接彻底终止。 **为什么需要四次?** TCP是全双工协议,双方需独立关闭各自的发送通道。第二次和第三次挥手之间可能存在时间差(等待未发送完的数据)。 --- ### 三、关键问题解答 1. **TIME_WAIT状态的作用** - 主动关闭方在第四次挥手后进入 `TIME_WAIT` 状态(等待2MSL时间),确保对方收到最终确认,并允许网络中残留的旧数据包消失。 2. **异常情况处理** - 若挥手过程中某一方未收到ACK,会触发超时重传机制,最终强制关闭连接。 --- ### 总结 - **三次握手**:确保双方收发能力正常,避免历史连接干扰。 - **四次挥手**:保证双向通道独立关闭,防止数据丢失。 - **HTTP请求**:基于已建立的TCP连接传输数据,结束后通过四次挥手释放资源。 通过这一机制,TCP协议为HTTP等应用层协议提供了可靠的传输基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值