http协议

前言

http协议的学习掌握对我们理解底层原理有相当大的作用,可以帮助我们更好地认识web。这里只对http做粗略学习,具体的理解应用需要结合实战。不过你连http都不会怎么好意思说自己是学web的(
ps.这篇博客同时含有TCP/IP的三次握手与四次握手。

了解HTTP

HTTP(Hypertext Transfer Protocol),超文本传输协议,指的是在计算机世界中专门在两点之间传输超文本数据的规范。

超文本指的是现在计算机可以传输文字、图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,文本的语义被扩大化,因此被称为超文本。

传输指的是由传输载体负责把二进制数据包由计算机终端传输到另一个终端的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。请求方和应答方可以进行互换,请求方也可以作为应答方接受数据,应答方也可以作为请求方请求数据。

网络协议指的是网络中(包括互联网)传递、管理信息的一些规范。ftp、http、ftmp、pop、tcp/ip这些都是网络协议。

网络模型与OSI模型

网络模型

为了给网络协议设计结构,设计者以分层的方式设计组织网络协议,每个协议属于层次模型之一,且每一层都向其上一层提供服务。每个分层中所有协议被称为协议栈,因特网协议栈分为五个部分:物理层链路层网络层运输层应用层

应用层

应用层是网络应用程序和网络协议存放的分层。应用层协议分布在多个端系统上一个端系统应用程序与另外一个端系统应用程序交换信息分组,我们把位于应用层的信息分组称为报文(message)。常用的HTTP协议、FTP协议等等都在这一层中。

运输层

运输层在应用程序断点之间传送应用程序报文。这一层中主要用到的是TCP协议UDP协议,我们把运输层的分组称为报文段(segment)

TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。
UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。

网络层

网络层负责将数据报的网络分层从一台主机移动到另一台主机,所有具有网络层的因特网组件都必须运行IP协议,因此一般把网络层称为IP层。

链路层

为了将分组从一个节点运输到另一个节点,网络层必须依靠链路层提供服务。链路层的例子包括以太网、WiFi和电缆接入的DOCSIS协议,因为数据从源目的地传送通常需要经过几条链路,一个数据包可能被沿途不同的链路层协议处理,我们把链路层的分组称为帧(frame)

物理层

物理层的作用是将帧中的一个个比特从一个节点运输到另一个节点,物理层的协议仍然使用链路层协议。

OSI模型

ISO提出来计算机网络应该按照7层来组织,OSI要比上面的网络模型多了表示层和会话层,其他层基本一致。

  • 表示层主要包括数据压缩和数据加密以及数据描述,数据描述使得应用程序不必担心计算机内部存储格式的问题。
  • 会话层提供了数据交换的定界和同步功能,包括建立检查点和恢复方案。

HTTP工作流程

0、原始状态:客户端与服务器之间没有关系
1、客户端与服务器之间建立连接,发送请求
2、服务器接受请求,返回响应信息
3、释放连接TCP连接
4、客户端收到响应(一般为Html代码)并解析内容
5、客户端与服务器断开连接

HTTP请求特征

  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP请求信息与响应信息

格式

请求:
1、请求行
(1)请求方法
(2)请求资源路径(URL的一部分)
(3)所用协议及版本
2、请求头部信息
key:value
3、空行(一定要有)
4、请求主体信息

响应:
1、状态行:协议版本 状态码 状态文字
2、消息抱头
key:value
3.空行(一定要有)
4、响应主体信息

关于请求方法

1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

关于URL

http:\\host[:port][abs_path][?query]#fragment
协议:告诉浏览器使用何种协议,常用的是http协议或https协议
主机(host):域名或ip,指示需要向网络上哪一台发起请求
端口(port):表示用于访问WEB服务器上资源的入口,如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。
路径(abs_path):web服务器上资源的路径,以端口后第一个/开始,到?结束
查询参数(query):提供给web服务器的额外参数,如果为GET请求一般URL带有查询参数
锚点(fragment):给予浏览器显示位于该点的内容的指示,其片段标识符不会与请求一起发送到服务器

请求头

  • Host:表示对象所在主机,指明了服务器的域名,以及(可选的)服务器监听的TCP端口号。如果没有给定端口号,会自动使用被请求服务的默认端口
  • Connection: 决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络连接。若为持久性连接(keep-alive)则事务完成后不关闭网络连接,反之为非持久性连接(close),一次事务完成后关闭网络连接。
  • User-agent: 请求头用来告诉 Web 服务器,浏览器使用的类型
  • Date:表示请求时的格林威治时间
  • Content-Length:实体报头指示实体主体的大小,以字节为单位,发送到接收方。
  • HTTP Referer 属性是请求标头的一部分,当浏览器向 web 服务器发送请求的时候,一般会Referer:告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
  • Upgrade-Insecure-Requests:用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应。
  • Accept:接受请求 HTTP 标头会通告客户端其能够理解的 MIME 类型。
    文本文件: text/html、text/plain、text/css、application/xhtml+xml、application/xml
    图片文件: image/jpeg、image/gif、image/png
    视频文件: video/mpeg、video/quicktime
    应用程序二进制文件: application/octet-stream、application/zip

状态码

2xx:成功响应

  • 200 成功响应
  • 204 请求处理成功,但是没有资源可以返回
  • 206 对资源某一部分进行响应,由Content-Range 指定范围的实体内容。

3xx:需要进行附加操作以完成请求

  • 301 永久性重定向,该状态码表示请求的资源已经重新分配 URI,以后应该使用资源现有的 URI
  • 302 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
  • 303 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
  • 304 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
  • 307 临时重定向。该状态码与 302 Found 有着相同的含义。

4xx:客户端发生错误

  • 400 该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
  • 401 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
  • 403 该状态码表明对请求资源的访问被服务器拒绝了。
  • 404 该状态码表明服务器上无法找到请求的资源。

5xx:服务器本身发生错误

  • 500 该状态码表明服务器端在执行请求时发生了错误。
  • 503 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

常用其他协议介绍

DNS

计算机网络中的每个端系统都有一个IP地址存在,而把IP地址转换为便于人类记忆的协议就是 DNS 协议。DNS 的全称是域名系统,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

HTTPS

HTTP 一般是明文传输,很容易被攻击者窃取重要信息,鉴于此,HTTPS 应运而生。HTTPS和HTTP有很大的不同在于HTTPS是以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS在HTTP的基础上增加了SSL层,也就是说HTTPS = HTTP + SSL

TCP/IP

互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议。

关于数据包:

通信的过程其实就对应着数据装包与拆包的过程。装包的过程,数据发送方每层不断地封装首部,添加一些信息用于传输,确保能传输到目的地。拆包的过程,数据接收方每层不断地拆除首部,得到最终传输的数据。

三次握手

而要建立TCP/IP连接,就需要三次握手进行初始化。

第一次握手:客户端发送一个TCP标志位SYN=1,ACK=0的数据包给服务端,并随机会产生一个Seq=J.当服务端接收到这个数据后,服务端由SYN=1可知客户端是想要建立连接;
第二次握手:服务端要对客户端的联机请求进行确认,向客户端发送应答号ACK=1、SYN=1、确认号Ack=J+1,此值是客户端的序列号加1,还会产生一个随机的序列号Seq=K,这样就告诉客户端可以进行连接;
第三次握手:客户端收到数据后检查Ack是否为J+1,以及标志位ACK的值是否为1,若为1,则会发送ACK=1、确认号码Ack=K+1,告诉服务端,你的请求连接被确认,连接可以建立,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
三次握手是在安全可靠的基础上,握手次数最少的方案。两次握手并不能保证可靠性,四次握手又浪费了效率。当然,有的需要更高安全性的地方,是可以有N次握手协议的,但那是特殊情况。

四次握手

四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,这时客户端也关闭连接。最终完成了四次握手。

关于三次握手与四次握手,可以参考这篇博客:
详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”

总结

学习http协议可以帮助我们探索很多漏洞的原理以及web的访问方式,为我们学习cookie与session打下基础。而TCP/IP协议的三次握手与四次握手是相当重要的知识点,需要我们进一步了解学习。