http协议详解

2023-11-04

本篇博文主要介绍HTTP请求-响应的系列过程,包括四个部分,是在陆续学习中觉着之间有关联总结下来的,以便自己今后忘记后可以快速查看也为各位看到这篇文章的朋友们梳理一下知识。下面,正文开始:

作为一个前端开发人员,我们每天都在与页面打交道,那么,当你输入一个网址的时候,实际究竟会发生什么呢?下面,就先来解答一下这个问题。

一、当在浏览器输入一个网址后,实际会发生什么?

回答之前,先摘一段《淘宝技术这十年》中的“你刚才在淘宝上买了一件东西”里的一段话,对我理解这个问题有启发。

你发现快过年了,于是想给你的女朋友买一件毛衣,你打开了 www.taobao.com,这时你的浏览器首先查询DNS服务器,将 
www.taobao.com转换成IP地址。但是,你首先会发现,在不同的地区或者不同的网络下,转换后的IP地址很可能是不一样的,这首先涉及负载均衡的第一步,通过DNS解析域名时,将你的访问分配的不同的入口,同时尽可能的保证你所访问的入口时所有入口中较快的一个。 
你通过这个入口成功的访问了www.taobao.com实际的入口IP地址,……经过一系列的复杂的逻辑运算和数据处理,用于给你看的淘宝首页HTML内容便生成了,浏览器下一步会加载页面中用到的CSS /JS/图片等样式、脚本和资源文件。

扯远一点,我平时喜欢看书,各种书都看,文学类的居多,最近也在看产品类的设计类的和技术类的,多看书生活愉快,哈哈。

好,切入第一个问题,这个问题的回答主要是翻译自这篇英文文章 http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 。

那么,输入网址后,实际发生了什么呢?过程如下:

1、输入网址。

2、浏览器查找域名的IP地址。

 导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:
  • 浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
  • 系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。
  • 路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
  • ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。

3. 浏览器给web服务器发送一个HTTP请求

4. 网站服务的永久重定向响应

服务器给浏览器响应一个301永久重定向响应,为什么服务器一定要重定向而不是直接发会用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.igoro.com/ 
http://igoro.com/,搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有一个是用不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。

5. 浏览器跟踪重定向地址

   现在,浏览器知道了要访问的正确地址,所以它会发送另一个获取请求。请求头部一般包括:
   Accept
   Accept-language
   Accept-Encoding
   Connection
   User-Agent
   Cookie
   Host

6. 服务器“处理”请求

服务器接收到获取请求,然后处理并返回一个响应。

7. 服务器发回一个HTML响应

8. 浏览器开始显示HTML

9. 浏览器发送请求,以获取嵌入在HTML中的对象

在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。这些文件就包括CSS/JS/图片等资源,这些资源的地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等…

10. 浏览器发送异步(AJAX)请求

二、三次握手的过程

这个问题,最初接触,是在本科学习计算机网络的时候,当时学什么TCP/IP,各种层,但是,学的不如忘得快啊,很多东西,还是需要常常的使用和回顾才行。 
如下图,建立连接要三次握手,释放连接要四次握手,下面具体介绍一下: 
这里写图片描述

需要说明的信息:

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 
SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。 
FIN (finis):完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

这里写图片描述

三次握手,两次确认。 
首先由Client发出请求连接,即 SYN=1 ACK=0, TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x 
然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y, ack=x+1, 
再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1.然后连接建立。为什么要进行三次握手,两次确认呢?我用我自己的理解来说。

考虑一种情况,A发送了一个连接请求,但是这个请求因为某种原因而滞留了,一直延误到连接释放后才到达B,而B收到连接请求后,就会发送确认信息,同意建立连接,如果不存在第三次握手的话,这个连接就成功了。而这是一个失效的连接请求,A不会向B发送数据,这样B的资源就会白白浪费了,因为B一直在等待A发送数据。 
连接释放:四次握手 
这里写图片描述

当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1, 服务器B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。 A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。 
当客户端A没有数据要发送时,就要释放A的连接,A会发送一个FIN报文,然后主动关闭连接(不再发送信息但仍然可以接收信息)。服务器B收到FIN报文后,会给应用程序通信,并向A发送一个确认报文。A收到B的确认后进入等待状态,等待B请求释放连接。 B的数据发送完后,会向A发送FIN报文,请求释放连接。A收到后会回复一个确认信息,然后进入TIME_WAIT状态。

以上就是7次握手。

三、HTTP头部信息

说实话,这个部分是已经工作了的师姐让我面试前一定要准备一下的问题,说面试官会问道,所以就系统的学习了一下,现在总结如下:

   通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。

