一、TCP、HTTP网络协议
1.TCP协议
TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。
TCP的特点有:
- TCP是面向连接的运输层协议
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
- TCP提供可靠交付的服务
- TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
- 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。
TCP帧格式:
TCP的三次握手:
2.HTTP协议
HTTP,全称为 HyperText Transfer Protocol,即为超文本传输协议。是互联网应用最为广泛的一种网络协议,所有的 www 文件都必须遵守这个标准。
HTTP 特性:
- HTTP 是无连接无状态的HTTP 一般构建于 TCP/IP 协议之上,默认端口号是 80
- HTTP 可以分为两个部分,即请求和响应。
HTTP 请求:
HTTP 定义了在与服务器交互的不同方式,最常用的方法有 4 种,分别是 GET,POST,PUT, DELETE。URL 全称为资源描述符,可以这么认为:一个 URL 地址,对应着一个网络上的资源,而 HTTP 中的 GET,POST,PUT,DELETE 就对应着对这个资源的查询,修改,增添,删除4个操作。
HTTP 请求由 3 个部分构成,分别是:状态行,请求头(Request Header),请求正文。
GET 请求报文实例:
- 状态行由请求方式,路径、协议等构成,各元素之间以空格分隔。对应到图中即为 GET、/books/?sex=man&name=Professional、 HTTP/1.1
- 请求头提供一些参数比如:Cookie,用户代理信息,主机名等等。(图中即从第二行到最后一行)
- 请求正文就放一些发送的数据,一般 GET 请求会将参数放在 URL 中,也就是在请求头中而请求正文一般为空,而 POST 请求将参数放在请求正文中。请求正文可以传一些 json 数据或者字符串等等。
GET 一般用于信息获取,比如刚才我们浏览百度首页,其使用的就是GET方法。
GET 请求一般不会产生副作用,它仅仅只是获取资源信息,就像数据库查询一样,不会修改、增加数据,不会影响资源的状态,并且对同一个 URL 的多次GET请求应该返回相同的结果。
而 POST 请求表示可能会修改服务器上的资源。
GET 请求和 POST 请求的区别:
(1)GET 和 POST 请求参数位置不同,从上面两个请求报文可以看出,GET 请求对应的参数放在 URL 中,而 POST 请求对应的参数放在 HTTP 请求主体中。(但是这只是一种约定,GET 请求中出现 Body 也是被允许的)
(2)虽然 HTTP 协议的 RFC规范 并没有详细规定 URL 的最大字符长度限制,但实际上,在浏览器或者服务器中总会存在限制的,这就导致了 GET 请求中参数数量是有限的。
(3) 处于安全考虑,在一些涉及安全的请求比如:登录请求需要用 POST 提交表单,而GET 请求一般用来获取静态资源。
(4)GET 请求可以被缓存,可以被收藏为书签,但 POST 可以被缓存,但不能被收藏为书签。
(5)GET 请求的参数在 URL 中,因此绝不能用 GET 请求传输敏感数据。POST 请求数据则写在 HTTP 的请求头中,安全性略高于 GET 请求。
HTTP 响应:
HTTP 响应是服务器在客户端发送 HTTP 请求后经过一些处理而做出的响应,HTTP 响应和 HTTP 请求相似,也是由三个部分构成。分别是:状态行,响应头(Response Header),响应正文。
下面是一个 HTTP 响应的例子:
HTTP 响应中包含一个状态码,用来表示服务器对客户端响应的结果。
状态码一般由3位构成:
- 1xx : 表示请求已经接受了,继续处理。
- 2xx : 表示请求已经处理掉了。
- 3xx : 重定向。
- 4xx : 一般表示客户端有错误,请求无法实现。
- 5xx : 一般为服务器端的错误。
比如常见的状态码:
- 200 OK 客户端请求成功。
- 301 Moved Permanently 请求永久重定向。
- 302 Moved Temporarily 请求临时重定向。
- 304 Not Modified 文件未修改,可以直接使用缓存的文件。
- 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized 请求未经授权,无法访问。
- 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。
- 404 Not Found 请求的资源不存在,比如输入了错误的URL。
- 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
- 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
知道了 HTTP 请求和响应后,一个完整的流程一般是这样的:
通常,由 HTTP 客户端发起一个请求,建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
二、wireshark抓包实验
wireshark官网下载
安装的时候一直选next就好了。
1.基本界面
主界面:
选择自己网络的接口:
在显示过滤器里我输入了http,所以封包列表里只有http协议相关的封包:
2.TCP的三次握手协议
TCP帧格式:
TCP的三次握手:
确定使用的协议,使用HTTP服务。我选择https://www.blibili.com作为目标地址。
先在浏览器打开这个网址,打开命令提示符,通过ping指令查看一个目标网址的IP地址(ping www.bilibili.com
)来查看目标IP地址。
在显示过滤器中填入过滤条件:tcp and ip.addr== 223.85.58.73
,过滤结果如下:
当前数据包的数据部分:
TCP三次握手:
第一次握手数据包:客户端发送一个TCP,标志位为SYN,序列号为3783977701,确认号为0, 代表客户端请求建立连接,如下图所示(第一条):
第二次握手的数据包:服务器发回确认包, 标志位为 SYN,ACK。确认号标志位为1,将确认号(Acknowledgement Number(raw)))设置为第一次握手时的序列号加1.即3783977701+1=3783977702,序列号为88329463,如下图所示(第二条):
第三次握手的数据包:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方。序列号:3783977702,确认号:88329464。在进过三次握手后和服务器建立了TCP连接,如下图所示(第三条):
三、fiddler抓包
官网下载:fiddler下载
安装时默认就好(可以改改安装路径)。
默认状态下的fiddler是不能解密https协议的请求内容的,想要用fiddler抓到浏览器访问的https接口,需要在fiddler下更改设置。
1.更改设置
点击Tools,选择Options:
点击Options之后会出来一个小窗口,选择https项,然后把红框里的两个单选框都选上(如果你要监听的程序访问的 HTTPS 站点使用的是不可信的证书,则请接着把下面的 “Ignore servercertificate errors” 勾选上。),点击ok就行了,这时系统会提示你这个软件要请求根权限,一直选同意就行了(配置完后要重启fiddler):
2.抓包
重新进入fiddler,点击左下角的Capturing。到浏览器打开一个网页,fiddler的会话会更新(如果没更新就再点左下角)
四、总结
通过wireshark可以清楚的了解到TCP的三次握手协议,让我对网络协议有了一个更深的了解。fiddler能对https进行解密,能看到网页的数据内容
参考资料
https://zhuanlan.zhihu.com/p/24913080
https://blog.csdn.net/fortune_cookie/article/details/89632006
https://blog.csdn.net/ychgyyn/article/details/82154433