TCP 协议的连接与断开
TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。
下图是一个 TCP 包头的结构,这部分主要分析 TCP 协议的三次握手连接和四次握手断开,着重注意 ACK 、 SYN 、FIN:
- URG:紧急指针字段有效
- ACK:确认序号字段有效
- PSH:接收方需尽快把该报文段交给应用层
- RST:重置连接
- SYN:同步序号,用于发起一个连接
- FIN:发送端完成发送任务
握手连接
- 第一次握手:客户 → 服务器(ACK = 0 ,SYN = 1)
- 第二次握手:服务器 → 客户(ACK = 1 ,SYN = 1)
- 第三次握手:客户 → 服务器(ACK = 1 ,SYN = 0)
握手断开
- 第一次握手:客户 → 服务器(ACK = 1 ,FIN = 1)
- 第二次握手:服务器 → 客户(ACK = 1 ,FIN = 0)
- 第三次握手:服务器 → 客户(ACK = 1 ,FIN = 1)
- 第四次握手:客户 → 服务器(ACK = 1 ,FIN = 0)
有时候断开连接时,只抓得到三个包,是因为第二次、第三次握手放在同一个包里了,合并成一次握手了。
连接建立
TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake),过程如下图所示。
连接断开
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示。
Fiddler 抓 HTTPS 网站包
HTTP 协议简介
TCP 协议是 HTTP 协议的基石——HTTP 协议需要依靠 TCP 协议来传输数据。在网络分层模型中,TCP 被称为 “传输层协议”,而 HTTP 被称为 “应用层协议”。
HTTP 对 TCP 连接的使用,分为两种方式:俗称 “短连接” 和“长连接”(“长连接”又称 “持久连接”,洋文叫做“Keep-Alive” 或“Persistent Connection”) 假设有一个网页,里面包含好多图片,还包含好多外部的CSS 文件和 JS 文件。在 “短连接” 的模式下,浏览器会先发起一个 TCP 连接,拿到该网页的 HTML 源代码(拿到 HTML 之后,这个 TCP 连接就关闭了)。然后,浏览器开始分析这个网页的源码,知道这个页面包含很多外部资源(图片、CSS、JS)。
然后针对每一个外部资源,再分别发起一个个 TCP 连接,把这些文件获取到本地(同样的,每抓取一个外部资源后,相应的 TCP 就断开) 相反,如果是 “长连接” 的方式,浏览器也会先发起一个 TCP 连接去抓取页面。但是抓取页面之后,该 TCP 连接并不会立即关闭,而是暂时先保持着(所谓的“Keep-Alive”)。然后浏览器分析 HTML 源码之后,发现有很多外部资源,就用刚才那个 TCP 连接去抓取此页面的外部资源。
抓包
Fiddler 抓取的内容以及 HTTPS 协议执行的过程:
- 打开了 fiddler 软件,使用浏览器访问百度:www.baidu.com
- 然后再看看 fiddler 软件,这就是抓到的包。HTTP就是向百度服务器发送请求。
- Header 标签——用于显示 HTTP 请求和响应的头信息。
- TextView 标签——用于查看 HTML/JS/CSS 等格式的数据。
- ImageView 标签——用于显示图片格式的数据。
- WebForms 标签——用于显示请求的表单数据。如登录请求,就可以通过它查查看登录用户名密码信息。它以表格形式显示。
- Raw 标签——可以查看原始的符合 HTTP 标准的请求和响应头。
- Auth 标签——可以查看授权 Proxy-Authorization 和 Authorization 的相关信息。
- Cookies 标签——可以看到请求的 cookie 和响应的 set-cookie 头信息。
XML 和 JSON 标签——用于显示 XML 和 JSON 格式的数据。
这里可以看到采用的连接方式保持的是长连接:
下图中是百度服务器返回给edge浏览器的图片、JS、CSS、文本文件等等。(可能设置问题,抓不了谷歌的)