tcp协议学习:wireshark分析tcp协议(一)三次握手【理论 + 实操】
前面我们对TCP协议进行分析时,我们知道了在TCP/IP具有四层结构,其中各层对应的协议如下
- 应用层——HTTP、FTP、SNMP等协议
- 传输控制层——TCP / UDP协议
- 网络层——IP协议
- 数据链路层
其中HTTP协议就是典型的应用层的协议。
也就是说HTTP是站在应用的角度,为应用程序提供服务的。
下面我们对HTTP协议进行学习。
什么是HTTP?
HTTP全称是Hyper Text Tranfer Protocol(超文本传输协议)的缩写,其定义了浏览器和服务器之间的请求和
响应的格式与规则,是网络可靠交互文件的基础
HTTP操作过程
整体上,分为以下步骤
- 用户输入地址
- 解析地址
- 建立TCP连接
- 发送请求
- 响应请求
- 释放TCP连接
大致工作流程如下

以访问我们学校中的页面为例
建立TCP连接——三次握手

建立完成后,发送HTTP请求——GET login.html

因为当前系统的默认页面为login,因此通过
GET获取login页面
服务器响应HTTP请求
服务器在接受到GET请求后,发送ACK包后,响应HTTP请求

因为服务器之前已经响应发送过页面了,因此这里的状态码为
304——重定向直接使用缓存页面
释放TCP连接

浏览器渲染页面……
HTTP特点
在经过上述的实例演示HTTP操作过程,或许我们可以总结HTTP的工作特点
无连接
我们发现在建立TCP连接,发送HTTP请求后,服务器响应我们的请求之后,就释放了TCP连接
也就是说,每次连接只处理一个请求
优点——节省传输时间,实现简单
缺点——占用资源不释放
无状态
我们连续请求两次验证码,得到了下面的两个图


我们发现,浏览器在短时间内响应了两次,且这两次之间没有什么关系,基本请求相同
服务器并不会保留之前的一切请求或者响应报文信息
优点——更快地处理大量的事物,确保协议的可伸缩性
缺点——后续处理需要前面的信息,必须重传,导致每次连接数据量大
针对上述HTTP特点存在的缺点,有以下两种保持HTTP连接状态的技术:
- cookie
- session
cookie——客户端保持状态
cookie就是服务器给客户端发送一段特殊的信息,这些信息以文本文件的形式存放在客户端,每次发送HTTP请求时都带上这样的特殊信息,这样就能实现 客户端的保持状态
例如,在很多网站的登录页面都有 请记住我的选项,在勾选后就不需要再进行重复的登录工作了
session——服务器保持状态
session意为“会话”,客户端与服务器之间的一系列交互都称作session
也就是说,客户端在发送HTTP请求后,服务端会创建一个session,并将本session id发送给客户端
下一次客户端再次发送请求后,带上这个session id,
服务器根据其找到对应的session,从而再次使用
HTTP协议组成结构
在浅层了解HTTP协议的工作流程与特点后,现在我们深入对HTTP请求协议进行分析学习
HTTP是面向文本的,因此报文中的每个字段都是一些ASCII码串,并且每个字段长短不确定,有以下两类报文:
- 请求报文
- 响应报文
请求报文
请求报文分为四个部分
- 请求行
- 请求头
- 空行
- 请求正文
请求行
请求行包括三部分HTTP方法、URL和版本号
HTTP常用方法
| 方法 | 意义 | 用途 |
|---|---|---|
| GET | 请求读取URL标识信息 | 访问资源 |
| POST | 给服务器添加信息 | 提交表单等数据信息 |
分析下列真实的请求行

- 方法——GET
- URL——/query/sortLabel
- 版本——HTTP/1.1

请求头
使用fiddler进行分析。
这部分分为多行,每一行都是键值对,通过: 空格来分割

空行
请求头的结束标志
响应报文
响应报文分为四个部分
- 状态行
- 响应头
- 空行
- 响应正文
状态行
状态行可分为版本号、状态码和状态码描述
HTTP1.1状态码分类
| 状态码 | 类别 | 意义 |
|---|---|---|
| 1xx | 信息类 | 接受的请求正在处理 |
| 2xx | 成功类 | 成功处理请求的状态码 例如:200,成功处理请求 |
| 3xx | 重定向 | 表示要完成请求,需要进一步操作 例如: 301,永久性重定向,分配新的url 302,临时性重定向,临时被分配新的url 303,资源存在另一个URL中,用GET方法获取资源 304,未修改,请求房爷未修改过,不返回网页内容 |
| 4xx | 客户端错误 | 表示请求可能出错 例如: 400,请求参数错误,服务器不理解请求语法 401,请求需要通过HTTP验证 403,服务器拒绝请求 404,服务器找不到请求的网页 |
| 5xx | 服务器错误 | 服务器在尝试处理请求时发生内部错误 例如: 500,服务器遇到错误,无法完成请求 503,服务器处于挺急或超负载,无法处理请求 |
响应头
通常为键值对结构,通过: 空格分割
以下是真实响应头

空行
响应头的结束标志
响应正文
服务器返回的具体数据,常见格式为JSON
例如: