全面解析HTTP(一)
来源:互联网 发布:手机淘宝联盟何时返利 编辑:程序博客网 时间:2024/06/06 08:23
全面解析HTTP(一)
- 【前言】很久以前学过《计算机网络》这本书,但是大部分平时编程用不上的知识点忘得一干二净。可是知识要形成体系才对,所以教研室的师兄买了俩本好书我立即借来研读,并且在笔记本中手动整理好知识点。怕笔记本丢失,所以在把知识点写成博客,存入云端也加深知识点。
【注意】此文是我研读《图解HTTP》这本书的笔记,可以说把一本书的重点给总结概括,也强烈向大家推荐此书,适合用于打牢基础。看此文前请大家看看我之前写的这篇博客网络编程系列之一:Http协议介绍。该文向大家详细介绍了:URL,请求/响应报文。
- 接下来这图是我用xmind画的本文的大体脉络与目录
(一)网络基础TCP/IP协议簇
1.TCP/IP协议簇分为四层:应用层、传输层、网络层和数据链路层。如下图:
- 应用层:决定了向用户提供应用服务时通信的活动,比如FTP,DNS以及今天要讲的HTTP。
- 传输层:对于上层应用层,提供处于网络连接中的俩台计算机之间的数据传输。
- 网络层:该层规定了通过怎样的传输路径到达对方计算机,并把数据包传给对方。
- 数据链路层:用来处理连接网络硬件部分。
- 【注意】发送端在层与层之间传输数据时,没经过一层必定会被打上该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层会把对应的首部消掉。
2.与HTTP关系密切的协议:IP,TCP,DNS
- IP协议作用是把各种数据包发送给对方,要保证确实传送到对方那里需要满足各类条件,其中俩个重要条件是:IP地址和MAC地址。IP地址指节点被分配到的地址,MAC地址指的是网卡所属的固定地址。
TCP协议提供可到的传输服务,位于传输层。字节流服务:为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。可靠的服务是指:能过把数据准确可靠地传送给对方,也就是三次握手过程(将会在下一篇博文中详细介绍三次握手和四次挥手)。握手中使用了TCP的标志(flag)—SYN(synchronize)和ACK(acknowledgement).
负责域名解析的DNS服务:DNS协议提供通过域名查找IP或是通过IP反查域名。
3.各种协议与HTTP协议的关系
接下来放大招了,对于你在浏览器中输入url到浏览器显示HTML页面的背后过程到底是什么呢?大家可以看我转载的这篇博文:当你在浏览器地址栏输入一个URL后回车,将会发生的事情?或者看下面这幅图:
接下来的URL解析在以前的博文中写过,这里不再提及。
(二).简单地HTTP协议
1.HTTP请求/响应报文
- 以前博文介绍过,不再提及。
2.持久连接节省通信量
在HTTP协议初始版本中每进行一次HTTP通信就要断开一次TCP连接。
在HTTP/1.1中,所有连接都默认持久连接:建立一次TCP连接之后可以进行多次请求响应交互。减轻服务端负担,也是HTTP请求响应可以更早结束。
3.管线化(pipelining)
同时并行发送多个请求,不需要一个接一个地等待响应!
4.使用Cookie的状态管理
HTTP是无状态的协议,它不对之前发生过的请求和响应的状态进行管理。当一个需要登录认证的页面本身无法进行状态管理时,每次跳转到新的页面岂不是需要重新登录,为了解决这些矛盾,引入Cookie机制。
(三).HTTP报文内的HTTP信息
- 讲过不讲,可在此博文中查阅HTTP协议基础
(四).返回结果的HTTP状态码
- 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果,状态码类别如下:
1、2XX 成功:请求被正常处理
1.1 200 OK
表示从客户端发来的请求在服务器端被正常处理
1.2 204 No Content
表示服务器接收的请求以成功处理,但没有资源可返回,即:响应报文中不含实体的主体部分
1.3 206 Partial Content
表示客户端进行了范围请求且服务器成功执行了这部分的GET请求,响应报文中包含由Content_Range指定范围的实体内容
2、3XX 重定向: 服务器需要执行某些特殊处理以正确处理请求(即URI地址或者资源的缓存的资源有效时间过期)
2.1 301 Moved Permanently
永久性重定向:表示请求的资源已被分配了新的URI,以后应使用资源现在的URI,如果已经保存了书签,这时候应该按照Location首部提示的URI重新保存
2.2 302 Found
临时性重定向:表示请求的资源已被分配到了新的URI,希望(本次)能使用新的URI访问
2.3 303 See Other
表示请求对应的资源存在另一个URI,应该使用GET方法定向获取请求的资源
PS:当301、302、303响应状态码返回,几乎所有浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求自动再次发送
301、302标准禁止将POST改为GET,但实际中都会允许这么做
2.4 304 Not Modified
表示客户端发送得附带条件的请求时,服务器运行请求访问,但未满足条件的情况,304返回时,不包含任何响应的主体部分
2.5 307 Temporary Redirect
临时重定向:禁止将POST转换为GET,该状态码会严格遵守浏览器标准
3、客户端错误:4XX的响应结果表明客户端是发生错误的原因所在
3.1 400 Bad Ruquest
请求报文存在语法错误
3.2 401 Unauthorized
发送的请求需要有通过http认证(BASIC认证、DIGEST认证)的认证信息
PS:若之前已经进行了一次请求,则表示用户认证失败
返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用来质询用户信息
3.3 403 Forbidden
对请求资源的访问被服务器拒绝(服务端没有必要给出拒绝的详细理由,如果想做说明,可在实体主体部分对原因进行描述)
举例:未获得文件系统的访问授权、访问权限出现某些问题等
3.4 404 Not Found
服务器上无法找到请求的资源
4、 5XX服务器错误:服务器本身发生错误
4.1 500 Internal Server Error
服务器端执行请求时发生错误
4.2 503 Server Unavailable
服务器暂时处于超负载或者正在停机维护,现在无法处理请求
(四).与HTTP协作的Web服务器
1.用单台虚拟主机实现多个域名!
在互联网上,域名通过DNS服务映射到IP地址之后访问目标服务器。当请求发送到服务器时,已经是以IP地址访问了。
因此HTTP请求需要在Host首部内完整指出访问服务器的域名URL或主机名,从而识别同一个IP下的不同虚拟主机。
2.通信数据转发程序:代理、网关、隧道
- 代理:代理服务器的基本行为是:接受客户端发送的请求后转发给其他服务器,从源服务器返回的响应转发给客户端。
在HTTP通信中,可级联多台代理服务器。请求响应转发经过数台类似锁链一样连接起来的代理服务器。转发时需要附加Via首部字段标记出经过的主机信息。那么为什么需要代理服务器呢?我用xmind写了三点:
代理又分为缓存代理:预先将资源的副本保存在代理服务器上;透明代理:转发请求或响应时,不对报文做任何加工的代理类型。
网关:网关可以使通信线路上的服务器提供非HTTP协议服务。利用网关提高通信的安全性。
隧道:隧道按照要求建立一条与其他服务器的通信链路,届时使用SSL等加密手段进行通信!
(五).HTTP首部
1.请求/响应报文的格式:请看HTTP协议基础。
2.HTTP首部字段:
- HTTP首部字段是构成HTTP报文的重要因素之一,在客户端与服务器之间以http协议传输信息的过程中,起到传递额外重要信息的作用。
- 首部字段结构:
例如:以Content-Type来表示报文主体的对象类型
Content-Type:text/html
另外,字段值对应的单个http首部字段可以有多个值,比如
Keep-Alive:timeout=15,max=100
通用首部字段:请求和响应报文都会使用的首部。
请求首部字段:从客户端向服务器发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、相应内容相关优先级信息。
响应首部字段:从服务器向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间与实体有关的信息。
【后记】全面解析HTTP(一)到此结束,接下来总结讲解HTTPS的内容。
传送门:全面解析HTTP(二)
- 全面解析HTTP(一)
- 全面解析HTTP(二)
- service全面解析(一)
- java 锁全面解析(一)
- 全面解析JDBC(一)
- 全面解析终极移动终端“MID”(一)
- Android之Intent全面解析及用法(一)
- 最全面的RecyclerView源码解析(一)
- HTTP常用状态码查询全面解析
- HTTP请求报文解析(一)
- Android Fragment全面深入解析一
- CAKeyframeAnimation(一)使用和属性全面解析
- 【框架基础】:全面解析Java注解(一)
- android四大组件-service全面解析一
- android Fragmentation框架源码全面解析一
- http协议 (详细,全面)
- Hibernate(三)—一全面解析多对一关联映射
- HTTP深入浅出 http请求 (很全面)
- hdu 2108 判断多边形的凹凸
- mysql的基本查询命令大全
- NNU_20161027_PAT1051. 复数乘法
- arm 体系架构下 linux kernel 的系统调用与返回 源码分析与总结
- 结构体对齐方式详解
- 全面解析HTTP(一)
- java
- 在Eclipse中查看Java类库的源代码
- Cashier Employment_poj1275_差分约束
- 【POJ 2785 4 Values whose Sum is 0】+ 折半枚举(双项搜索))
- iOS 对折线图的封装
- 重拾python 二十四
- C语言编写停车场系统(有漏洞)
- Matlab的vision toolbox demo调试