总是觉得HTTP的学习不过就是几页的学习内容罢了,于是就总是没有好好的去学。

我发现我们更愿意通过实例来了解一个东西,不过这里还是添加一下概括的过程吧~

一个不想看就跳过的概括:输入一个 URL,发生了什么?
  • 1.浏览器通过 DNS 解析 获得 服务 IP 发现目标!
  • 2.客户端通过 TCP 协议 建立 服务器的 TCP 连接。 向城池扔吊绳!
  • 3.客户端(浏览器)向 Web服务器(HTTP服务器) 发送 HTTP 协议包。 冲上城池。
  • 4.服务器向客户端 发送 HTTP 协议应答包。 被敌军发现了(废话,这么大阵势( ̄□ ̄;)
  • 5.客户端和服务器断开,客户端 开始解析 处理 HTML文档。 (被打回来了,不过抢来了一些战果 消化一下!)

纸上谈兵终觉浅,开战!

下面是我的一个HTTP真实的请求过程。

步骤一. 假设用chrome去请求博客园这个网站。

  • 这个时候Chrome会搜索自身的DNS缓存 + 搜索操作系统自身的DNS缓存(前面那个 Chrome缓存挂了,就用 操作系统的)

    注意: Chrome自身缓存时间仅为 1分钟(ヾ(๑╹◡╹)ノ"切,真短)。更多 相关缓存时间 参考:http://blog.csdn.net/charleslei/article/details/51083229


    然后接下来这个我再次访问博客园10s之后

    因为之前那个挂了, 所以这里其实是 又请求了 一次!

    我们的网址其实都只是一个身份证的名字,而那些IPv4地址则是身份证号。

  • 如果还是没有找到,它会读取系统本地的host文件。 (Chrome、OS,你们都是吃干饭的吗,找个人都找不到)
  • 如果还是没有找到,浏览器发起一个DNS的一个系统调用。 (Chrome、OS、Host,你们!)
    1. 宽带运营商服务器查看本身缓存。
    2. 运营商服务器发起一个迭代DNS解析的请求。 -- 具体过程其实就像政府由上到下的工作。
      比如我们要查厦门市在哪里,我们从世界的角度上看,我们先找到 中国->福建->厦门。 这就是所谓的迭代DNS解析。

      完成上述步骤之后,运营商服务器把结果返回给操作系统内核同时缓存起来。
      --> 操作系统内核把结果返回给浏览器
      -->最终浏览器拿到了博客园的网址 www.cnblogs.com
      是不是很有秩序呢??

总结: 浏览器缓存 -> 系统缓存 -> 路由器缓存 -> ISP DNS缓存(这里一般都会有)

步骤二. 浏览器获得域名对应的IP地址后,发起HTTP的三次握手(兔崽子,让我好找)

业内俗称:HTTP是基于TCP。TCP三次握手建立连接。四次挥手关闭连接。

  • 三次握手

    • 客户端发送 SYN(建立联机) 标志的报文 给 服务端。
    • 服务端收到信息,回传 ACK(acknowledgement确认) 标志的报文, 表示确认。
    • 最后客户端 回传 ACK 标志报文,表示握手结束。
  • 四次挥手
    • 客户端 -> FIN/ACK报文(结束确认) -> 服务器 (我要关闭连接了)。
    • 服务器 -> ACK报文 : 我知道了,但我还没准备好 (你说分手就分手)
    • 服务器确认没有数据传输了 -> FIN/ACK(结束确认) -> 客户端。 (好了,那分手吧)
    • 客户端 -> ACK -> 服务器。 (挥手再见)

步骤三之前1. 网站服务的永久重定向响应

为什么不直接 发给用户 想看的内容? 其中一个原因是跟搜索引擎排名有关。如果一个页面两个地址如 baidu.com 和 www.baidu.com,搜索引擎会认为它们 是两个网站。结果造成搜索链 都减少 从而降低排名。搜索引擎 会把 带 www的 和 不带 www 的地址归到 同一个网站排名下面。

步骤三之前2. 浏览器跟踪重定向地址

浏览器知道了 要访问的正确地址。它会发送一个 获取请求。
请求头一般包括:

  • Accept
  • Accept-language
  • Accept-Encoding
  • Connection
  • User-Agent
  • Cookit
  • Host

步骤三 .TCP/IP连接建立起来以后,浏览器就可以向服务器发送HTTP请求了,比如使用 GET ,POST方法,这些前端应该都写过吧。

步骤四. 服务器经过一系列处理将结果数据返回给浏览器,如我访问博客园这个例子,服务器就会把博客园的HTML页面代码发给我。

步骤五. 浏览器拿到博客园的代码,进行,相应的资源加载和渲染,里面的js,css,图片等静态资源都是一个个HTTP请求,都得经过上述的过程。


关于HTTP的状态吗和它的几种请求方法

方法 一些普世的作用
GET 获取
POST 提交,常用于登录注册
PUT 比如说更新头像
DELETE 删除
HEAD 跟GET很像,不过服务器不传回全部内容
TRACE 回显服务器收到的请求,主要用于测试或者诊断

状态码 代表的意义
1XX 请求接受,正在处理
2XX 成功接受、处理掉了
3XX 重定向,需要附加操作才能完成请求
4XX 客户端错误,请求有语法错误或者请求无法实现
5XX 服务端错误,服务器未能实现合法的请求

常见的几个具体的状态码
状态码 代表的意义
200 OK,best
400 客户端请求语法有误
403 服务器收到了请求但拒绝了,可能是没有权限
404 请求资源不存在,可能是你的地址写错了
500 服务端出错
502 连接超时,服务器链接太多,服务器炸了!!!
503 当前服务器没法完成任务,也许过段时间就可以了

HTTP(一)概述的更多相关文章

  1. 【AR实验室】ARToolKit之概述篇

    0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...

  2. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  3. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  4. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  5. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  6. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  7. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  8. [AlwaysOn Availability Groups]健康模型 Part 1——概述

    健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...

  9. μCos-ii学习笔记1_概述

    一.μCos-ii _概述 网上关于μCosii的文章多不胜数,本人学习的过程中也参考了很多人的理解和想法,看的是卢有亮老师的<嵌入式实时操作系统-μC/OS原理与实践>(第2版),同时也 ...

  10. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

随机推荐

  1. ACM学习历程—UESTC 1226 Huatuo's Medicine(数学)(2015CCPC L)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1226 题目就是构造一个对称的串,除了中间的那个只有1个,其余的两边都是对称的两个,自然答案就是2*n-1. ...

  2. bzoj 4260: REBXOR Trie+乱搞

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4260 题解: 啊啊啊. 被这种SB题坑了半天. 求出异或前缀和后 从n到1枚举\(r_1 ...

  3. MySQL的分页技术总结

    利用子查询示例: SELECT * FROM your_table WHERE id <= (SELECT id FROM your_table ORDER BY id desc LIMIT ( ...

  4. Poj 2533 Longest Ordered Subsequence(LIS)

    一.Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...

  5. 低调的css3属性font-size-adjust

    在我们日常的项目中经常会用到不同的字体来达到我们想要的效果,可是某些情况下不同字体的大小在相同的px下显示的大小是不同的 <div id="div1">Text 1&l ...

  6. python oop培训文档里面的 正宗oop、多个函数间反复return传参、多个文件无限复制粘贴扣字、无效废物滑稽类4种方式的例子。(2)

    把文档里面说的几种范式发出来. 4种编程范式实现一个人吃喝拉撒长身体的代码.语法很简单,思想模拟了所有程序员写代码时候的代码规划设计想法. 0.我不反对复制粘贴的写法,可以百度搜索复制粘贴网上现有的, ...

  7. python并发编程之多进程2数据共享及进程池和回调函数

    一.数据共享 尽量避免共享数据的方式 可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实上Manager的功能远不止于此. 命令就是一 ...

  8. eclipse安装M2Eclipse插件

    作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/7967333.html 图1: 图2 ...

  9. js拼的onclick调用方法需要注意的地方 之一

    1.首先,明确一点,js方法中参数可以传递字符串,对象,number类型等,对象传递的是引用,方法中修改了,会影响到方法外面的对象. 2.下面重现项目中遇到的一个问题:(其实就是要明白通过引号来拼接字 ...

  10. Jenkins配置邮件SMTP(使用QQ邮箱)

    一.QQ邮箱中开启SMTP服务 进入QQ邮箱的设置页面,选择开启POP3/SMTP服务 需要发送一条短信开启服务,成功后,会收到一个密码,一定要截图.复制密码保存好 二.Jenkins中配置SMTP ...