一次HTTP请求的过程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/m0_37978143/article/details/102478133

一次HTTP请求的大致流程:

1、用户访问一个域名,比如www.baidu.com

2、计算机会优先在本地域名服务器中查询该域名对应的IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到这个IP地址并把它缓存到本地,供下次查询使用。本地的DNS解析,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置。

DNS解析

3、IP地址是一台计算机的唯一标识,拿到域名对应的IP地址之后,我们相当于就找到了我们运行代码的web服务器了,找到服务器还不够,想访问到服务器应用层的程序,还要先认识一下,通过User-Agent(一般都是浏览器)发起TCP的3次握手(A:你好,我是A,B:你好A,我是B,A:你好B,然后AB建立一段深厚的友谊)。

在这里插入图片描述

User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的80端口发起TCP的连接请求。这个连接请求到达服务器端后(这中间通过各种路由设备),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达服务器的80端口,建立了TCP/IP的连接。

备注:我看到一篇文章介绍的这一部分,超级好,这里放下链https://www.cnblogs.com/xuxinstyle/p/9382506.html 可能有人要问,为什么HTTP请求要建立TCP连接呢?目前在Internet中,所有的传输都是通过TCP/IP(TCP/IP 是一个协议族的统称,包括了IP协议,IMCP协议,TCP协议,UDP协议,HTTP协议、FTP协议等等)进行的,即网络层和传输层的报文通信必须遵守某一种协议,TCP是一个端到端的可靠的面向连接的协议,所以基于传输层TCP协议不用担心数据的传输的各种问题。TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP协议是应用层协议,主要解决如何包装数据。

在这里插入图片描述

4、手握好了,当然要开始交流了。浏览器在建立TCP连接后,会发起HTTP请求。发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)。

HTTP请求报文是由三部分组成:

请求行:请求方法 URI 协议/版本,在Internet应用中,最常用的方法是GET和POST

请求报头:Request Header,通知服务器有关于客户端请求的信息

请求正文:即请求数据,请求数据不在GET方法中使用,是在POST方法中使用的。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length

在这里插入图片描述

5、服务器端WEB程序接收到HTTP请求以后,就开始处理该请求,处理之后返回给浏览器一个响应报文。

HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。
状态码:
状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:

1xx:指示信息–表示请求已接收,继续处理。

2xx:成功–表示请求已被成功接收、理解、接受。

3xx:重定向–要完成请求必须进行更进一步的操作。

4xx:客户端错误–请求有语法错误或请求无法实现。

5xx:服务器端错误–服务器未能实现合法的请求。平时遇到比较常见的状态码有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500(分别表示什么请自行查找)。

响应报头
常见的响应报头字段有: Server, Connection…。
Server 使用的WEB服务器
Connection 使用keep-alive特性
Content-Encoding 使用gzip方式对资源压缩
Content-type MIME类型为html类型,字符集是 UTF-8
Date 响应的日期

响应报文
服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。

在这里插入图片描述

6、浏览器读取到响应的内容,即为拿到了html文件,解析渲染页面

7、连接结束

虽然看似上次说的很多,其实不管是dns解析,还是tcp握手,抑或是socket通信,php的代码执行,服务器的进程管理,每一点都可以用一大篇文章去细讲,感兴趣的人可以自行百度。

猜你喜欢

转载自blog.csdn.net/m0_37978143/article/details/102478133