初识了大的网络传输框架,现在先来学习HTTP协议。
推荐博文:https://www.cnblogs.com/whgk/p/6130882.html
应用层
直接为用户使用的应用进程,通俗的来说就是程序员写的一个个解决实际问题的网络程序、APP。
协议
协议就是一种约定吧,双方或者多方达成统一的共识。就像接口的存在意义。
因为应用层是程序员实现的程序,所以这个应用层协议也应该是程序员自己定的,但其实不用这么麻烦,已经存在的协议,譬如HTTP协议、HTTPS协议、FTP协议、DNS协议、SSH协议等,好用又方便。
接下来就了解一下HTTP超文本传输协议。
HTTP协议
是一种基于TCP的应用层协议,也是目前为止最为流行的应用层协议之一,可以说HTTP协议是万维网的基石。历经了0.9、HTTP/1.0、HTTP/1.1、HTTP/2几个版本。
首先需要明白HTTP是一种客户端请求、服务器应答式的应用层传输协议,也就是说服务器端是不可能主动向客户端发送数据的,如果服务器能主动向客户端发送数据那这个世界就乱套了,同时还说明了在网络正常的情况下请求和响应都是一一对应的。
1.请求报文
客户端—>服务器
1.第一行:方法(POST、GET等)+URL+协议版本号
eg:GET http://www.baidu.com/s HTTP/1.1
2.协议头部 header:每一行都是一对属性键值对(下面介绍),用":"分隔
3.空行 :标志协议报头结束
4.正文 body :通常情况下GET方法对应的请求没有body,
POST方法对应请求有body。键值对用"&"分隔,和URL格式一样。
具体和哪个协议格式一样,还要看协议头部中的Content-Type。
GET /admin_ui/rdx/core/images/close.png HTTP/1.1
Accept: */*
Referer: http://xxx.xxx.xxx.xxx/menu/neo
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: xxx.xxx.xxx.xxx
Connection: Keep-Alive
Cookie: startupapp=neo; is_cisco_platform=0; rdx_pagination_size=250%20Per%20Page; SESSID=deb31b8eb9ca68a514cf55777744e339
1.1 URL
首先我们认识一下URL,它并不陌生,其实就是我们俗称的“网址”
URL组成:
协议方案名+登陆信息+服务器地址+服务器端口号
+带层次的文件路径+查询字符串(wd= 查询关键字)+片段标识
-
http:/ /www.baidu.com/java/java-tutorial.html
协议名:https: //
服务器地址(域名):www.baidu.com/s
通过域名能知道IP地址,IP地址也能查到域名。
带层次的文件路径:/java/java-tutorial.html -
http: //tieba.baidu.com /f? kw=java&fr=ala0&tpl=5
查询字符串: kw=java
URL中包含了很多信息,那些符号也都表示着特殊含义,但我们搜索的内容如果有这些字符怎么办?那就需要转义操作,我们需要了解那些转义规则。
规则:
将转码的字符转化为16进制,从右向左,取四位,每两位做一位,前面加%,格式:%XY
参数格式:键值对用"=“分隔,用”&"分隔。用decode解译。
1.2 HTTP常见方法
-
GET—获取资源
意思是获取URL指定的资源,这个请求方式是最简单的也是最常用的。使用GET 方法时,可以将请求参数和对应的值附加在 URI 后面,利用一个问号(“?”)将资源的URI和请求参数隔开,参数之间使用与符号(“&”)隔开,因此传递参数长度也受到了限制,而且与隐私相关的信息也直接暴露在URI中。不安全,会暴露信息。 -
POST—传输实体主体
一般用提交信息或数据,请求服务器进行处理(例如提交表单或者上传文件)。表单使用POST相对GET来说还是比较隐秘的,而且GET的URL有长度限制,而上传大文件就必须要使用POST了。 -
PUT—传输文件
-
HEAD—获得报文首部
-
DELETE—删除文件
-
LINK—建立和资源之间的练习
-
UNLIKE—断开联系关系
-
OPTION—询问支持的方法
-
CONNECT—要求用隧道协议连接代理
GET和POST区别?
用户自定义的数据是放在URL(GET)里面还是body(POST)里面(键值对结构)。
剩下实现功能都一样。
2.响应报文
服务器—>客户端
1.首行:协议版本号 状态码 状态码描述信息
eg: HTTP/1.1 200 OK
2.协议头部 header部分 :每一行都是一对键值对,用":"分隔
3.空行 :标志协议头结束
4.正文 body :HTML格式数据
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xacbbb9d800005133
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html
Cxy_all: baidu+f8b5e5b521b3644ef7f3455ea441c5d0
Date: Fri, 12 Oct 2018 06:36:28 GMT
Expires: Fri, 12 Oct 2018 06:36:26 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1433_21112_18560_26350_27245_22158; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
<!DOCTYPE html>
<!--STATUS OK-->
2.1 HTTP状态码
-
1**—信息性状态码—接收的请求正在处理
-
2**—成功状态码—请求正常处理完毕
-
3**—重定向状态码—需要进行附加操作以完成(类比呼叫转移)
报文最底端有Location,表示原地址。
永久性、暂时性。
-
4**—客户端错误状态码—服务器无法处理请求
-
5**—服务器错误状态码—服务器处理请求出错
200:客户端请求成功。
302:重定向。
400:请求语法错误,服务器无法理解。
403:无权限,服务器收到请求,但拒绝提供服务。
404:Not Found请求资源不存在。
418:teapot 彩蛋
500:服务器内部错误。
502:bad gateway 某服务器可能挂了
503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。
504:Gateway Timeout上层服务器没有及时响应请求
3. HTTP头部属性字段
-
Contect-Type—数据类型(text、html等)
-
Content-Length—body长度
防止少读多读正文部分。
-
Host—客户端告诉服务器资源所在的主机端口
-
User-Agent—声明用户的操作系统和浏览器的版本信息
-
referer—当前页面所跳转过来的页面(用于获取从哪个浏览器跳转)
避免运营商劫持,可以HTTPS加密,防止修改报文。
-
location—搭配3**状态码使用,告诉客户端接下来访问哪里
location+接下来访问的地址链接
-
Cookie(字符串)—通常用于会话功能
字段包含用户的身份标识信息,每个域名保存一份,有些浏览器上限4k。
4. 分享几个抓包工具
- Hping
Hping是最受欢迎和免费的抓包工具之一。可用于各种平台。它允许你修改和发送自定义的ICMP,UDP,TCP和原始IP数据包。此工具由网络管理员用于防火墙和网络的安全审计和测试。 - Ostinato
可以轻松地修改任何协议的任何字段。是一个开源和跨平台网络包生成器和分析工具,可用于各种平台。 - Colasoft Packet Builder
是一个用于创建和编辑网络数据包的免费工具。如果你是网络管理员,你可以使用此工具来测试你的网络。它适用于所有可用版本的Windows操作系统。 - Netcat
是一个流行的工具,可以在TCP或UDP网络中读取和写入数据。它可以创建几乎所有种类的网络连接与端口绑定。这个工具最初被称为Hobbit。 - epb – Ethernet Packet Bombardier
也是一个类似的工具。它允许你发送自定义的以太网包。此工具不提供任何GUI,但它是易于使用。 - fiddler
fildder 是位于客户端和服务器端的http代理,也是目前最常用的http抓包工具,它能记录客户端和服务器之间的所有的http请求,可以针对特定的http请求,分析请求数据,设置断点,调试web应用,修改请求的数据,甚至可以修改服务器返回的数据,既然是代理,也就是说,客户端所有的请求都要先经过fiddler,然后转发给相应的服务器,反之服务器所有的响应,也会先通过fildder然后转发给客户端。
要查看HTTP的报文内容,建议用fiddler抓包比较方便清晰。