| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 一个HTTP请求的一生 -> 正文阅读 |
|
[网络协议]一个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 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 4:27:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |