TCP/IP五层模型-应用层-HTTP协议

1.定义HTTP协议,也叫超文本传输协议。是用于从Web服务器传输超文本到本地浏览器的传送协议。HTTP不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,默认端口号是80,目前我们使用的是HTTP/1.1 版本。

2.超文本超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户介面范式,用来显示文本及与文本之间相关的内容。现时超文本普遍以电子文档方式存在,其中的文字包含有可以链结到其他位置或者文档的连结,允许从当前阅读位置直接切换到超文本连结所指向的位置。我们日常浏览的网页上的链接都属于超文本。

3.工作层HTTP协议作为TCP/IP模型中应用层的协议,通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。HTTP数据包结构如下:

4.HTTP请求模型当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。原理是怎样的呢?实际上我们输入URL后,我们的浏览器给Web服务器发送了一个Request, Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页。可分为:①浏览器-Web服务器

②浏览器 - 代理服务器 - Web服务器

代理服务器的功能:①提高访问速度, 大多数的代理服务器都有缓存功能。②突破限制, 也就是翻墙了。③隐藏身份。

5.HTTP的特点①简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

②灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

③HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接(无连接):不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。

④无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

⑤支持B/S及C/S模式:C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现。

6.HTTP报文结构:报文结构分为Request和Response两部分。①Request客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行、请求头部、空行和请求数据四个部分组成。

请求方法:

GET:第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。这里请求类型为GET,http://www.cnblogs.com/favicon.ico 为要访问的资源,HTTP/1.1为HTTP版本。

第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息从第二行起为请求头部,HOST为服务器的DNS,Connection用于代理服务器,User-Agent指明浏览器和它平台的信息...

第三部分:空行,请求头部后面的空行是必须的,即使第四部分的请求数据为空,也必须有空行。

第四部分:请求数据也叫主体,可以添加任意的其他数据。这里为GET请求,body为空(body即为请求的数据)。

POST:POST请求有body值。

get请求和post请求的区别:

Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

Response:

HTTP报头:

HTTP状态码:

7.HTTP工作原理:HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

请求/响应交互模型:

8.HTTP和HTTPS:HTTPS产生背景:HTTP协议被用于在Web浏览器和网站服务器之间传递信息,以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTP和HTTPS定义区分:HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层(安全套接层),HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用有两个:一个是建立一个信息安全通道,来保证数据传输的安全;另一个就是确认网站的真实性。

HTTPS工作原理:

HTTP和HTTPS具体区别:

HTTPS优缺点:优点:

缺点:

9.扩展:①URL详解:基本格式:

 

各个参数含义:

URI和URL的区别:

 

URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的。URI一般由三部组成:①访问资源的命名机制。②存放资源的主机名。③资源自身的名称,由路径表示,着重强调于资源。

URL,是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部分组成:①协议(或称为服务方式)。②存有该资源的主机IP地址(有时也包括端口号)。③主机资源的具体地址。如目录和文件名等。

URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。

②套接字:定义:TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。套接字用(IP地址:端口号)表示。它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

分类:流式套接字(SOCK_STREAM):流式套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流式套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。

数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。