登录到CSDN后,随便点了一个资源,看看HTTP头部信息: 
这里写图片描述 
从上图可以看到,头部信息包括三部分:

1、通用头部

2、请求头部

3、响应头部

4、查询字符串参数

分别介绍:

1、通用头部

通用头域包含请求和响应消息都支持的头域。

Request URL:请求的URL地址
Request Method: 请求方法,get/post/put/……
Status Code:状态码,200 为请求成功
Remote Address:路由地址

2、请求头部

     1) Accept:  告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型;
     2)Accept-Charset:  浏览器申明自己接收的字符集
     Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法  (gzip,deflate)
     3)Accept-Language:  浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。
     4)Authorization:  当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,该头部来回应自己的身份验证信息给WEB服务器。
     5)Connection:表示是否需要持久连接。close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,
     不要等待本次连接的后续请求了)。keep-alive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
     6)Referer:发送请求页面URL。浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL。
     7)User-Agent: 浏览器表明自己的身份(是哪种浏览器)。
     8)Host: 发送请求页面所在域。
     9)Cache-Control:浏览器应遵循的缓存机制。
            no-cache(不要缓存的实体,要求现在从WEB服务器去取)
            max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象) 
            max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值)  
            min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
     10)Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。
     11)Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。
     12)Form:一种请求头标,给定控制用户代理的人工用户的电子邮件地址。
     13)Cookie:这是最重要的请求头信息之一

以上仅列出了我见过的请求头部,欢迎指正和补充!

3、响应头部

      1)Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
      2)Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。
      3) Cache-Control:服务器应遵循的缓存机制。
              public(可以用 Cached 内容回应任何用户)
              private(只能用缓存内容回应先前请求该内容的那个用户)
              no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端) 
              max-age:(本响应包含的对象的过期时间)  
              ALL:  no-store(不允许缓存)  
      4) Connection: 是否需要持久连接
              close(连接已经关闭)。
              keepalive(连接保持着,在等待本次连接的后续请求)。
              Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive:300
      5)Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。 例如:Content-Encoding:gzip 
      6)Content-Language:WEB 服务器告诉浏览器自己响应的对象的语言。
      7)Content-Length:WEB 服务器告诉浏览器自己响应的对象的长度。例如:Content-Length: 26012
      8)Content-Range:WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range: bytes 21010-47021/47022
      9)Content-Type:WEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml
     10)Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。
     11) Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。
     12) Location:WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。
     13)Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。
     14)Server: WEB 服务器表明自己是什么软件及版本等信息。
     15)Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。

四、HTTP响应码

HTTP响应码响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。 
响应码分五种类型,由它们的第一位数字表示: 
1xx:信息,请求收到,继续处理 
2xx:成功,行为被成功地接受、理解和采纳 
3xx:重定向,为了完成请求,必须进一步执行的动作 
4xx:客户端错误,请求包含语法错误或者请求无法实现 
5xx:服务器错误,服务器不能实现一种明显无效的请求 
具体含义如下: 
这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述 

这里写图片描述

 

本文转自:https://blog.csdn.net/xiaozhuxmen/article/details/51934706

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

