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请求是非幂等的,可能会对服务器产生副作用,如修改、删除数据等