HTTP(一)概述
总是觉得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,你们!)
- 宽带运营商服务器查看本身缓存。
运营商服务器发起一个迭代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(一)概述的更多相关文章
- 【AR实验室】ARToolKit之概述篇
0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- .Net 大型分布式基础服务架构横向演变概述
一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...
- [C#] 进阶 - LINQ 标准查询操作概述
LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- [AlwaysOn Availability Groups]健康模型 Part 1——概述
健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...
- μCos-ii学习笔记1_概述
一.μCos-ii _概述 网上关于μCosii的文章多不胜数,本人学习的过程中也参考了很多人的理解和想法,看的是卢有亮老师的<嵌入式实时操作系统-μC/OS原理与实践>(第2版),同时也 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
随机推荐
- oubango中视频JitterBuffer的优化
- [冬令营模拟]wzj的题目#1
T1 少膜一个,T3 暴力写挂 强势 rank1 -> rank2 一场比赛两道线段树分治,给力 T1 password 给你 m 个禁止字符串,求长度为 n 的所有字符串中至少包含这些禁止字符 ...
- bzoj 1398: 寻找主人 AC自动机+最小表示法
题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判 ...
- Linux环境下,开启tomcat时报transport error 202: bind failed: 地址已在使用
转载自:http://blog.csdn.net/mooncom/article/details/61913813 问题描述:今天我在Linux环境下配置tomcat,在tomcat/conf下的se ...
- python中文件打开的各个标识含义
w代表清空后写入 r代表打开后追查 +代表可以写 b代表二进制写入
- JVM体系结构之六:堆Heap之1
一.简介 对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放 ...
- play 学习 一 : 构建SBT的play项目
因为帮一个朋友做一个简单的项目,档案管理.同时也为了自己能学习PLay框架,所以记录一下. 项目GitHub地址: https://github.com/liufeiSAP/ArchiveManage ...
- UML核心元素--边界
定义:边界是无形的,是可大可小的,同时参与者.用例和边界又有着相生相克的性质.与其说边界是UML元素,还不如说它是一种分析方法. 1.需求是动态的过程:系统边界是无形的,看不到的,不好理解,倒不如说需 ...
- C语言学习笔记--C语言中变量的属性关键字
变量属性关键字的使用语法:property type var_name; 1.auto 关键字 auto关键字是C语言中局部变量的默认的关键字,C编译器默认所有的局部变量都是auto的,它表明了被修饰 ...
- 实现reentrantlock和读写锁
1 可以手动实现一个类似reentrantlock的工具,首先要维护一个state的标志,代表当前是否有线程已经使用资源.线程lock的时候, 会用cas给state加1,其他线程检测状态.另外需要维 ...