一个HTTP请求的一生

目录

HTTP简介

HTTP传输流程

一、地址解析              

域名解析:

二、封装HTTP数据包

三、封装TCP包

四、浏览器与服务建立连接

TCP/IP的三次握手

五、发起HTTP请求

  HTTP请求报文结构:

六、服务器响应

服务器反向代理

内部服务器

HTTP响应报文结构:

七、服务器关闭TCP连接

TCP四次挥手

八、浏览器解析报文,渲染页面


以从浏览器请求服务器再到返回响应,一个HTTP请求这短暂的一生都都经历了什么呢?

HTTP简介

        HTTP协议是一种在两点之间的一种超文本(视频、音频、图片文字)传输的约定和规范。HTTP协议是基于TCP/IP协议来传输数据的,IP协议实现寻址和路由,TCP协议实现可靠数据传输,DNS协议实现域名查找,SSL/TLS协议实现安全通信从浏览器请求开始,到服务器响应返回数据。

        HTTP遵循请求(Request)/应答(Response)模型,客户端向服务器发送请求,服务器处理请求并返回应答。

  

HTTP传输流程

一、地址解析              

        浏览器根据URL中进行解析,解析出协议名、主机名、端口、对象路径。

域名解析:

       通过DNS解析域名查询IP地址。DNS协议从操作系统、本地DNS、根DNS、顶级DNS、权威DNS逐步往上解析域名,解析的流程中一般都有缓存,不用每次都从最顶端查找。

二、封装HTTP数据包

        客户端将解析协议名、主机名、端口、对象路径并结合本机自身的信息封装成一个HTTP包。

三、封装TCP包

        客户端将HTTP请求数据包进一步封装成TCP数据包。

        

四、浏览器与服务建立连接

TCP/IP的三次握手

        整个流程总第概括为:请求->应答->应答之应答

        一开始,客户端和服务端都处于CLOSED状态。先是服务端主动监听某个端口,处于LISTEN状态。

        第一次握手:客户端主动发起连接SYN,进入SYN_SENT状态。并给服务器发送SYN报文,请求与服务器建立连接。客户端发送网络包,服务端收到了,服务端就知道客户端的发送能力、服务端的接受能力正常。

        第二次握手:服务端收到SYN报文后,返回SYN并ACK客户端的SYN,进入SYN_RCVD状态。用来通知客户端服务器已经收到SYN消息并通过确认。服务端发送网络包,客户端收到了,客户端就知道服务端的接受、发送能力,客户端的接收发送能力正常,但是,服务器还不能确认客户端的接受能力是否正常。

        第三次握手:客户端给服务端发送的SYN和ACK后,发送ACK的ACK,之后处于ESTABLISHED状态。服务端收到ACK的ACK后,之后也处于ESTABLISHED状态。客户端发送网络包,服务器端到了,服务端得出结论,客户端的接收、发送能力正常,服务端自己的发送、接收能力也正常。

五、发起HTTP请求

        客户端向服务器发送报文。

  HTTP请求报文结构:

        一个请求行(request line)、请求头部(header)、空行、请求数据

 

六、服务器响应

        实际上,在浏览器和处理请求的服务器之间有更多的计算器:路由器、调制解调器等。由于Web的分层设计,这些都隐藏在网络和传输层。HTTP位于应用层之上,底层大多与HTTP描述无关。

服务器反向代理

         在实际的应用中,一般都会请求到代理服务器上,再将请求转发给内部服务器,再将从内部服务器得到的结果返回到浏览器。

        代理的功能:缓存、过滤、负载均衡、身份验证、日志记录。       

        

内部服务器

        服务器上运行着多个进程,请求是如何到达Web服务器的呢?

        Web服务器会占用网络端口并监听这些端口,有个进程能监听多个端口,但一个端口不能被多个进程使用。

        Web服务器一直监听传入的请求并响应,根据对应的端口找到到正确的进程的。

         HTTP默认的端口是80,HTTPS是443。    

HTTP响应报文结构:

         状态行、响应头部、响应正文

        

 

        

七、服务器关闭TCP连接

TCP四次挥手

        TCP断开连接既可以是由客户端发起的,又可以是服务端发起的。

        第一次挥手、客户端应用进程调用断开连接的请求,向服务器端发送FIN,进入FIN-WAIT-1的状态。表示在客户端关闭链路前要发送的数据已经发送完毕,可以开始关闭链路操作,并请求服务器端确认关闭客户端到服务器的链路操作。

        第二次挥手、服务器收到这个FIN消息后,返回ACK的消息给客户端,表示收到客户端断开链路的请求了。这是,TCP服务端进程通知高层应用进程释放客户端到服务器的链路,服务器处于CLOSED-WAIT状态,即半关闭状态。客户端在收到消息后处于FIN-WAIT-2状态。

        第三次挥手、服务器在关闭链路前将需要发送给客户端的消息发送给客户端,等数据发送完后,发送FIN给客户端,表示关闭链路前服务器要发给客户端的消息已经发送完了,请求客户端确认关闭从服务器到客户端的链路操作。此时服务器处于LAST-ACK状态,等待客户端最终断开链路。

        第四次挥手、客户端收到服务器发的FIN后,发回ACK确认,表示收到了服务器发送的断开链接请求,并准备断开服务器端到客户端的链接。此时,客户端处于TIM-WAIT状态,TCP连接还没释放,经过等待计时器(2MSL)设置的超时时间后,客户端进入CLOSE。

        

八、浏览器解析报文,渲染页面

参考文章:

An overview of HTTP - HTTP | MDN

https://betterprogramming.pub/understand-the-flow-of-a-http-request-1a268ec193f0

第11讲 | TCP协议(上):因性恶而复杂,先恶后善反轻松-极客时间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要发起一个HTTP请求,你可以使用各种编程语言和框架来实现。以下是一个一般的步骤: 1. 选择合适的编程语言和框架:根据你的需求和技术栈,选择适合的编程语言和框架,如Python的requests库、JavaScript的axios库等。 2. 创建HTTP请求对象:根据具体的编程语言和框架,创建一个HTTP请求对象。这个对象通常包括请求方法(GET、POST等)、URL、请求头、请求体等信息。 3. 配置请求参数:根据需要,设置请求的参数,如请求头(headers)、查询参数(query parameters)、请求体(request body)等。 4. 发送请求:调用适当的方法或函数来发送HTTP请求,将请求对象作为参数传递给这个方法。这个方法会负责将请求发送到指定的URL,并等待服务器的响应。 5. 处理响应:一旦服务器返回响应,你可以获取响应状态码、响应头和响应体等信息。根据需要,对响应进行处理,如解析响应体、处理错误等。 下面是一个使用Python的requests库发送GET请求的示例: ```python import requests # 发起GET请求 response = requests.get('https://api.example.com/data', params={'param1': 'value1'}) # 获取响应状态码 status_code = response.status_code # 获取响应头 headers = response.headers # 获取响应体 content = response.text # 处理响应数据... ``` 注意:实际的代码会根据编程语言和框架的不同而有所不同,上述示例仅供参考。在实际开发中,你可能还需要处理异常、设置认证信息、处理重定向等其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值