http协议详解 的相关文章

  • 如何在 http POST 请求中发送 HTML 代码?

    我正在从 Google Web Toolkit 应用程序向 php 脚本发送 HTTP POST 请求 内容类型现在是 application x www form urlencoded 所以我可以将变量发送到 php 并使用 POST 在
  • 在 C# 中的 RESTfull/HTTP 请求中添加标头和发布数据

    我在 C 中发送 POST 请求时遇到问题 似乎我误解了一些 HTTP 基础知识 所以基本上我正在实施 RESTfull 服务client 其工作原理如下 使用用户名 密码发出 POST 请求并获取令牌 在发出其他 GET POST PUT
  • 如何在我的 gstreamer 中启用 httpsrc 插件?

    我尝试使用以下命令播放通过 http 检索的 mp3 文件或流 gst launch httpsrc location http domain com music mp3 mad osssink 但出现以下错误 ERREUR le pipe
  • 检查 Javascript 中的 URL 是否损坏

    这个问题之前已经发布在 Stack 上 但没有一个具体到我想要理解的内容 检查 URL 是否正确的最简单方法是发送 http Head 请求 但是如何使用它来指定 URL 呢 我在之前的帖子中发现了这一点 function UrlExist
  • 即使禁用缓存,Safari 也会缓存 GET 请求

    我已经将我所知道的所有标头设置为在我的服务器上禁用缓存 甚至禁用 ETAG 但 Safari 仍然偶尔 大约 50 次 缓存我的请求 Workflow 我正在实施 oauth 1 所以 浏览器使GET api user request 服务
  • C# HttpWebRequest 服务器未返回完整响应

    我正在向返回带有数据的 HTML 的服务器发出 HTTP 请求 但有时它会 停在中间 没有任何明确的解释 例如响应结束 Content length 14336 chars p p br ul ul example com var auth
  • 在 Angular 中一起使用 Promise 和服务

    我的问题是基于这个话题 https groups google com forum msg angular qagzXXhS VI p9ArYjfivW8J在 Angular 谷歌小组中 我想提供一个服务 存储通过 http 从后端检索的一
  • 我应该使用哪种协议来传输音频(非直播)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用创建的 201 进行重定向

    有没有办法通过 201 答案重定向 RFC规定新创建的资源必须在Location标题 我确实指定了它 我假设浏览器会重定向 但事实并非如此 即使页面没有内容 我希望用户在 POST 操作之后重定向到新资源 因此我很想使用303 See Ot
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • Http Auth 不适用于 PHP

    我使用 Laravel Lumen Shield 扩展进行 Http 身份验证 但是在我的本地计算机上一切都很完美 我只在我们的服务器上遇到了问题 问题是在我提交正确的登录数据后 登录屏幕再次出现 我尝试了不同的登录数据 不同的浏览器 登录
  • 响应中的有效 JSON

    我正在开发客户端和服务器应用程序 遇到了一个有趣的问题 我们正在创建一个 Restful API 并通过 JSON 响应与客户端进行通信 执行 DELETE 时 我们将返回 200 OK 和空白响应 我们的客户收到 200 OK 但解析 J
  • TRESTRequest:是否可以在 POST 请求中使用自定义媒体类型?

    例如 我们有一个 API 需要我们自己的供应商特定内容类型application vnd xxxx custom custom data json但查看 REST Client 的源代码 它似乎总是默认为 REST Types 中的 Con
  • 无法在服务器端 NodeJS 启用 CORS

    我无法启用CORS在服务器端 我的前端和后端服务器有不同的端口 服务器端的实现方式如下 http createServer function req res Here you can create your data response in
  • 如何在 Android 中从服务器检索数据时更新滚动的 ListView?

    目前 我正在使用 AsyncTask 来处理 Http 连接并以 JSON 格式检索数据 加载所有数据很简单 但会消耗太多时间 因此我决定使用一次加载 10 个项目LIMIT OFFSET mysql 接下来我设置事件onScroll为我的
  • 为什么 HttpClient 使套接字保持打开状态?

    在创建 使用和处置多个 HttpClient 时 我注意到有套接字处于 TIME WAIT 状态 例如 运行以下命令后 using System Net Http namespace HttpClientTest public class
  • HTTP 查询字符串和 []

    PHP 使用 在查询参数名称中 以确保多次出现的参数都出现在 GET超全局变量 否则只出现最后一次出现的情况 还有其他软件可以做到这一点吗 但从RFC 3986 https www rfc editor org rfc rfc3986 以及
  • 是否有用于通过 HTTP、HTTP 隧道发送二进制数据的 Java 库?

    我想通过 HTTP 以二进制格式发送相当大的数据块 也称为HTTP 隧道 http en wikipedia org wiki HTTP tunnel 我想通过 Java 将这种技术用于一些 Java Swing 应用程序 也可能是 And
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr

