深入分析:浏览器中输入一个URL会发生什么事情呢?

1、URL解析

浏览器会解析URL,提取出协议(如HTTP、HTTPS)、域名、端口号、路径和查询参数等信息,URL 的格式:
协议类型://服务器地址[:端口号]/路径/文件名[参数=值]

2、DNS解析

2.1、浏览器缓存

DNS客户端,会在浏览器的DNS缓存中查询该域名对应的IP地址

2.2、本地 hosts 文件

如果浏览器缓存没有查到,会向本地hosts文件查询(在Linux中/etc/hosts,在Windows中C:\Windows\System32\drivers\etc\hosts)

2.3、本地 DNS 服务器

如果本地 hosts 中没有,DNS客户端会向本地DNS服务器发送域名查询请求,本地DNS服务器是运营商提供的服务,维护一个DNS缓存,以加速查询过程(这个过程是递归查询)。

2.4、根域名查询

如果本地 DNS 服务器也没有查到,会向根域名查询,根域名会将自己知道的顶级域名(如.com、.org、.net)服务器的IP地址,告诉本地DNS服务器,本地DNS服务器会一级一级的查询,直到有结果为止(这个过程是迭代查询)

2.5、递归和迭代查询

递归查询:客户端只向DNS服务器发出请求,DNS服务器会代理查询,查到结果后会告诉客户端

迭代查询:客户端向DNS服务器发出请求后,DNS服务器如果没有该域名的IP地址,会向根域名查询,根域名服务器会返回一个顶级域名的IP,DNS服务器再向顶级域名查询,这样一级一级的查询

2.6、DNS 使用 UDP 和 TCP
  • DNS通常使用UDP进行域名解析。UDP是一种无连接协议,更轻便,适用于快速的查询和响应。
  • 当DNS响应数据包的大小超过512字节时,UDP可能无法容纳这个响应。这样的情况下,DNS服务器可以选择使用TCP协议。
  • DNS服务器之间进行数据同步时,会使用TCP协议。这通常用于DNS服务器的复制和数据备份

3、建立TCP连接

查到了服务器的 IP 地址就可以和服务器通信了,通信之前需要建立连接,HTTP(80 端口) 和 HTTPS (443 端口) 是基于 TCP 的,所以要建立 TCP 连接:

  • 客户端向服务器发送SYN(同步)请求:客户端向目标服务器发送一个TCP包,其中包含一个SYN标志位,表示要建立连接。
  • 服务器响应SYN-ACK:如果目标服务器愿意接受连接,它会回复一个带有SYN和ACK标志位的TCP包,表示确认连接,并同意建立。
  • 客户端确认ACK:最后,客户端向服务器发送一个带有ACK标志位的TCP包,表示确认连接建立。

4、发送HTTP请求

一旦TCP连接建立,浏览器会发送HTTP请求给服务器。请求包括请求方法(GET、POST等)、请求头(包含一些附加信息如用户代理、Cookie等)和请求体(对于POST请求)。

HTTP协议报文

4.1 请求报文
请求行 POST /order/detail/123456 HTTP/1.1
请求头 Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: H=1687873000
Host: dandelioncloud.cn
User-Agent: Mozilla/5.0 Chrome/114.0.0.0 Safari/537.36
请求体 username=imli&password=123123
4.2 响应报文
响应状态 HTTP/1.1 200 OK
响应头部 Content-Encoding: gzip
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
Connection: keep-alive
响应数据 {"username": "axli","password": "DvGa","status": "true"}
4.3 HTTP 的方法
  • GET:用于从服务器获取数据。通常用于请求页面、图像、文档等资源。GET请求不应该具有副作用,不应更改服务器状态。
  • POST:用于向服务器提交数据,通常用于在服务器上创建新资源。POST请求可能具有副作用,例如创建新记录或更新数据。
  • PUT:用于更新服务器上的资源或创建新资源。PUT请求是幂等的,即多次执行相同的PUT请求会产生相同的结果。
  • DELETE:用于从服务器上删除资源。DELETE请求通常用于删除现有资源。DELETE请求也是幂等的。
  • PATCH:用于局部更新资源。PATCH请求只会修改资源的一部分,而不是整个资源。它允许客户端发送一些更改,以更新服务器上的资源。
  • HEAD:类似于GET请求,但不返回响应主体。通常用于检索资源的元数据,如响应头信息。
  • OPTIONS:用于获取关于资源的通信选项。OPTIONS请求告诉服务器客户端可以使用哪些方法,或者了解资源的通信选项。
  • CONNECT:保留用于将连接转发到代理,尽管这种使用已经很少见。
  • TRACE:用于执行一个针对服务器的远程诊断。TRACE请求用于追踪请求和响应之间的传输。
