HTTP协议及HTTP包

HTTP协议用于在Internet上发送和接收消息。HTTP协议是一种请求-应答式的协议 ——客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTTP包。HTTP协议使用可靠的TCP连接,默认端口是80。HTTP的第一 个版本是HTTP/0.9,后来发展到了HTTP/1.0,现在最新的版本是HTTP/1.1。HTTP/1.1由RFC 2616 定义。

在HTTP 中,Client/Server之间的会话总是由客户端通过建立连接和发送HTTP请求包初始化,服务器不会主动联系客户端或要求与客户端建立连接。浏览 器和服务器都可以随时中断连接,例如,在浏览网页时你可以随时点击"停止"按钮中断当前的文件下载过程,关闭与Web服务器的HTTP连接。

1 HTTP请求包
HTTP请求包(GET、POST等请求方法)由三个部分构成,分别是:方法-URI-协议/版本,请求头,请求正文。下面是一个HTTP请求包(GET)的例子:

GET /index.jsp HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive
Host: 192.168.0.106
Content-Length: 37

userName=new_andy&password=new_andy

请求包的第一行是方法-URI-协议/版本:
GET就是请求方法,根据HTTP标准,HTTP请求可以使用多种请求方法。HTTP 1.1支持七种请求方法:GET、POST、HEAD、OPTIONS、PUT、delete和TRACE等,常用的为请求方法是GET和POST。

/index.jsp表示URI。URI指定了要访问的网络资源。
HTTP/1.1是协议和协议的版本。
最 后一行userName=new_andy&password=new_andy为正文,正文与HTTP头部有一个空行(\r\n)分隔。这里需 要说明的一点,其中Content-Length说明正文的长度,有的正文长度没有在头部说明,只是标明Transfer-Encoding: chunked。关于chunked类型的长度计算方法,见RFC 1626。
请求包的头部还会包含许多有关客户端环境和请求正文的有用信息,这里不再描述。

2 HTTP应答包
和HTTP请求包相似,由三个部分构成,分别是:协议-状态代码-描述,应答头,应答正文。下面是一个HTTP应答的例子:

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 2005 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 2004 13:23:42 GMT
Content-Length: 90

<html>
<head>
<title>解读HTTP包示例</title></head><body>
Hello WORLD!
</body>
</html>

HTTP应答包的第一行类似于HTTP请求的第一行,表示所用的协议是HTTP 1.1,服务器处理请求的状态码200。
应答头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。应答的正文就是服务器返回的HTML页面。应答头和正文之间也用CRLF分隔。

wiki中的解释

