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协议详解 的相关文章

  • 从 Django 基于类的视图的 form_valid 方法调用特殊(非 HTTP)URL

    如果你这样做的话 有一个 HTML 技巧 a href New SMS Message a 点击新短信打开手机的本机短信应用程序并预 先填写To包含所提供号码的字段 在本例中为 1 408 555 1212 以及body与提供的消息 Hel
  • 如何自定义解析错误的 HTTP 400 响应?

    我编写了一个 REST API 服务 要求所有响应均为 JSON 但是 当 Go HTTP 请求解析器遇到错误时 它会返回 400 作为纯文本响应 而不会调用我的处理程序 例子 gt curl i H Authorization Basic
  • Spring Security (3.2.5) HTTP POST 身份验证后不转发到原始请求

    我有一个示例 Spring MVC 应用程序 由 Spring security Spring 版本 4 0 1 RELEASE Spring security 3 2 5 RELEASE 保护 当我作为未经身份验证的用户发送 HTTP G
  • 使用传输编码分块的 HTTP 响应中的最大块大小是多少?

    The w3 org RFC2616 http www w3 org Protocols rfc2616 rfc2616 sec3 html sec3 6 1似乎没有定义块的最大大小 但是如果没有最大块大小 则没有空间用于块扩展 必须有一个
  • HTTP 重定向图像可以吗?

    返回图片资源时返回301 302 303代码可以吗 我过去曾这样做过 而且似乎有效 这是好的做法吗 它与大多数浏览器兼容吗 是的 您可以重定向图像 浏览器将遵循重定向 但出于性能原因 您通常希望将重定向保持在最低限度 因为每个重定向都需要单
  • 身份验证中的随机数使用

    在基于摘要的身份验证中 随机数由服务器生成 然而 在基于 OAuth 的身份验证中 随机数是由客户端生成的 我想知道是否有人知道差异的原因 随机数用于使请求唯一 在没有随机数的身份验证方案中 恶意客户端可以生成一次请求并重放多次 即使计算成
  • 从浏览器中删除cookie?

    有什么方法可以指示网络浏览器完全delete一个人的cookie是用PHP设置的吗 我不想expiry或者等待浏览器closed 对于删除 我的意思是实际上不再将其列在 cookie 列表中 尝试这样删除所有 cookie foreach
  • “双点”可以作为 URL 路径部分的一部分吗

    在 URL 中使用父目录双点是否有效且安全 如下例所示 http example com path to file jpg RFC3986 https www rfc editor org rfc rfc3986定义 URI 它描述了路径如
  • OkHttp如何获取Json字符串?

    Solution 这是我这边的一个错误 正确的方法是响应 body string 以外响应 body toString 我使用 Jetty servlet URL 是http 172 16 10 126 8789 test path jso
  • 由于浏览器设置的标头,Safari 拒绝重定向的 CORS 请求

    Summary Safari 拒绝一些涉及重定向的 CORS 请求 声称某些标头是不允许的 但该标头从来不是由脚本请求的 而是由浏览器添加的 所以我认为这应该不重要 Safari 的行为是一个错误吗 规格有问题吗 或者 事情变成这样是有原因
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 使用 Http Post 发送图像

    我想使用 Http Post 将图像从 android 客户端发送到 Django 服务器 该图像是从图库中选择的 目前 我正在使用列表值名称 Pairs 将必要的数据发送到服务器并接收来自 Django 的 JSON 响应 是否可以对图像
  • 编写每个处理程序中间件

    我希望从处理程序中提取一些重复的逻辑 并将其放入一些每个处理程序的中间件中 特别是 CSRF 检查 检查现有会话值 即身份验证或预览页面 等 我读了关于此的几篇文章 http justinas org writing http middle
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个HTTP 请求有标
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何在android中创建nanohttpd服务器?

    其实我也查过一些问题 然后去github上找了一下 但我是新来的 我无法理解这个例子 我想在android中创建http服务器 这样我就可以在PC浏览器中访问它 我有一个类扩展 nanohttpd 的实例 但服务器无法工作 不知道为什么 我
  • 对于一般不成功的请求(不是错误),适当的 HTTP 状态代码响应是什么?

    我正在创建一个 RESTful API 它将处理许多用户交互 包括使用存储的信用卡下订单 如果订单成功 我将返回 200 OK 如果订单请求格式错误或无效 我将返回 400 Bad Request 但如果订单实际处理过程中出现问题 我该怎么
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • GET 和 POST 方法有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 什么时候用POST 什么时候用GET https stackoverflow com questions 46585 when do you use post and when do you use
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP

随机推荐

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