4.4 HTTP 请求头部
Header 解释 示例
Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html
Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5
Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip
Accept-Language 浏览器可接受的语言 Accept-Language: en,zh
Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
Authorization HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
Connection 客户端要求服务器使用「HTTP 长连接」机制,HTTP 长连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态,HTTP/1.1 版本的默认连接都是长连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为 Keep-Alive。 Connection: close
Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new;
Content-Length 请求的内容长度 Content-Length: 348
Content-Type 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
Expect 请求的特定的服务器行为 Expect: 100-continue
From 发出请求的用户的Email From: user@email.com
Host 指定请求的服务器的域名和端口号 Host: www.zcmhi.com
If-Match 只有请求内容与实体相匹配才有效 If-Match: "737060cd8c284d8af7ad3082f209582d"
If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: "737060cd8c284d8af7ad3082f209582d"
If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: "737060cd8c284d8af7ad3082f209582d"
If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards: 10
Pragma 用来包含实现特定的指令 Pragma: no-cache
Proxy-Authorization 连接到代理的授权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 只请求实体的一部分,指定范围 Range: bytes=500-999
Referer 先前网页的地址,当前请求网页紧随其后,即来路 Referer: http://www.zcmhi.com/archives/71.html
TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent 客户端的应用类型、操作系统、软件版本号,以便于服务器对不同的客户端做兼容 User-Agent: Mozilla/5.0 (Linux; X11)
Via 通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning
4.5 HTTP 的响应头
Header 解释 示例
Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes
Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Age: 12
Allow 对某网络资源的有效的请求行为,不允许则返回405 Allow: GET, HEAD
Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 Cache-Control: no-cache
Content-Encoding web服务器支持的返回内容压缩编码类型。 Content-Encoding: gzip
Content-Language 响应体的语言 Content-Language: en,zh
Content-Length 响应体的长度 Content-Length: 348
Content-Location 请求资源可替代的备用的另一地址 Content-Location: /index.htm
Content-MD5 返回资源的MD5校验值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 在整个返回体中本部分的字节位置 Content-Range: bytes 21010-47021/47022
Content-Type 返回内容的MIME类型 Content-Type: text/html; charset=utf-8
Date 原始服务器消息发出的时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
ETag 请求变量的实体标签的当前值 ETag: "737060cd8c284d8af7ad3082f209582d"
Expires 响应过期的日期和时间 Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified 请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 Location: http://www.quxuehao.com/chuzhong/
Pragma 包括实现特定的指令,它可应用到响应链上的任何接收方 Pragma: no-cache
Proxy-Authenticate 它指出认证方案和可应用到代理的该URL上的参数 Proxy-Authenticate: Basic
refresh 应用于重定向或一个新的资源被创造,在5秒之后重定向 Refresh: 5; url=http://www.quxuehao.com/it/http/
Retry-After 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 Retry-After: 120
Server web服务器软件名称 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Set-Cookie 设置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
Trailer 指出头域在分块传输编码的尾部存在 Trailer: Max-Forwards
Transfer-Encoding 文件传输编码 Transfer-Encoding:chunked
Vary 告诉下游代理是使用缓存响应还是从原始服务器请求 Vary: *
Via 告知代理客户端响应是通过哪里发送的 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 警告实体可能存在的问题 Warning: 199 Miscellaneous warning
WWW-Authenticate 表明客户端请求实体应该使用的授权方案 WWW-Authenticate: Basic

5、服务器响应

服务器接收到请求后,会进行相应的处理,并生成HTTP响应。响应包括响应状态码(表示请求的处理结果,如200表示成功、404表示未找到等)、响应头(包含一些元信息如响应类型、内容长度等)和响应体(实际的数据内容),常见状态码:

1xx - 信息

  • 100 Continue:客户端应该继续发送请求。
  • 101 Switching Protocols:服务器已经理解客户端的请求,并将切换到不同的协议。

2xx - 成功

  • 200 OK:请求成功,服务器已经成功处理请求。
  • 201 Created:请求已经被成功处理,并在服务器创建了新资源。
  • 204 No Content:请求已经成功处理,但没有返回任何响应主体。
  • 206 Partial Content:服务器已经成功处理了部分请求,通常用于分块传输。