超文本传输协议(HTTPHyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

概述

HTTP的发展是万维网协会和Internet工作小组合作的结果,在一系列的RFC发布中确定了最终版本,其中最著名的是RFC 2616。在RFC 2616中定义了HTTP/1.1这个今天普遍使用的版本。

HTTP是一个用于在客户端和服务器间请求和应答的协议。一个HTTP的客户端,诸如一个web浏览器,通过建立一个到远程主机特殊端口(默认端口为80)的连接,初始化一个请求。一个HTTP服务器通过监听特殊端口等待客户端发送一个请求序列, 就像“GET / HTTP/1.1”(用来请求网页服务器的默认页面),有选择的接收像email一样的MIME消 息,此消息中包含了大量用来描述请求各个方面的信息头序列,响应一个选择的保留数据主体。接收到一个请求序列后(如果要的话,还有消息),服务器会发回一 个应答消息,诸如“200 OK”,同时发回一个它自己的消息,此消息的主体可能是被请求的文件、错误消息或者其他的一些信息。

HTTP不同于其他基于TCP的协议,诸如FTP。 在HTTP中,一旦一个特殊的请求(或者请求的相关序列)完成,连接通常被中断。这个设计使得对于当前页面有规则连接到另一台服务器页面的万维网来说, HTTP是完美的。当持久连接的缺乏成为保持用户状态的必需选择的方法时,对网页设计者来说,会偶然产生一些问题。而大部分这些方法包括了对“cookies”的使用。

这里有一个HTTP的安全版本称为HTTPS,HTTPS支持任何的加密算法,只要此加密算法能被页面双方所理解。

HTTP(和HTTPS)由唯一资源定位器或者简称URLs定位。创造这种地址定位的语法为了HTML的链接。

例子

下面是一个HTTP客户端与服务器之间会话的例子,运行于www.google.com,端口80

客户端请求:

GET / HTTP/1.1Host:www.google.com

(紧跟着一个换行,通过敲入回车实现)

服务器应答:

HTTP/1.1 200 OKContent-Length: 3059Server: GWS/2.0Date: Sat, 11 Jan 2003 02:44:04 GMTContent-Type: text/htmlCache-control: privateSet-Cookie: PREF=ID=73d4aef52e57bae9:TM=1042253044:LM=1042253044:S=SMCc_HRPCQiqyX9j; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.comConnection: keep-alive

(紧跟着一个空行,并且由HTML格式的文本组成了Google的主页)

在HTTP1.0中,客户端发送一个请求至服务器,服务器发送一个应答至客户端。之后,连接将被释放。另一方面,HTTP1.1支持持久连接。这使 得客户端可以发送请求并且接收应答,然后迅速的发送另一个请求和接收另一个应答。因为多个额外的请求,TCP连接并没有被释放,而每个请求中关于TCP的 负载相对较少。同时,在得到上一个请求的应答之前发送多个请求(通常是两个)也成为可能。这个技术被称为“流水线”。

时间: 2024-10-24 15:13:24

HTTP协议及HTTP包的相关文章

SSRF攻击-运用gopher协议构造POST包--emmmm(http://10.112.68.215:10004/index.php?action=login)

还是天枢的一道CTF题,启程! 分析题目,自己注册账户并登陆后,提示输入一个url,网站会自己运行查找网页信息. emmmmm,很挑衅,网站就当作服务器,我们在url框中输入一个伪造的执行代码,让他运行获取到机密信息,哼哼.这就是SSRF(服务端请求伪造),伪造的代码留给服务端自己执行并返回我们需要的机密信息. 在里面乱输入了一些东西,没有任何反馈.此时,我们就要扫描网站啊. 1.扫描网站+分析robots.txt 使用御剑扫描网站.眼尖得很,看到了"robots.txt"文件. ro

CMCC portal 协议wireshark 抓包分析

环境介绍: 认证服务器 192.168.13.253 AC 192.168.13.252 抓包过程:1.安装wireshark,宁盾wifi默认安装路径下${DKEY AM }/Utilities目录下有wireshark安装包,直接安装即可,具体安装过程略.2.添加Portal协议分析插件,具体操作过程参见附件  portal协议分析插件.zip (114.59 KB, 下载次数: 894) 3.运行wireshark选取网卡,例我的认证服务器所使用的网卡为本地链接;如图: 4.过滤porta

python学习_day30_基于tcp协议的粘包现象

1.基于远程执行命令的程序 需用到subprocess模块 服务端: #1.执行客户端发送的指令 import socket import subprocess phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8090)) phone.listen(5) while True: conn,addr=phone.accept() print('IP:%s PORT:%s' %(addr[0

mysql交互协议解析——mysql包基础数据、mysql包基本格式

mysql交互协议是开发mysql周边组件常用的协议,如JDBC,libmysql等等. 在此我们要认识到mysql交互协议其实是半双工的交互协议,至于为什么,这里就先挖个小坑,以后再填. 在探讨mysql交互协议的格式之前,我们要理清一个小问题,就是mysql交互协议会用到的基本数据类型. 1.整数类型 这里的整数类型可以用来表示mysql数据类型中的整数类型.日期时间类型.DOUBLE.FLOAT类型.比特类型以及枚举类型等等. 所有的mysql整数类型都是小端的,这是网络数据的惯例.即对于

USB协议-USB的包结构及包的分类

USB是串行总线,所以数据是一位一位地在数据线上传送的.既然是一位一位地传送,就存在着一个数据位先后的问题.USB使用的是LSB在前的方式,即先出来的是最低位数据,接下来是次低位,最后是最高位(MSB).一个包,又被分成了很多个域(field),而LSB.MSB就是以域为单位来划分的. USB总线上传输数据是以包为基本单位的.一个包被分成不同的域.根据不同类型的包,所包含的域是不一样的.但是不同的包有个共同的特点,就是都要以同步域开始,紧跟着一个包标识符PID(Packet Identified

UDP协议和黏包

udp是无链接的,先启动哪一端都不会报错 模板 import socket udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字 udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字 msg,addr = udp_sk.recvfrom(1024) print(msg) udp_sk.sendto(b'hi',addr) # 对话(接收与发送) udp_sk.close() # 关闭服务器套接字 服务

6.2 socket 流协议与粘包

TCP IP协议是流协议,对上层协议来讲是没有边界的,主机A发送两个消息M1和M2,如下图所示: 主机A发送了M1和M2,主机B在接收时有4种情况: 1.先收了M1,又收了M2 2.M1.M2一起收到了 3.M1和M2的一部分一起收到的,又收到了M2的一部分 4.先收到了M1的一部分,然后M1的下一部分和M2一起收到 说明: tcp字节流无边界 udp消息是基于数据报的,是有边界的,可以不处理 对等方一次读操作,不能保证完全把消息读完 对方接收数据包的个数是不确定的 应用程序发数据时,先把数据写

基于tcp协议下粘包现象和解决方案

一.缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器.一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情.TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决

Linux内核分析_UDP协议中数据包的收发处理过程

1.前言 实验基于Linux kernel 3.18.6,实验内容包括: (1)编写UDP客户端和服务端 (2)将UDP客户端和服务端集成到MenuOS中 (3)UDP发送数据的过程 (4)UDP接收数据的过程 本文中完整源码:https://github.com/dangolqy/udp 实验楼环境:https://www.shiyanlou.com/courses/1198 2.UDP客户端和服务端 参考博客:https://blog.csdn.net/lell3538/article/de