一 HTTP是什么
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP协议的主要特点包括:
无连接:HTTP协议是无连接的,即每次请求都需要建立新的连接,请求处理完毕后就断开连接(HTTP/1.0)。不过,从HTTP/1.1开始,引入了持久连接(persistent connection),允许在同一个TCP连接中进行多个请求和响应。
无状态:HTTP协议本身是无状态的,这意味着服务器不会保留之前请求和响应的信息。为了实现状态管理,通常会使用Cookie或Session等技术。
请求/响应模型:HTTP是一个请求/响应协议。客户端发出一个请求,服务器则返回一个响应。
二.HTTP协议的⼯作过程
当我们在浏览器中输⼊⼀个"⽹址",此时浏览器就会给对应的服务器发送⼀个HTTP请求.对⽅服务器收到这个请求之后,经过计算处理,就会返回⼀个HTTP响应.
三.抓包⼯具的使⽤
以Fiddler为例.(下载地址)
安装过程⽐较简单,⼀路next即可.
1.原理
• 左侧窗⼝显⽰了所有的HTTP请求/响应,可以选中某个请求查看详情.
• 右侧上⽅显⽰了HTTP请求的报⽂内容.(切换到Raw标签⻚可以看到详细的数据格式)
• 右侧下⽅显⽰了HTTP响应的报⽂内容.(切换到Raw标签⻚可以看到详细的数据格式)
• 请求和响应的详细数据,可以通过右下⻆的View in Notepad 通过记事本打开.
可以使⽤ctrl+a全选左侧的抓包结果,delete键清除所有被选中的结果.
2.抓包结果
1)HTTP请求
• ⾸⾏:[⽅法]+[url]+[版本]
• Header:请求的属性,冒号分割的键值对;每组属性之间使⽤\n分隔;遇到空⾏表⽰Header部分结束
• Body:空⾏后⾯的内容都是Body.Body允许为空字符串.如果Body存在,则在Header中会有⼀个Content-Length属性来标识Body的⻓度;
2)HTTP响应
• ⾸⾏:[版本号]+[状态码]+[状态码解释]
• Header:请求的属性,冒号分割的键值对;每组属性之间使⽤\n分隔;遇到空⾏表⽰Header部分结束
• Body:空⾏后⾯的内容都是Body.Body允许为空字符串.如果Body存在,则在Header中会有⼀个Content-Length属性来标识Body的⻓度;如果服务器返回了⼀个html⻚⾯,那么html⻚⾯内容就是在body中
四.协议格式
1.HTTP请求(Request)
1).认识URL
URL基本格式
平时我们俗称的"⽹址"其实就是说的URL(Uniform Resource Locator 统⼀资源定位符).
互联⽹上的每个⽂件都有⼀个唯⼀的URL,它包含的信息指出⽂件的位置以及浏览器应该怎么处理它.
URL的详细规则由因特⽹标准RFC1738进⾏了约定(https://datatracker.ietf.org/doc/html/rfc1738)
⼀个具体的URL:
1 https://v.bitedu.vip/personInf/student?userId=10000\&classId=100
可以看到,在这个URL中有些信息被省略了.
• https :协议⽅案名.常⻅的有http和https,也有其他的类型.(例如访问mysql时⽤的jdbc:mysql )
• user:pass :登陆信息.现在的⽹站进⾏⾝份认证⼀般不再通过URL进⾏了.⼀般都会省略
• v.bitedu.vip :服务器地址.此处是⼀个"域名",域名会通过DNS系统解析成⼀个具体的IP地
址.(通过ping命令可以看到,v.bitedu.vip 的真实IP地址为 118.24.113.28 )
• 端⼝号:上⾯的URL中端⼝号被省略了.当端⼝号省略的时候,浏览器会根据协议类型⾃动决定使⽤哪个端⼝.例如http协议默认使⽤80端⼝,https协议默认使⽤443端⼝.
• /personInf/student :带层次的⽂件路径.
• userId=10000&classId=100 :查询字符串(query string).本质是⼀个键值对结构.键值对之
间使⽤&分隔.键和值之间使⽤=分隔.
• ⽚段标识:此URL中省略了⽚段标识.⽚段标识主要⽤于⻚⾯内跳转.
注:URL中的可省略部分
• 协议名:可以省略,省略后默认为http://
• ip地址/域名:在HTML中可以省略(⽐如img,link,script,a标签的src或者href属性).省略后表
⽰服务器的ip/域名与当前HTML所属的ip/域名⼀致.
• 端⼝号:可以省略.省略后如果是http协议,端⼝号⾃动设为80;如果是https协议,端⼝号⾃动设为443.
• 带层次的⽂件路径:可以省略.省略后相当于/.有些服务器会在发现/路径的时候⾃动访问
/index.html
• 查询字符串:可以省略
• ⽚段标识:可以省略
1.GET⽅法
GET是最常⽤的HTTP⽅法.常⽤于获取服务器上的某个资源.
在浏览器中直接输⼊URL,此时浏览器就会发送出⼀个GET请求.
另外,HTML中的link,img,script等标签,也会触发GET请求
GET请求的特点
• ⾸⾏的第⼀部分为GET
• URL的querystring可以为空,也可以不为空.
• header部分有若⼲个键值对结构.
• body部分为空.
2.POST⽅法
POST⽅法也是⼀种常⻅的⽅法.多⽤于提交⽤⼾输⼊的数据给服务器(例如登陆⻚⾯).
通过HTML中的form标签可以构造POST请求,或者使⽤JavaScript的ajax也可以构造POST请求.
POST请求的特点
• ⾸⾏的第⼀部分为POST
• URL的query string⼀般为空(也可以不为空)
• header部分有若⼲个键值对结构.
• body部分⼀般不为空.body内的数据格式通过header中的 Content-Type 指定.body的⻓度
由header中的 Content-Length 指定.
GET和POST的区别
• 语义不同:GET⼀般⽤于获取数据,POST⼀般⽤于提交数据.
• GET的body⼀般为空,需要传递的数据通过query string传递,POST的query string⼀般为空,需要传递的数据通过body传递
• GET请求⼀般是幂等的,POST请求⼀般是不幂等的.(如果多次请求得到的结果⼀样,就视为请求是幂等的).
• GET可以被缓存,POST不能被缓存.(这⼀点也是承接幂等性
3.其他⽅法
• PUT与POST相似,只是具有幂等特性,⼀般⽤于更新
• DELETE删除服务器指定资源
• OPTIONS返回服务器所⽀持的请求⽅法
• HEAD类似于GET,只不过响应体不返回,只返回响应头
• TRACE回显服务器端收到的请求,测试的时候会⽤到这个
• CONNECT预留,暂⽆使⽤
2).请求"报头"(header)
header的整体的格式也是"键值对"结构.
每个键值对占⼀⾏.键和值之间使⽤分号分割.
Host 表⽰服务器主机的地址和端⼝.
Content-Length 表⽰body中的数据⻓度.
Content-Type 表⽰请求的body中的数据格式.
User-Agent(简称UA) 表⽰浏览器/操作系统的属性
Referer 表⽰这个⻚⾯是从哪个⻚⾯跳转过来的
Cookie Cookie中存储了⼀个字符串,这个数据可能是客⼾端(⽹⻚)⾃⾏通过JS写⼊的,也可能来⾃于服务器(服务器在HTTP响应的header中通过Set-Cookie字段给浏览器返回数据)
3).请求"正⽂"(body)
正⽂中的内容格式和header中的Content-Type密切相关
2.HTTP响应
1).状态码(status code)
状态码表⽰访问⼀个⻚⾯的结果.(是访问成功,还是失败,还是其他的⼀些情况...).
以下为常⻅的状态码.
200 OK 表⽰访问成功.
404Not Found 没有找到资源.
403 Forbidden表⽰访问被拒绝.有的⻚⾯通常需要⽤⼾具有⼀定的权限才能访问(登陆后才能访问).如果⽤⼾没有登陆直接访问,就容易⻅到403.
405MethodNot Allowed
500InternalServer Error
服务器出现内部错误.⼀般是服务器的代码执⾏过程中遇到了⼀些特殊情况(服务器异常崩溃)会产⽣这个状态码.
504Gateway Timeout当服务器负载⽐较⼤的时候,服务器处理单条请求的时候消耗的时间就会很⻓,就可能会导致出现超时的情况.
302 Move temporarily 临时重定向.
301Moved Permanently 永久重定向.当浏览器收到这种响应时,后续的请求都会被⾃动改成新的地址
2).响应"报头"(header)
响应报头的基本格式和请求报头的格式基本⼀致.
类似于Content-Type , Content-Length 等属性的含义也和请求中的含义⼀致.
Content-Type
• text/html :body数据格式是HTML
• text/css :body数据格式是CSS
• application/javascript :body数据格式是JavaScript
• application/json :body数据格式是JSON
3).认识响应"正⽂"(body)
正⽂的具体格式取决于Content-Type.