随机推荐

  • SpringCloud集成Nacos并使用

    摘要 今天分享下 SpringCloud 集成 Nacos 并使用 的一些基本知识 欢迎关注 欢迎阅读 总结系列 SpringCloudAlibaba 实战搭建 项目父模块 pom xml 配置
  • lgb(lightgbm)处理类别特征遇到的问题(泰坦尼克):

    1 lgb lightgbm 处理类别特征遇到的问题 ValueError DataFrame dtypes for data must be int float or bool Did not expect the data types
  • windows下使用vscode远程连接Linux服务器进行开发

    windows下使用vscode远程连接Linux服务器进行开发 一 安装远程开发插件Remote Development 1 在商店中搜索 Remote Development 并安装 2 选择SSH Targets 3 新建远程连接 4
  • mysql 数据类型

    1 整数类型 TINYINT SMALLINT MEDIUMINT INT BIGINT 分别使用 8 16 24 32 64位存储空间 存储范围是 2的 n 1 次方到2的 n 1 次方 1 其中n是存储空间位数 unsigned属性不允
  • 如何在uni-app正确使用web-view

    可以定义一个内部页面 就只放一个web view 然后在列表点击的时候 跳转到该内部页面 并且把需要打开的链接传递到该页面
  • vector::erase() vector中如何删除元素?

    vector erase 从指定容器删除指定位置的元素或某段范围内的元素 vector erase 方法有两种重载形式 如下 1 iterator erase iterator Where v1 erase v1 begin 删除v1中的第
  • MongDB解决Authentication Failed导致的不能连接问题

    MongoDB的安装 Step1 打开MongoDB产品下载页面https www mongodb com download center jmp nav community 选择Windows Server 2008 R2 64 bit
  • linux标准库unistd.h

    unistd h是unix std的意思 是POSIX标准定义的unix类系统定义符号常量的头文件 包含了许多UNIX系统服务的函数原型 unistd h在unix中类似于window中的windows h ifdef WIN32 incl
  • 微信小程序秀才成语接龙趣味答题小游戏带流量主无授权源码

    介绍 流量主带 横屏广告 视频广告 插屏广告 激励广告 趣味性很强 会推广运营肯定能赚一笔 这套源码也是淘宝买的 网盘下载地址 http kekewangLuo cc j27EjMGhsPL0 图片
  • 微信小程序 Spdier - OfferShow 反编译逆向(一)

    微信小程序 Spdier OfferShow 反编译逆向 一 文章目录 微信小程序 Spdier OfferShow 反编译逆向 一 前言 一 任务说明 1 尝试反编译分析出js code参数的生成方式 用来获取token 2 将小程序搜索
  • Flask 打包 PostgreSQL/PyTorch 的图像推荐系统在 Heroku 云平台上运行

    前文 推荐图像理论简述 PyTorch 推荐相似图像实现 图像推荐 Flask App 步骤 我已经为这个项目设定并满足了以下要求 该网络应用程序可在互联网上访问 该应用程序有一个带分页的图像库 仅加载页面的相关数据 图库和推荐的数据是从数
  • redis常用数据类型的场景,你真的用对了么?

    关注微信公众号 虾米聊吧 每天更新一篇技术文章 文章内容涵盖架构师成长必经之路应掌握的技术 一起学习 一起交流 redis常用数据类型的场景 你真的用对了么 redis常用数据类型包含string hashmap list set sort
  • 使用Transformers离线模型(以bert模型为例)

    首先需要安装transformers pip install transformers 以bert base uncased为例 进入网站 https huggingface co bert base uncased tree main 可
  • qt/e在arm板上显示中文的方法

    QTCN社区 gt Qt嵌入式开发 gt 求qt e在arm板上显示中文的方法 打印本页 登录 注册 回复主题 发表主题 newalan 2008 04 15 00 38 求qt e在arm板上显示中文的方法 求qt e在arm板上显示中文
  • mysql 高效复制存储数据到另一张表

    最近有个需求 我们老大说让我写个存储过程把一张表的数据分组之后按时间取最近的三条数据 复制到另一张表中 刚开始他也没有说这么明白 我就用存储过程写了 写完之后他才说每天取最近三条数据 我一想 这根本用不到存储过程 直接两条SQL搞定如下 d
  • windows server 2008 R2使用nginx代理https访问,外网访问失败

    windows server 2008 R2使用nginx代理https访问 外网访问失败 问题 因为公司固定了ip 在公司服务器Windows server 2008 R2部署项目后 使用nginx代理了https 出现 使用公司的网络
  • 无需Root 手机装电脑系统 虚拟机

    不需要ROOT 安装也有简单方法 比较适合小白 也有大神操作方法 特别说下这不是云电脑 不需要网都可以跑起来 下面具体看下面操作 来自网上教程 非本站原创 我们需要一个软件 windows模拟器 链接 https pan baidu com
  • vue把el-dialog提取出来作为子组件,并实现父组件和子组件相互传值

    最近做项目遇到了一个需求是 为了防止组件中代码冗长 需要将el dialog对话弹出框单独封装成子组件 并将父组件中的id传递给子组件 子组件再根据id刷新父组件 具体项目代码太长 这里仅记录一下实现思路 01 把el dialog提取出来
  • 初识kafka---Kafka从入门到精通(一)

    Kafka中的消息是以topic进行分类的 生产者生产消息 消费者消费消息都是面向topic 而每个topic里面都是有分区的概念 一个topic有三个分区 而每个分区都是有分区leader partition leader 和partit
  • http协议详解

    本篇博文主要介绍HTTP请求 响应的系列过程 包括四个部分 是在陆续学习中觉着之间有关联总结下来的 以便自己今后忘记后可以快速查看也为各位看到这篇文章的朋友们梳理一下知识 下面 正文开始 作为一个前端开发人员 我们每天都在与页面打交道 那么