3xx - 重定向

  • 301 Moved Permanently:请求的资源已经永久移动到新的URL。
  • 302 Found:请求的资源临时移动到新的URL。
  • 304 Not Modified:资源未被修改,客户端可以使用缓存的版本。

4xx - 客户端错误

  • 400 Bad Request:请求语法错误,服务器无法理解。
  • 401 Unauthorized:需要用户身份验证。
  • 403 Forbidden:服务器拒绝请求。
  • 404 Not Found:请求的资源未找到。
  • 405 Method Not Allowed:请求方法不允许。
  • 429 Too Many Requests:请求频率限制超出。

5xx - 服务器错误

  • 500 Internal Server Error:服务器遇到内部错误。
  • 501 Not Implemented:服务器不支持请求的功能。
  • 502 Bad Gateway:充当网关或代理的服务器从上游服务器接收到无效响应。
  • 503 Service Unavailable:服务器当前无法处理请求。
  • 504 Gateway Timeout:充当网关或代理的服务器未及时收到响应。

6、解析渲染

浏览器会解析响应并逐步下载HTML页面、图片、CSS、JavaScript 等资源。解析过程包括根据响应头中的内容类型判断如何处理,如将HTML渲染到页面、将图片显示在页面上等。浏览器会根据下载的资源,解析HTML结构、CSS样式和JavaScript代码,并将它们渲染成最终的页面展示给用户。

7、释放连接

请求完成后,浏览器不会再发送数据给服务器,服务器等待超时后,断开TCP连接进行四次挥手。

在HTTP/1.0中,一个服务器在发送完一个HTTP响应后,会断开TCP连接。但是这样每次请求都会重新建立和断开TCP连接代价过大。所以虽然标准中没有设定,某些服务器对Connection: keep-alive的Header进行了支持。意思是说,完成这个HTTP请求之后,不要断开HTTP请求使用的TCP连接。HTTP/1.1 以及默认支持长连接。

扩展

1、cookie和session

**Cookie **

1、保存在浏览器端,是服务器发送给浏览器的字符串。

2、HTTP无状态,保持长连接状态,每次请求服务器都不会保留通信状态,所以浏览器请求时带着cookie,服务器可以根据cookie来识别浏览器

3、一般登录过程中,浏览器发送请求后,服务器返回的包headers字段Set-Cookie就是cookie,浏览器再次请求的时候,就会在headers带上cookie进行请求

4、通过过期日期时间参数Expires、最大周期Max-Age来控制cookie失效时间

5、在浏览器中可以被修改和删除
Session

1、保存在服务器端存储用户状态的一种机制。

2、当用户访问网站时,服务器会为该用户创建Session ID,用户再次请求的时候带着Session ID,服务器就通过sessionid获取用户的会话状态,Session ID一般会放在Cookie中

2、GET和POST

GET和POST都是HTTP协议中的请求方法

1、GET 获取服务器资源,POST可以修改服务器的资源

2、GET的请求参数是在URL中,POST是在body中

3、一般情况下浏览器对URL长度有限制,所以GET请求的参数长度有限制,POST没有

4、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留

5、GET在浏览器回退时是无害的,而POST会再次提交请求

6、GET请求可以被缓存,如果多次发送相同的GET请求,浏览器可以直接从缓存中获取结果,而POST不会,每次发送都会向服务器请求最新的数据

7、GET请求是幂等的,即对服务器资源的读取操作,不应对服务器产生副作用。而POST请求是非幂等的,可能会对服务器产生副作用,如修改、删除数据等

相关推荐
a_weng083 小时前
CS 144 check6: buiding an IP router
网络·网络协议·计算机网络
码农丁丁3 小时前
[前端]HTTP库Axios
前端·网络协议·http·aixos
carterslam4 小时前
解决:websocket 1002 connection rejected 426upgrade required
网络·websocket·网络协议
G丶AEOM4 小时前
UDP基本了解
网络·网络协议
m0_748232924 小时前
Android Https和WebView
android·网络协议·https
群联云防护小杜7 小时前
服务器压力测试怎么做
运维·服务器·网络协议·tcp/ip·阿里云·压力测试
等一场春雨7 小时前
403 Forbidden HTTP 响应状态码
网络·网络协议·http
打鱼又晒网10 小时前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
青灯文案110 小时前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http
小林熬夜学编程12 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http