原始套接字(SOCK_RAW):原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW。原始套接字与标准套接字(标准套接字指的是前面介绍的流式套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流式套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

10.渗透测试需要用到的HTTP协议相关知识:

消息报文:①请求字段:

HOST:同一IP,不同域名,区分不同站点。
User-Agent:用户代理,告知服务器客服端的操作系统和浏览器信息,用于过滤信息,像写Python爬虫可以指定user-agent。
reference:从哪个网站跳转过来的。
Origin:不携带参数包括账号密码,用于解决csrf攻击,比较安全。
cookie:记录客户端信息,是一个字段,可以被抓包。
session:无法被抓包,是一个定义,过程。
range:用于分块请求实体内容,大文件多线程下载 range:bytes=0-100 100字节。
x-forward-for:XXF头,会把IP地址列出来,可以自己伪造IP地址。
Accept-*:客户端可以接受的格式。单纯的Accept表示文件格式。q=0.x表示优先级,最大为1。Accept-Charest:字符集(UTF-8)。
Accept-Language:接受的语言。
Accept-Encoding:能够接受的编码,如gzip等。
DNT:谷歌浏览器用于解决流量跟踪问题。
X-CSRF-Token:令牌,用于解决CSRF攻击。

②响应字段:

set-cookie:设置cookie信息MAX-Age=最大有效时间/最大存活时间/过期时间。
HTTPOnly:用于解决xss攻击,使通过js脚本将无法读取到cookie信息。用于告诉浏览器不要向客户端(document.cookie或其他)暴露cookie。当网站存在跨站脚本攻击(XSS)漏洞式,黑客通过执行脚本获得cookie使被阻止,从而在根本上杜绝这种类型的攻击。当你在cookie上设置HTTPOnly标识后,浏览器就会知会到这是特殊的cookie,只能由服务器检索到,所有来自客户端脚本的访问都会被禁止。
server:Web服务器信息。可以根据服务器版本检索对应漏洞来进行攻击。
X-power-by:服务器程序版本。建议关闭:1.IIS,修改php.ini文件,添加或修改expose_php=Off。2.apache 隐藏server,修改httpd.conf设置,ServerTokens Prod3.nginx隐藏server,修改nginx.conf,在http里面设置server_tokens off。accept-range:是否接受字节请求。
WWW-Authenticate:www-authenticate是早期的一种简单的,有效的用户身份认证技术。很多网站验证都采用这种简单的验证方式来完成对客户端请求的数据的合法性进行验证。尤其在嵌入式领域,此方法使用较多。缺点:这种认证方式在传输过程中是明码传输的,采用的用户名密码加密方式为BASE-64,其解码过程非常简单,网络上很容易搜索到编解码的源码。采用这种认证方式对于普通用户是较安全的,但稍懂TCP/IP协议和HTTP传输协议和验证过程的,破解这种验证用户名和密码是非常简单的,所以其认证技术并不是很安全。主要是以弹框的形式出现。现在互联网服务器大多是Linux,这种认证技术非常少见了。
Etag:资源匹配信息。
vary:代理服务器缓存的管理信息。

③通用字段:一般出现在响应包中。

connection:Keep-Alive会一直会话cache-control:缓存。
no-cache:不缓存过期信息,no-store:不要存储。
content-length:内容长度。
content-Encoding:内容编码,通常用于对实体内容进行压缩编码,目的是优化传输,内容编码通常是可选择性的,jpg/png这类文件一般不开启,因为图片格式已经是高度压缩过的,再压一遍没什么效果,而且还浪费cpu。
transfer-Encoding:传输编码,用来改变报文格式。
Date:内容产生的时间。
Pragma:报文指令。

④实体字段:

content-type:实体内容的介质类型。
Last-Modifiled:实体内容的最后修改时间。
Expires:相对过期时间,http1.0中的。expires指定的时间分两种,主要考虑到apache中设置A还是M。1.相对文件的最后访问时间(Atime),当Apache使用A时间来做expires时,expires的值就和max-age相等,因为max-age是相对文件的请求时间(Atime)。2.绝对修改时间(Mtime),当用户request请求为18:00时,过期时间为600秒,Expires=18:00+600=18:10,Max-age=18:00+600=18:10,此时Expires=Max-age;当用户request请求为18:20时,过期时间为600秒,Expires=18:00+600=18:10(因为设置成Mtime时,时间由文件建立时间来决定。),Max-age=18:20+600=18:30,此时Expires≠Max-age。

深入了解请求方法:  

GET:请求指定页面信息。

POST:表单类型的,提交某种信息。

HEAD:返回的响应没有具体的内容,用于获取报头(扫描器做内容探测用HEAD方法,速度快并且不易被发现)。

 

原文地址:https://www.cnblogs.com/dawangk-3366/p/14286249.html